當前位置:首頁 » 編程語言 » wavepython

wavepython

發布時間: 2022-07-13 01:36:36

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的庫。

熱點內容
安卓手機236開發者選項在哪裡 發布:2024-05-06 04:11:13 瀏覽:259
sql過濾條件 發布:2024-05-06 04:05:18 瀏覽:562
ifconfiglinux 發布:2024-05-06 03:47:59 瀏覽:533
c語言開發集成環境 發布:2024-05-06 03:47:06 瀏覽:607
腳本uzi比賽視頻 發布:2024-05-06 03:46:19 瀏覽:823
php給文本框賦值 發布:2024-05-06 03:21:24 瀏覽:26
androidjsonkey 發布:2024-05-06 03:07:31 瀏覽:732
python主線程子線程 發布:2024-05-06 03:07:20 瀏覽:764
android系統截屏 發布:2024-05-06 02:57:51 瀏覽:777
android居左 發布:2024-05-06 02:40:26 瀏覽:45