如何在使用 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)
我正在尝试编写一个 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)