如何在使用 python 播放时更改 stem 文件的音量

How to change volume of stem files while playing using python

我正在尝试编写一个 python 项目,同时播放一首歌曲的多个部分。

关于背景信息,一首歌曲被分成“词干”,然后同时播放每个词干以重新创作整首歌曲。我想要实现的是使用电位器来控制每个主干的音量,以便用户可以以不同的方式混合歌曲。对于产品关系,Kanye West 的 StemPlayer 是我想要实现的目标。

我可以在最后改变叠加歌曲的音量,但我想做的是在歌曲播放时使用电位器改变每个主干的音量。这甚至可以使用 pyDub 吗?下面是我现在的代码。

from pydub import AudioSegment
from pydub.playback import play

vocals = AudioSegment.from_file("walkin_vocals.mp3")
drums = AudioSegment.from_file("walkin_drums.mp3")
bass = AudioSegment.from_file("walkin_bass.mp3")

vocalsDrums = vocals.overlay(drums) 
bassVocalsDrums = vocalsDrums.overlay(bass)

songQuiet = bassVocalsDrums - 20

play(songQuiet)

解决了这个问题,我最终使用了 pyaudio 而不是 pydub。 使用 pyaudio,我能够定义自定义 stream_callback 函数。在这个回调函数中,我将每个词干乘以一个修饰符,然后将每个词干添加到一个音频输出。

def callback(in_data, frame_count, time_info, status):
    global drumsMod, vocalsMod, bassMod, otherMod
    drums = drumsWF.readframes(frame_count)
    vocals = vocalsWF.readframes(frame_count)
    bass = bassWF.readframes(frame_count)
    other = otherWF.readframes(frame_count)
    decodedDrums = numpy.frombuffer(drums, numpy.int16)
    decodedVocals = numpy.frombuffer(vocals, numpy.int16)
    decodedBass = numpy.frombuffer(bass, numpy.int16)
    decodedOther = numpy.frombuffer(other, numpy.int16)
    
    newdata = (decodedDrums*drumsMod + decodedVocals*vocalsMod + decodedBass*bassMod + decodedOther*otherMod).astype(numpy.int16)
    return (newdata.tobytes(), pyaudio.paContinue)