安装:
方法一:
下载whl文件:https://github.com/intxcc/pyaudio_portaudio/releases
切换到whl文件目录,直接用pip安装 pip install PyAudio-0.2.11-cp37-cp37m-win_amd64.whl
方法二:
在CMD:python -m pip install pyaudio
import pyaudio #导入库
import wave #导入wav音频库
import sys
from PyQt5.QtWidgets import QApplication, QWidget,QFileDialog
from pya import Ui_Form
import threading
class Win(QWidget,Ui_Form):
def __init__(self):
super(Win, self).__init__()
self.CHUNK = 1024 # 定义数据流块--每次读取数据的字节数
self.FORMAT = pyaudio.paInt16 #16int
self.CHANNELS = 2
self.RATE = 44100
self.RECORD_SECONDS = 5 # 录音时间
self.WAVE_OUTPUT_FILENAME = "D:/output.wav" #录音时要写入的文件名
self.p = pyaudio.PyAudio() # 创建播放器
self.data=''
self.setupUi(self)
def dakaiwenjian(self):#打开文件
self.r = QFileDialog.getOpenFileName(self, '请选择要打开的文件', '.\\', 'WAV(*.wav)',
'WAV(*.wav)')
self.lineEdit.setText(self.r[0])
def luyin(self):#录音开始
self.t1 = threading.Thread(target=self.luyin1) # 创建线程
self.t1.setDaemon(True) # 守护线程
self.t1.start()
def luyin1(self):
self.stream1 = self.p.open(format=self.FORMAT,channels=self.CHANNELS,rate=self.RATE,input=True,frames_per_buffer=self.CHUNK) # 打开数据流
self.frames = []
n=0
while not(self.stream1.is_stopped() ):
data = self.stream1.read(self.CHUNK) #从麦克风读取数据
self.frames.append(data)
print(data,n)
n=n+1
def luyinjiesu(self):#录音结束
self.t2 = threading.Thread(target=self.luyijiesu1) # 创建线程
self.t2.setDaemon(True) # 守护线程
self.t2.start()
def luyijiesu1(self):
self.stream1.stop_stream() # 停止录音流
self.stream1.close() #关闭录音流
# 写入录音文件
wf = wave.open(self.WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(self.CHANNELS)
wf.setsampwidth(self.p.get_sample_size(self.FORMAT))
wf.setframerate(self.RATE)
wf.writeframes(b''.join(self.frames))
wf.close()
def jixu(self): #继续
if self.data != '' and self.stream.is_stopped():
self.stream.start_stream() #继续流
# stream.close()之后就不能继续了
self.bofan()
def zantin(self):#暂停
if self.data != '':
self.stream.stop_stream() # 停止数据流--暂停
# 一旦流停止,就不能调用写或读
# 指针位置不变
def tinzi(self):#停止
self.stream.stop_stream()
self.stream.close() #关闭流
self.data=''
#说明:我找不到判断流是否打开的函数,我用self.data=''表示流已经关闭
self.wf.close()
def bofan1(self):
if self.data=='' and self.lineEdit.text()!='':
self.wf = wave.open(self.r[0], 'rb')
self.stream = self.p.open(format=self.p.get_format_from_width(self.wf.getsampwidth()),
channels=self.wf.getnchannels(), rate=self.wf.getframerate(),
output=True) # 打开数据流--【获取音频格式信息】
# output=True 输出的意思
self.data = self.wf.readframes(self.CHUNK) # 读取数据
while (self.data) != '' and not(self.stream.is_stopped() ):
#self.stream.is_stopped() 流是否停止,如果停止返回True
self.stream.write(self.data) #播放
#注意事项:播放时占用线程,最好创建一个线程
self.data = self.wf.readframes(self.CHUNK)
def bofan(self): #播放
self.t = threading.Thread(target=self.bofan1) #创建线程
self.t.setDaemon(True) #守护线程
self.t.start()
def qita(self):#其它
#self.p.terminate() #关闭播放器
#print('是否激活:',self.stream.is_active())
# is_active() 判断流是否激活 必须在打开后判断
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Win()
demo.show()
sys.exit(app.exec_())
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
界面浏览:
上面工程下载: https://pan.baidu.com/s/1VAaoIQSpIFaeXTKiVoiuqg&shfl=sharepset
提取码:v2g8