gpt4 book ai didi

python - 如何使用 pyaudio 反转音频

转载 作者:行者123 更新时间:2023-11-28 21:57:19 28 4
gpt4 key购买 nike

我一直在修补 pyaudio一段时间以来,尝试反转一个简单的 wave 文件但没有成功。

在(我的)理论中,我只需要使用 pyaudio 的每个回调(1024 帧)从文件的结尾到开头进行迭代,从文件中的相应索引中获取音频数据,反转生成的字符串并播放它。

这是我的代码(只有 pyaudio 回调和文件处理,其余部分未从示例代码中触及):

import pyaudio
import wave
import time
import sys

if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)


index = 40*1024
wf = wave.open(sys.argv[1], 'rb')
wf.setpos(index)
p = pyaudio.PyAudio()


def callback(in_data, frame_count, time_info, status):
global index
data = wf.readframes(frame_count)
data = data[::-1]
index-=1024
wf.setpos(index)

return (data, pyaudio.paContinue)

stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True,
stream_callback=callback)


stream.start_stream()

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

stream.stop_stream()
stream.close()
wf.close()

p.terminate()

我知道当它到达文件开头时会崩溃,但它应该播放 40 × 1024 帧的反转音频...

最佳答案

如果您要反转的文件足够小以适合内存,您最好的选择是完全加载它并反转数据,然后流式传输:

import pyaudio
import wave

wavefile_name = 'wavefile.wav'
wf = wave.open(wavefile_name, 'rb')

p = pyaudio.PyAudio()
stream = p.open(format =
p.get_format_from_width(wf.getsampwidth()),
channels = wf.getnchannels(),
rate = wf.getframerate(),
output = True)

full_data = []
data = wf.readframes(1024)

while data:
full_data.append(data)
data = wf.readframes(1024)

data = ''.join(full_data)[::-1]

for i in range(0, len(data), 1024):
stream.write(data[i:i+1024])

但是,如果文件太大而无法放入内存,您将需要某种方式来反向读取文件并将其输入声音系统。这是一个完全不同的问题,因为它涉及一些低级 I/O 编程来处理向后读取。


编辑:在看到你的完整代码后,我没有看到任何错误。代码在我的电脑上运行正常,只是在播放结束时失败。但是,您可以做两件事。首先,您可以转到波形文件的末尾以向后播放整个声音,使用以下方法:

wf = wave.open(sys.argv[1], 'rb')
index = wf.getnframes() - 1024
wf.setpos(index)

其次,您必须修改回调,使其在搜索头超出文件开头时不会失败:

def callback(in_data, frame_count, time_info, status):
global index
data = wf.readframes(frame_count)
data = data[::-1]
index-=1024
if index < 0:
return (data, pyaudio.paAbort)
else:
wf.setpos(max(index,0))
return (data, pyaudio.paContinue)

除此之外,它工作得很好。

关于python - 如何使用 pyaudio 反转音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19962413/

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