按毫秒读取Python中的wav文件

0 投票
1 回答
859 浏览
提问于 2025-04-18 07:28

我需要从wav音频文件中剪切出小片段(音素),每个片段大约0.1秒(比如说从0.3698125秒到0.466125秒)。

我正在使用wave模块,但它处理不了这个问题 :-/ 有人知道该怎么做吗?

这个脚本应该打开文件,剪切出那段音频,然后把它添加到一个新的文件里。

data = fonemy[fonem][0] = start, end, path ([0.3698125, 0.466125, u'hds/data/speech_16kHz/utt001.wav'])

frames = ""
text   = "hello"     
for fonem in text:
    data = fonemy[fonem][0]
    win = wave.open(data[2], 'rb')
    wout = wave.open('segment.wav', 'wb')
    wout.setparams(win.getparams())
    t0 = data[0]
    t1= data[1]
    s0, s1= int(t0*win.getframerate()), int(t1*win.getframerate())
    win.readframes(s0) # discard
    frames = frames + win.readframes(s1-s0)

wout.writeframes(frames)

1 个回答

0

你说的“它处理不了”是什么意思还不太清楚,不过这里有一个问题,就是你试图用一个float(浮点数)来读取音频帧,但其实你只能读取整数个帧。

>>> w = wave.open("/Users/bgporter/Documents/Juce Demo Audio Recording.wav", "rb")
>>> rate = w.getframerate()
>>> frames = 0.3698125 * rate
>>> w.readframes(frames)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wave.py", line 253, in readframes
    data = self._data_chunk.read(nframes * self._framesize)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/chunk.py", line 134, in read
    data = self.file.read(size)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/chunk.py", line 134, in read
    data = self.file.read(size)
TypeError: integer argument expected, got float

读取音频样本的一部分是没有意义的。你需要弄清楚你是想要多一个帧的数据还是少一个帧的数据,然后根据情况把这个数字四舍五入到下一个更高或更低的帧数。

>>> data = w.readframes(int(frames))
>>> len(data)
32616

撰写回答