如何使用python实现wave音频文件回放
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用python实现wave音频文件回放相关的知识,希望对你有一定的参考价值。
参考技术A 修改采样点数和起始位置进行不同位置和长度的音频波形分析N=44100
start=0 #开始采样位置
df = framerate/(N-1) # 分辨率
freq = [df*n for n in range(0,N)] #N个元素
wave_data2=wave_data[0][start:start+N]
c=numpy.fft.fft(wave_data2)*2/N
#常规显示采样频率一半的频谱
d=int(len(c)/2)
#仅显示频率在4000以下的频谱
while freq[d]>4000:
d-=10
pylab.plot(freq[:d-1],abs(c[:d-1]),'r')
pylab.show()本回答被提问者采纳
如何编写多频音频文件?
【中文标题】如何编写多频音频文件?【英文标题】:How do I write a multi-frequency audio file? 【发布时间】:2013-03-12 22:55:41 【问题描述】:我正在尝试使用 440hz 到 600hz 的音调编写音频文件。该文件应从 440hz 开始,然后播放每个频率(按递增顺序)1 秒,以 600hz 结束。我想出了python的wave模块,但是在这里做错了,因为我最终得到了一个没有声音的文件。 (如果有人有更好的建议,我真的不在乎它是否在 python 中。我使用的是 Linux,任何可以在该平台上运行的东西都可以。我只需要创建一个具有上述规格的音频文件。谢谢!)
frequencies = range(440,600)
data_size = len(frequencies)
fname = "WaveTest.wav"
frate = 11025.0 # framerate as a float
amp = 64000.0 # multiplier for amplitude
sine_list_x = []
for f in frequencies:
for x in range(data_size):
sine_list_x.append(math.sin(2*math.pi*f*(x/frate)))
wav_file = wave.open(fname, "w")
nchannels = 1
sampwidth = 2
framerate = int(frate)
nframes = data_size
comptype = "NONE"
compname = "not compressed"
wav_file.setparams((nchannels, sampwidth, framerate, nframes,
comptype, compname))
for s in sine_list_x:
# write the audio frames to file
wav_file.writeframes(struct.pack('h', int(s*amp/2)))
wav_file.close()
【问题讨论】:
【参考方案1】:这样的事情应该可以工作:希望它至少是你继续的一个好的起点。
import numpy as N
import wave
towrite = ''
for freq in xrange(440,600):
duration = 1
samplerate = 44100
samples = duration*samplerate
period = samplerate / float(freq) # in sample points
omega = N.pi * 2 / period
xaxis = N.arange(samples,dtype = N.float)
ydata = 16384 * N.sin(xaxis*omega)
signal = N.resize(ydata, (samples,))
towrite += ''.join([wave.struct.pack('h',s) for s in signal])
f = wave.open('freqs.wav', 'wb')
f.setparams((1,2,44100, 44100*4, 'NONE', 'noncompressed'))
f.writeframes(towrite)
f.close()
Reference
【讨论】:
【参考方案2】:在 Windows 平台上似乎对我来说效果很好:
采样得到尊重,频率恰到好处(从 440 到 600 Hz)。 但是,在您的代码中,频率不会停留一秒钟,而是停留在 len(frequencies)/frate-th of second。如果您希望每个频率都有一整秒,data_size 应该等于 frate。
import math
import wave
import struct
frequencies = range(440,600)
duration = 1 #in second
fname = "WaveTest.wav"
frate = 11025.0 # framerate as a float
amp = 64000.0 # multiplier for amplitude
sine_list_x = []
for f in frequencies:
for x in range(duration*frate) :
sine_list_x.append(math.sin(2*math.pi*f*(x/frate)))
wav_file = wave.open(fname, "w")
nchannels = 1
sampwidth = 2
framerate = int(frate)
nframes = data_size
comptype = "NONE"
compname = "not compressed"
wav_file.setparams((nchannels, sampwidth, framerate, nframes,
comptype, compname))
for s in sine_list_x:
# write the audio frames to file
wav_file.writeframes(struct.pack('h', int(s*amp/2)))
wav_file.close()
【讨论】:
以上是关于如何使用python实现wave音频文件回放的主要内容,如果未能解决你的问题,请参考以下文章
Python 从零开始制作自己的声音 - wave模块读写wav文件详解
WAV 文件 (.wav) 和 WAVE 音频文件 (.wave) 有啥区别?