一、winsound 模块

winsound模块提供Windows操作系统的语言播放接口。
PlaySound() 函数可以播放.wav语言文件。
语法格式:PlaySound(sound , flags)
sound可以是wave文件名称、字符串类型的语言数据或None
flags是语言变量的参数

flags参数 说明
SND_FILENAME 表示一个wav文件名
SND_ALIAS 表示一个注册表指定的别名
SND_LOOP 重复播放语言,必须与SND_ASYNC共同使用
SND_MEMORY 表示wave文件的内存图像(memory image)
是一个字符串
SND_PURGE 停止所有播放的语言
SND_ASYNC PlaySound()函数立即返回,语言在背景播放
SND_NOSTOP 不会中断目前播放的语音
SND_NOWAIT 若语言驱动程序忙碌,则立即返回
  1. from tkinter import *
  2. import tkinter.filedialog,winsound
  3. ##创建主窗口
  4. win = Tk()
  5. win.title(string = "处理声音")
  6. ##打开一个[打开旧文件]对话框
  7. def openSoundFile():
  8. ##返回打开的语言文件名
  9. infile = myDialog.show()
  10. label.config(text = "语音文件" + infile)
  11. return infile
  12. ##播放语言文件
  13. def playSoundFile():
  14. infile = openSoundFile()
  15. ##重复播放
  16. flags =winsound.SND_FILENAME | winsound.SND_LOOP | winsound.SND_ASYNC
  17. winsound.PlaySound(infile,flags)
  18. ##停止播放
  19. def stopSoundFile():
  20. winsound.PlaySound("*",winsound.SND_PURGE)
  21. ##label
  22. label = Label(win,text = "声音文件")
  23. label.pack(anchor = W)
  24. Button(win,text = "播放声音",command = playSoundFile).pack(side = LEFT)
  25. Button(win,text = "停止播放",command =stopSoundFile).pack(side = LEFT)
  26. ##设置对话框打开的文件类型
  27. myFileTypes = [('WAVE format','*.wav')]
  28. ##创建你一个[打开旧文件]对话框
  29. myDialog = tkinter.filedialog.Open(win,filetypes=myFileTypes)
  30. ##开始窗口的事件循环
  31. win.mainloop()

image.png
打开之后,就会音乐就会播放,点击停止播放之后,文件就会停止播放
image.png

二、sndhdr 模块

sndhdr模块用于识别语言文件的格式。调用what()方法来执行识别语言文件的功能。
语法格式:info = sndhar.what(filename)
filename是语言文件的名称
返回值info是一个元组,格式:(type ,sampling_rate,channels,frames,bits_per_smple)

参数 说明
type type是语言文件的格式
aifc、aiff、au、hcom、sndr、sndt、voc、wav、8svx、sb、ub或ul
sampling_rate 是每一秒内的取样数据,如果无法译码,就为0
channels 是声道数目,如果无法译码,就为0
frames 是帧的数目,每一帧由每一个声道和一个取样组成。
如果无法译码,就为0
bits_per_smple 可以是取样大小,以位为单位。或是A,表示A-LAW,或是U,表示U-LAW
  1. from tkinter import *
  2. import tkinter.filedialog,sndhdr
  3. ##创建应用程序的类
  4. class App:
  5. def __init__(self,master):
  6. ##创建一个Label控件
  7. self.label = Label(master,text="语言文件:")
  8. self.label.pack()
  9. ##创建一个button
  10. self.Button = Button(master,text="打开语言文件",command = self.openSoundFile)
  11. self.Button.pack(side = LEFT)
  12. ##设置对话框打开的文件类型
  13. self.myFileTypes = [('WAVE format','*.wav')]
  14. ##创建一个[打开旧文件]对话框
  15. self.myDialog = tkinter.filedialog.Open(master,filetypes=self.myFileTypes)
  16. ##打开语言文件
  17. def openSoundFile(self):
  18. ##返回打开的语言文件名
  19. infile = self.myDialog.show()
  20. ##显示该语言文件的格式
  21. self.getSoundHeader(infile)
  22. def getSoundHeader(self,infile):
  23. ##读取语言文件的格式
  24. info = sndhdr.what(infile)
  25. txt = '语言文件:'+infile + '\n'+ "Types: "+info[0]+'\n'+"Sampling rate: "+str(info[1])+'\n'+"Channels: "+str(info[2])+'\n'+"Frames: "+str(info[3])+'\n'+"Bit per sample:"+str(info[4])
  26. self.label.config(text = txt)
  27. ##创建主窗口
  28. win = Tk()
  29. win.title(string = "处理声音")
  30. ##创建应用程序类的实例变量
  31. app = App(win)
  32. ##开始事件的窗口循环
  33. win.mainloop()

image.png
image.png

三、wave模块

wave模块让用户读写、分析及创建WAVE(.wav) 文件。
使用wave模块的open() 方法可以打开旧文件或创建新文件
open(file [,mode ])
file是WAVE文件名称
mode可以是r或rb,表示只读模式,返回一个Wave_read对象,可以是w或wb模式,表示只写模式,返回一个Wave_write对象
Wave_read对象的方法列表

方法 说明
getnchannels() 返回声道数目。1是单声道,2是双声道
getsampwidth() 返回样本宽度,单位是字节
getframerate() 返回取样频率
getframes() 返回帧的数目
getcomptype() 返回压缩类型。返回None表示线性样本
getcompname() 返回可读的压缩类型
getparams() 返回一个元组
(nchannels,sampwidth,framerate,nframes,comptype,compname)
getmarkers() 返回None,此方法用来与aifc模块兼容
getmark(id) 抛出一个例外,因为此mark不存在,此方法用来与arfc模块兼容
readframes(n) 返回n个帧的语言数据
rewind() 倒转至语言串流的开头
setpos(pos) 移到pos位置
tell() 返回当前的位置
close() 关闭语言串流

Wave_write对象的方法列表

方法 说明
setnchannels() 设置声道的数目
setsampwidth(n) 设置样本宽度
setframerate(n) 设置取样频率
setnframes(n) 设置帧的数目
setcomptype(type,name) 设置压缩类型与可读的压缩类型
setparams() 设置一个元组
(nchannels,sampwidth,framerate,nframes,comptype,compname)
tell() 返回目前的位置
writeframesraw(data) 写入语音帧,但是没有文件表头
writefrmaes(data) 写入语音帧及文件表头
close() 写入文件表头,并且关闭语音串流
  1. from tkinter import *
  2. import tkinter.filedialog,wave
  3. ##创建应用程序的类
  4. class App:
  5. def __init__(self,master):
  6. ##创建一个Label控件
  7. self.label = Label(master,text="语音文件:")
  8. self.label.pack(anchor = W)
  9. ##创建一个Button控件
  10. self.button = Button(master,text="打开语音文件:",command =self.openSoundFile)
  11. self.button.pack(anchor = CENTER)
  12. ##设置对话框打开的文件类型
  13. self.myFileTypes = [("WAVE format","*.wav")]
  14. ##创建一个[打开旧文件]对话框
  15. self.myDialog = tkinter.filedialog.Open(master,filetypes=self.myFileTypes)
  16. ##打开语音文件
  17. def openSoundFile(self):
  18. ##返回打开的语音文件名
  19. infile = self.myDialog.show()
  20. ##显示该语音
  21. self.getWaveFormat(infile)
  22. def getWaveFormat(self,infile):
  23. ##读取语音文件的格式
  24. audio = wave.open(infile,"r")
  25. txt = "语音文件:"+str(audio.getnchannels())+"\n"+\
  26. "Channels:"+str(audio.getsampwidth())+"\n"+\
  27. "Sample width: "+str(audio.getsampwidth())+"\n"+\
  28. "Frame rate: "+str(audio.getframerate())+"\n"+\
  29. "Compression Type"+str(audio.getcomptype())+"\n"+\
  30. "Compression name: "+str(audio.getcompname())
  31. self.label.config(text=txt)
  32. ##创建主窗口
  33. win = Tk()
  34. win.title(string="处理声音")
  35. ##创建应用程序类的实例变量
  36. app = App(win)
  37. ##开始事件的循环
  38. win.mainloop()

image.png
image.png

四、aifc模块

aifc(Audio Interchange File Format)模块用于存取AIFF与AIFC格式的语音文件。
创建一个新的AIFC语音文件

  1. import aifc
  2. ##创建一个新的语音文件
  3. stream = aifc.open(r"E:\\pythonstduy\\yuying\\test.aifc", "w")
  4. ##声道数为2
  5. stream.setnchannels(2)
  6. ##样本宽度为2
  7. stream.setsampwidth(2)
  8. ##每一秒22050个帧
  9. stream.setframerate(22050)
  10. ##写入表头以及语音串流
  11. stream.writeframes(b'143457891315564'*2000)
  12. ##关闭文件
  13. stream.close()

image.png