gpt4 book ai didi

python - PyAudio 和分贝变化和平移

转载 作者:行者123 更新时间:2023-12-03 01:40:53 27 4
gpt4 key购买 nike

我有一个播放 wav 文件的非常基本的 pyaudio 代码。

    open_wave = wave.open("tone_silence/l0r1d0_500.wavc",'rb')

pyAudio_session = pyaudio.PyAudio()

def callback(in_data, frame_count, time_info, status):
data = open_wave.readframes(frame_count)
return (data, pyaudio.paContinue)
pyAudio_stream = pyAudio_session.open(
format = pyAudio_session.get_format_from_width(open_wave.getsampwidth()),
channels = open_wave.getnchannels(),
rate = open_wave.getframerate(),
output = True,
stream_callback=callback)

while pyAudio_stream.is_active():
time.sleep(0.1)

pyAudio_stream.stop_stream()
pyAudio_stream.close()
print("Stopped")
pyAudio_session.terminate()

我已经搜索了互联网的每个角落,以找到一种方法,以便我可以根据需要更改流的分贝级别并将立体声输出平移到特定 channel (仅左扬声器/仅右扬声器)。但我找不到任何方法。

我无法切换到 pydub(它实际上具有此功能),因为它不允许我随时关闭流;它播放完整的音频,不能突然关闭。

最佳答案

pydub没有直接停止的方法audioSegment玩,据this documentation ,它将音频分成半秒的 block ,以方便键盘中断。

因此,如果我们获取音频并运行 while looptry-except 内 block ,我们应该可以使用“Ctrl + c”中断播放

这是一个工作示例代码,根据 here 中的文档将音频平移到左声道或右声道然后使用上述逻辑在“Ctrl + c”时停止播放

from pydub import AudioSegment
from pydub.playback import play

song = AudioSegment.from_wav("music.wav")

# pan the sound 15% to the right
panned_right = song.pan(+0.15)

# pan the sound 50% to the left
panned_left = song.pan(-0.50)

#Play panned left audio
while True:
try:
play(panned_left)
except KeyboardInterrupt:
print "Stopping playing"
break

从播放循环中断后,我们会得到空闲 session 提示。您可以根据自己的需要定制。
Output:
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
Stopping playing
>>>

这使您可以轻松地使用 pydub 中的内置平移方法。以及中断播放中途的技巧。希望这可以帮助您解决问题。

EDIT-1
上述解决方案可能会遇到问题,即 while 循环将无限期地播放(如果你不打破它。)。它可能仅适用于测试。

另一种选择是使用 python multiprocess生成一个播放音频片段和 terminate的进程的模块不需要的时候。这在播放期间提供了更多控制。

这是一个例子。
from multiprocessing import Process

def play_audio(seg):
play(seg)

if __name__ == '__main__':
p = Process(target=play_audio, args=(panned_left,))
p.start()

当您需要停止音频时,只需调用 p.terminate()在IDE或程序中。
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
>>> p.terminate()
>>>

关于python - PyAudio 和分贝变化和平移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47599106/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com