从队列播放 pydub



我正在为我的程序处理音频处理,需要实现一个简单的监视器播放。

要做"实时"处理所有pydub。音频片段在发送到机器之前被切成 20ms 的块。 最后,段发送到一个简单的deque,该有争议地填充了 20 毫秒pydub.AudioSegment直到它有 300 毫秒的价值。

@tasks.loop(seconds=0.01)
async def fill(self):
if source is None:
print("NOPE")
return
if len(deque) < size:
try:
segment = next(self.source.audio_segment_generator
deque.append(segment)
except StopIteration:
print("source depleted")

deque正在弹出到一个需要 20 毫秒音频值字节的不和谐机器人。

一切都完美无缺,但是我还需要一个简单的本地播放,如果需要,可以直接向扬声器播放音频。

像这样: 还假设它在自己的线程上运行:

from pydub.playback import play
def play_from_deque(deque):
while True:
if is_playing_monitor: 
play(deque.pop())

我写了一个快速简单的测试,看看pydub.play()可以在 20ms 段上重复调用:

mp3 = requests.get("http://www.hochmuth.com/mp3/Haydn_Adagio.mp3")
segment = AudioSegment.from_file(io.BytesIO(mp3.content), format='mp3').set_frame_rate(40800)
sliced_segments = segment[::20]
for slice in sliced_segments:
play(slice)

但是音频变得非常断断续续,几乎无法辨认。

经过一些谷歌搜索,有人提到了import sounddevice as sd,但到目前为止,我还没有能够让它工作。 可以使用segment.raw_data访问原始字节,因此也可以从字节播放音频。

我应该研究任何技巧或 python 库?

我自己想通了,如果有人有类似的问题,这里是代码:

我让它与:

import io
import requests
import pyaudio
from pydub import AudioSegment
mp3 = requests.get("http://www.hochmuth.com/mp3/Haydn_Adagio.mp3")
segment = AudioSegment.from_file(io.BytesIO(mp3.content), format='mp3').set_frame_rate(40800)
sliced_segments = segment[::20]
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(segment.sample_width),
channels=segment.channels,
rate=segment.frame_rate,
output=True)
while True:
try:
for slice in sliced_segments:
stream.write(slice.raw_data)
finally:
stream.stop_stream()
stream.close()
p.terminate()

最新更新