当前位置:首页 » 编程语言 » 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的库。

热点内容
按键脚本优化 发布:2024-05-19 04:59:57 浏览:751
怎么下载压缩包 发布:2024-05-19 04:47:47 浏览:9
二嫂水仙ftp 发布:2024-05-19 04:47:42 浏览:160
云隙服务器下载 发布:2024-05-19 04:33:22 浏览:315
德国C语言 发布:2024-05-19 04:13:40 浏览:965
音频管理器没有文件夹 发布:2024-05-19 04:13:36 浏览:667
qq邮箱端口993服务器怎么填 发布:2024-05-19 04:07:05 浏览:204
javaapi框架 发布:2024-05-19 04:06:59 浏览:365
与存储结构无关的术语 发布:2024-05-19 04:05:41 浏览:500
编译路由器固件选择 发布:2024-05-19 03:56:28 浏览:42