在客户端,我发送一个blob音频(wav)文件。在服务器端,我试图将blob文件转换为音频wav文件。我做了以下事情:
blob = request.FILES['file']
name = "TEST.wav"
audio = wave.open(name, 'wb')
audio.setnchannels(1)
audio.writeframes(blob.read())
我认为转换blob类似于将blob图像转换为jpeg文件,但在该假设中非常不正确。那不起作用;我收到错误 - "错误:未指定样本宽度。"然后我使用setsampwidth()并在1到4之间的任意数字中抛出(在查看wave.py源文件之后......我不知道为什么字节必须在1到4之间)。之后会抛出另一个错误 - "错误:未指定采样率。"如何指定采样率?
setnchannels(),setsampwidth()方法有什么作用?有没有"容易"我从blob生成wav文件的方法吗?
答案 0 :(得分:1)
以前,我从来没有这样做过..但是,在我的测试中,下面这个脚本对我来说效果很好.. (但音频输出与原始文件不同) 强>
>>> nchannels = 2
>>> sampwidth = 2
>>> framerate = 8000
>>> nframes = 100
>>>
>>> import wave
>>>
>>> name = 'output.wav'
>>> audio = wave.open(name, 'wb')
>>> audio.setnchannels(nchannels)
>>> audio.setsampwidth(sampwidth)
>>> audio.setframerate(framerate)
>>> audio.setnframes(nframes)
>>>
>>> blob = open("original.wav").read() # such as `blob.read()`
>>> audio.writeframes(blob)
>>>
我在https://stackoverflow.com/a/3637480/6396981
找到了这个方法最后,将nchannels
和sampwidth
的值更改为1
。我得到了与原始文件相同的音频。
nchannels = 1
sampwidth = 1
framerate = 8000
nframes = 1
在 Python2 下测试,并在 Python3 上收到错误
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x95 in position 4: invalid start byte
。
答案 1 :(得分:0)
我也遇到了同样的问题。我的问题是与原始输出相比,音调输出较低。我设法使用 getnframes() 对原始音频进行逆向工程以获得 nframes、采样率 和 采样宽度, getframerate() 和 getsampwidth() 分别。最后,我设法调整了采样频率/帧速率,以某种方式带来完美的音调。
在某个偏移频率比原始调整变得完美。我的在原始采样率的十六分之一的偏移总和下工作得很好。
即
OffsetFrequency = OriginalFrequency/16
Frequency = OriginalFrequency + OffsetFrequency