wavepython
1. python寫24位wave文件有什麼高效的方法
#!/usr/bin/env python
import numpy as np
import matplotlib.pyplot as plt
import scipy.signal as signal
import wave
'''
This is a wave test program
'''
def read_wave_data(file_path):
#open a wave file, and return a Wave_read object
f = wave.open(file_path,"rb")
#read the wave's format infomation,and return a tuple
params = f.getparams()
#get the info
nchannels, sampwidth, framerate, nframes = params[:4]
#Reads and returns nframes of audio, as a string of bytes.
str_data = f.readframes(nframes)
#close the stream
f.close()
#turn the wave's data to array
wave_data = np.fromstring(str_data, dtype = np.short)
#for the data is stereo,and format is LRLRLR...
#shape the array to n*2(-1 means fit the y coordinate)
wave_data.shape = -1, nchannels
#transpose the data
wave_data = wave_data.T
#calculate the time bar
time = np.arange(0, nframes) * (1.0/framerate)
return wave_data, nchannels,sampwidth,framerate
def write_wave_data(file_path, wave_data, nchannels, sampwidth,framerate):
f = wave.open(file_path,"wb")
f.setnchannels(nchannels)
f.setsampwidth(sampwidth)
f.setframerate(framerate)
f.writeframes(wave_data.tostring())
return
if __name__ == "__main__":
wave_data,nchannels,sampwidth,framerate = read_wave_data("voice_tv_door_binaural.wav")
print nchannels,sampwidth,framerate
print wave_data
print type(wave_data)
print "OK"
2. 怎樣用python畫wav文件的時頻分析圖
這是python的matplotlib里的一個畫wav文件的時頻分析(specgram)的函數。和matlab里的那個差不多。使用超級方便,自動就做好了短時傅立葉變換(short
time fourier
transform)~函數用法具體可參照http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.specgram
關於短時傅立葉變換的具體內容可google之~下面介紹程序。
#首先import各種library。wave和struct都是安裝python2.6自帶的。scipy可以在
#http://www.scipy.org/Download下載。pylab可在http://matplotlib.sourceforge.net/下載。都是非常#強大的包包啊~~
import wave
import struct
from scipy import *
from pylab import *
#讀取wav文件,我這兒讀了個自己用python寫的音階的wav
filename = '/Users/rongjin/Desktop/scale.wav'
wavefile = wave.open(filename, 'r') # open for writing
#讀取wav文件的四種信息的函數。期中numframes表示一共讀取了幾個frames,在後面要用到滴。
nchannels = wavefile.getnchannels()
sample_width = wavefile.getsampwidth()
framerate = wavefile.getframerate()
numframes = wavefile.getnframes()
#建一個y的數列,用來保存後面讀的每個frame的amplitude。
y = zeros(numframes)
#for循環,readframe(1)每次讀一個frame,取其前兩位,是左聲道的信息。右聲道就是後兩位啦。
#unpack是struct里的一個函數,用法詳見http://docs.python.org/library/struct.html。簡單說來
就是把#packed的string轉換成原來的數據,無論是什麼樣的數據都返回一個tuple。這里返回的是長度為一的一個
#tuple,所以我們取它的第零位。
for i in range(numframes):
val =
wavefile.readframes(1)
left =
val[0:2]
#right = val[2:4]
v =
struct.unpack('h', left )[0]
y[i] =
v
#framerate就是44100,文件初讀取的值。然後本程序最關鍵的一步!specgram!實在太簡單了。。。
Fs = framerate
specgram(y, NFFT=1024, Fs=Fs, noverlap=900)
show()
耶~好看的specgram就畫好了~~x軸是時間,y軸是頻率~
3. 如何使用python實現wave音頻文件回放
修改采樣點數和起始位置進行不同位置和長度的音頻波形分析
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()
4. python 播放 wav
這是python的matplotlib里的一個畫wav文件的時頻分析(specgram)的函數。和matlab里的那個差不多。使用超級方便,自動就做好了短時傅立葉變換(short
time fourier
transform)~函數用法具體可參照http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.specgram
關於短時傅立葉變換的具體內容可google之~下面介紹程序。
#首先import各種library。wave和struct都是安裝python2.6自帶的。scipy可以在
#http://www.scipy.org/Download下載。pylab可在http://matplotlib.sourceforge.net/下載。都是非常#強大的包包啊~~
import wave
import struct
from scipy import *
from pylab import *
#讀取wav文件,我這兒讀了個自己用python寫的音階的wav
filename = '/Users/rongjin/Desktop/scale.wav'
wavefile = wave.open(filename, 'r') # open for writing
#讀取wav文件的四種信息的函數。期中numframes表示一共讀取了幾個frames,在後面要用到滴。
nchannels = wavefile.getnchannels()
sample_width = wavefile.getsampwidth()
framerate = wavefile.getframerate()
numframes = wavefile.getnframes()
#建一個y的數列,用來保存後面讀的每個frame的amplitude。
y = zeros(numframes)
#for循環,readframe(1)每次讀一個frame,取其前兩位,是左聲道的信息。右聲道就是後兩位啦。
#unpack是struct里的一個函數,用法詳見http://docs.python.org/library/struct.html。簡單說來
就是把#packed的string轉換成原來的數據,無論是什麼樣的數據都返回一個tuple。這里返回的是長度為一的一個
#tuple,所以我們取它的第零位。
for i in range(numframes):
val =
wavefile.readframes(1)
left =
val[0:2]
#right = val[2:4]
v =
struct.unpack('h', left )[0]
y[i] =
v
#framerate就是44100,文件初讀取的值。然後本程序最關鍵的一步!specgram!實在太簡單了。。。
Fs = framerate
specgram(y, NFFT=1024, Fs=Fs, noverlap=900)
show()
好看的specgram就畫好了~~x軸是時間,y軸是頻率~
5. 利用python掌握雷克子波製作
# -*- coding: UTF-8 -*-
import wave
import numpy as np
import matplotlib.pyplot as plt
# 打開wav文件 ,open返回一個的是一個Wave_read類的實例,通過調用它的方法讀取WAV文件的格式和數據。
f = wave.open(r"D:\project\REC001.wav","rb")
# 讀取格式信息
# 一次性返回所有的WAV文件的格式信息,它返回的是一個組元(tuple):聲道數, 量化位數(byte單位), 采
# 樣頻率, 采樣點數, 壓縮類型, 壓縮類型的描述。wave模塊只支持非壓縮的數據,因此可以忽略最後兩個信息
params = f.getparams()
[nchannels, sampwidth, framerate, nframes] = params[:4]
# 讀取波形數據
# 讀取聲音數據,傳遞一個參數指定需要讀取的長度(以取樣點為單位)
str_data = f.readframes(nframes)
f.close()
# 將波形數據轉換成數組
# 需要根據聲道數和量化單位,將讀取的二進制數據轉換為一個可以計算的數組
wave_data = np.fromstring(str_data,dtype = np.short)
# 將wave_data數組改為2列,行數自動匹配。在修改shape的屬性時,需使得數組的總長度不變。
wave_data.shape = -1,2
# 轉置數據
wave_data = wave_data.T
# 通過取樣點數和取樣頻率計算出每個取樣的時間。
time=np.arange(0,nframes/2)/framerate
# print(params)
plt.figure(1)
# time 也是一個數組,與wave_data[0]或wave_data[1]配對形成系列點坐標
plt.subplot(211)
plt.plot(time,wave_data[0])
plt.xlabel("time/s")
plt.title('Wave')
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=np.fft.fft(wave_data2)*2/N
# 常規顯示采樣頻率一半的頻譜
plt.subplot(212)
plt.plot(freq[:round(len(freq)/2)],abs(c[:round(len(c)/2)]),'r')
plt.title('Freq')
plt.xlabel("Freq/Hz")
plt.show()
6. python wav 測頻率
#-*-coding:utf-8-*-
importwave
importpylabaspl
importnumpyasnp
#打開WAV文檔
f=wave.open(r"c:WINDOWSMediading.wav","rb")
#讀取格式信息
#(nchannels,sampwidth,framerate,nframes,comptype,compname)
params=f.getparams()
nchannels,sampwidth,framerate,nframes=params[:4]
#讀取波形數據
str_data=f.readframes(nframes)
f.close()
#將波形數據轉換為數組
wave_data=np.fromstring(str_data,dtype=np.short)
wave_data.shape=-1,2
wave_data=wave_data.T#這就是你想要的
time=np.arange(0,nframes)*(1.0/framerate)
#繪制波形
pl.subplot(211)
pl.plot(time,wave_data[0])
pl.subplot(212)
pl.plot(time,wave_data[1],c="g")
pl.xlabel("time(seconds)")
pl.show()
7. 怎樣用python生成sin wave的wave文件
以下代碼涵蓋了基本的寫wave文件需要的函數。
#"wave"mole.
#Author;EricNichols
#1-11-11
#
#codeadaptedfrom:
#
importwave#需要導入python的wavemole,函數用法參http://docs.python.org/library/wave.html
importstruct#structmole的用法參見http://docs.python.org/library/struct.html
from
mathimportsin,pi,pow
MAX_AMPLITUDE=32767#決定sinwave的音量
SAMPLE_RATE=44100#采樣頻率,由於人聽覺在20到20千赫茲,由於Nyquist定律,一般44100(大於20千
的兩倍)的頻率足夠滿足人耳,再高就浪費文件空間啦,這也是CD通常的采樣頻率。
DURATION_SEC=
3#生成wav的時間為三秒
SAMPLE_LEN=
SAMPLE_RATE*DURATION_SEC#
乘一下就是要寫多少個SAMPLE啦
filename='/Users/rongjin/Desktop/output.wav'#起個文件名哈,文件生成後就到這個文件夾找啦
print"Creatingsoundfile:",filename
print"Samplerate:",
SAMPLE_RATE
print"Duration(sec):",DURATION_SEC
print"#samples:",
SAMPLE_LEN
wavefile=wave.open(filename,'w')#
'w'寫文件,其他還有'r','rb','wb'啥的,詳情google之
wavefile.setparams((2,2,SAMPLE_RATE,0,'NONE','not
compressed'))#設置下wavefile的頭文件
samples=[]#建一個tuple用來放好幾個channel的
foriinrange(SAMPLE_LEN):
t=float(i)/
SAMPLE_RATE#t表示當下滴時間
sample=MAX_AMPLITUDE*sin(t*256*2*pi)#
就根據sinwave的方程得到當下的amplitude啦,
這里生成頻率為256的音高喲,可以隨便改。
#printi,t,sample#show
somegeneratedvalues.commentoutforspeed.
packed_sample=struct.pack('h',sample)#
轉換成16進制的string
samples.append(packed_sample)#
append到samples,作為channel1
samples.append(packed_sample)#append一個一樣的作為channel
2,要是append另一個頻率的
packed_sample_2,就可以有和聲效果啦
sample_str=''.join(samples)#
把samples里所有的值都convert到一個string上
wavefile.writeframes(sample_str)#終於要寫waveframe啦!
wavefile.close()#最後別忘了關掉文件,不然會出錯滴
print"Donewriting
file."#大告成功!
8. 在python 中打開波形文件 ︰ 未知的格式 ︰ 49.究竟怎麼了
投票
2
回答
1K
查看
我嘗試打開波形文件與 wave模塊,但是老是同樣的錯誤我試著不管。 包含錯誤的行是以下 ︰
wav = wave.open(f)
這是錯誤消息 ︰
Traceback (most recent call last):
File "annotate.py", line 47, in <mole>
play(file)
File "annotate.py", line 33, in play
wav = wave.open(f)
File "C:\Program Files (x86)\Python\lib\wave.py", line 498, in open
return Wave_read(f)
File "C:\Program Files (x86)\Python\lib\wave.py", line 163, in __init__
self.initfp(f)
File "C:\Program Files (x86)\Python\lib\wave.py", line 143, in initfp
self._read_fmt_chunk(chunk)
File "C:\Program Files (x86)\Python\lib\wave.py", line 269, in _read_fmt_chunk
raise Error('unknown format: %r' % (wFormatTag,))
wave.Error: unknown format: 49
字元串 f是路徑。WAV 文件,它工作在任何我的媒體播放器播放時。 我當然導入 wave的模塊。 我試過 f,作為一個相對和絕對路徑。 我試著用"wav"取代"WAV"。
錯誤什麼導致的?
投票
Python 的波模塊工作與特定類型的 WAV: PCM (WAVE_FORMAT_PCM: 0x0001)。
在您的情況下,您使用 WAV 類型 WAVE_FORMAT_GSM610[0x0031 = hex(49)].
你可以使用像大膽或者一些程序轉換的編解碼器,WAV 文件的類型更改為 lib。
9. 基於Python 對 Wave 文件的讀寫支持,可能產生哪些有趣的創意
import wave 用於讀寫wav文件
它提供了一個方便的WAV格式介面。
但是不支持壓縮/解壓縮,支持單聲道/立體聲。
讀取格式:
open(file[, mode])
如果file是一個字元串,那麼就打開文件,不然就把它當做一個類文件對象。
mode是可以預設的,如果輸入的參數是一個類文件對象,那麼file.mode將會作為mode的值。
mode可選參數如下:
'r', 'rb'
Read only mode.
'w', 'wb'
Write only mode.
注意不能同時實現讀/寫操縱
10. Python報錯(pyaudio,wave)
朋友,你的python版本與代碼的版本不一致吧!請確認一下,更換到對應版本上。如果python版本一致,更新pyaudio的庫。