我正在为我的程序处理音频处理,需要实现一个简单的监视器播放。
要做"实时"处理所有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()