如何在python中保存修剪后的波形文件?

Posted

技术标签:

【中文标题】如何在python中保存修剪后的波形文件?【英文标题】:How to save trimmed wave file in python? 【发布时间】:2015-12-23 21:11:29 【问题描述】:

我正在尝试记录麦克风输入,执行一些终结算法来终结语音并仅保存带有语音的新波形文件。

我设法保存了一个文件,但是当我播放录音时,它播放了一半的语音序列。

1) 数组应该采用什么格式才能成功保存?

2) 如何将其转换为该格式?

我正在使用以下算法进行麦克风录音,但错误在于我保存文件的方式:

如果我调用 writeframes(frames),它可以很好地保存完整的 3 秒麦克风输入。

FORMAT = pyaudio.paInt16                # We use 16bit format per sample
CHANNELS = 1
RATE = 44100
CHUNK = 1024                            # 1024bytes of data red from a buffer
RECORD_SECONDS = 3
WAVE_OUTPUT_FILENAME = "file.wav"

audio = pyaudio.PyAudio()

# start Recording
stream = audio.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE, input=True,
                    frames_per_buffer=CHUNK)

print "recording..."
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)
print "finished recording"
# stop Recordings
stream.stop_stream()
stream.close()
audio.terminate()

frames = ''.join(frames)

# important! convert from string to int
amplitudeSamples = np.fromstring(frames, np.int16)

# Perform endpointing algorithm where I compute start and end indexes 
# within amplitudeSamples array

voiceSample = amplitudeSamples[start:end]

# Here lies the problem
waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
waveFile.setnchannels(1)
waveFile.setsampwidth(2)
waveFile.setframerate(RATE)
waveFile.writeframes(voiceSample) 
#waveFile.writeframesraw(voiceSample) # doesn't work also
waveFile.close()

【问题讨论】:

您确定检查 start 和 end 的算法正常工作吗? 是的,我已经绘制了幅值样本和开始和结束索引的垂直边缘,它们非常适合。 setnchannels 和 setsampwidth 调用中的参数呢?他们是正确的吗? 我用 1 个通道录制,setsampwidth 我猜是 2,因为我用 paInt16 录制,它是 2byte。 【参考方案1】:

在写入之前将 numpy 数组转换为字符串:

wavFile.writeframes(voiceSample.tostring())

【讨论】:

也可以使用 soundfile.write('bla.wav', voiceSignal, 44100) 使用 soundfilde 库 另见 pypi 上的“wavio”。

以上是关于如何在python中保存修剪后的波形文件?的主要内容,如果未能解决你的问题,请参考以下文章

语音识别中如何查看加窗分帧后的波形图

modelsim 中如何加载多个对比波形文件

vivodo仿真文件出现在nonmodule files仿真波形全是红色和蓝色线,怎么办?

从波形文件python读取字节

如何保存同时播放两个曲目的wav文件?在不同的体积

python 问题。。。 对一个波形文件做fft,然后怎么获取那些频率分量? numpy有这个函数