以毫秒为单位读取 python 中的 wav

Posted

技术标签:

【中文标题】以毫秒为单位读取 python 中的 wav【英文标题】:Read wav in python by mili seconds 【发布时间】:2014-05-24 13:48:03 【问题描述】:

我需要从 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)

【问题讨论】:

这看起来不错,实际上。 但它无法处理是什么意思?预期的结果是什么?你会得到什么? 我需要从 0.3698125 到 0.466125 的音频样本,这个函数不起作用,它需要整数,所以样本的开头和结尾都是 0 - 它什么都不会读 你能告诉我print t0, t1, win.getframerate()返回什么吗? 一次迭代 0.3698125 0.466125 16000 - 帧率还是一样,只是时间在变 int(0.3698125*16000) == 5917。那么“样本的开始和结束是0”是什么意思 【参考方案1】:

不清楚您所说的“无法处理”是什么意思,但这里的一个问题是您尝试使用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

【讨论】:

对不起,我在尝试它是否可以采用浮点数并忘记将其重写回 int...问题是,如果我将使用 int,我需要从 0.3698125 到 0.466125 的字母 h 的精确数据, begin 和 end 是 0,所以它什么都不会削减:-/ 我不确定我是否关注你。假设采样率为 44100Hz,44100*3698125 = 16308.73 和 .466125*44100 = 20556.1125。如果你从头到尾四舍五入,你将提取 20557-16308 = 4249 帧的数据。

以上是关于以毫秒为单位读取 python 中的 wav的主要内容,如果未能解决你的问题,请参考以下文章

读取一个 k 字节块的时间(以毫秒为单位)

Realstudio (2011 4.2) 以毫秒为单位的日期

h2 中的 CURRENT_TIMESTAMP 以毫秒为单位

自Javascript中的unix时代以来,如何以毫秒为单位获取时间? [复制]

如何以毫秒为单位获取javaFX音频片段的长度[关闭]

获取Java中的当前时间(以毫秒为单位)(只是时间,而不是日期)