Python⼈⼯智能之路-第三篇:PyAudio实现录⾳⾃动化交互实
现问答
Python 很强⼤其原因就是因为它庞⼤的三⽅库 , 资源是⾮常的丰富 , 当然也不会缺少关于⾳频的库
关于⾳频, PyAudio 这个库, 可以实现开启麦克风录⾳, 可以播放⾳频⽂件等等,此刻我们不去了解其他的功能,只了解⼀下它如何实现录⾳的⾸先要先 pip ⼀个 PyAudio
pip install pyaudio
⼀.PyAudio 实现麦克风录⾳angelababy结婚
然后建⽴⼀个py⽂件,复制如下代码
import pyaudio
失业证无息贷款import wave
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 16000
RECORD_SECONDS = 2
WAVE_OUTPUT_FILENAME = "Oldboy.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("开始录⾳,请说话......")
frames = []
flash动画教程for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = ad(CHUNK)
frames.append(data)
print("录⾳结束,请闭嘴!")
忧伤的句子stream.stop_stream()
stream.close()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
高速公路收费用标准wf.setnchannels(CHANNELS)
wf._sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
尝试⼀下,在⽬录中出现了⼀个 Oldboy.wav ⽂件 , 听⼀听,还是很清晰的嘛
接下来,我们将这段录⾳代码,写在⼀个函数⾥⾯,如果要录⾳的话就调⽤
建⽴⼀个⽂件 pyrec.py 并将录⾳代码和函数写在内
# pyrec.py ⽂件内容
import pyaudio
import wave
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 16000
RECORD_SECONDS = 2
def rec(file_name):
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("开始录⾳,请说话......")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = ad(CHUNK)
frames.append(data)
print("录⾳结束,请闭嘴!")
stream.stop_stream()
stream.close()
wf = wave.open(file_name, 'wb')
wf.setnchannels(CHANNELS)
wf._sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
rec 函数就是我们调⽤的录⾳函数,并且给他⼀个⽂件名,他就会⾃动将声⾳写⼊到⽂件中了
⼆.实现⾳频格式⾃动转换并调⽤语⾳识别
录⾳的问题解决了,赶快和百度语⾳识别接在⼀起使⽤⼀下:
不管你的录⾳有多么多么清晰,你发现百度给你返回的永远是:
{'err_msg': 'speech quality error.', 'err_no': 3301, 'sn': '6397933501529645284'} # ⾳质不清晰
其实不是没听清,⽽是百度⽀持的⾳频格式PCM搞的⿁
所以,我们要将录制的wav⾳频⽂件转换为pcm⽂件
写⼀个⽂件 wav2pcm.py 这个⽂件⾥⾯的函数是专门为我们转换wav⽂件的
使⽤ os 模块中的 os.system()⽅法这个⽅法是执⾏系统命令⽤的, 在windows系统中的命令就是 cmd ⾥⾯写的东西,dir , cd 这类的命令# wav2pcm.py ⽂件内容
import os
def wav_to_pcm(wav_file):
# 假设 wav_file = "⾳频⽂件.wav"
# wav_file.split(".") 得到["⾳频⽂件","wav"] 拿出第⼀个结果"⾳频⽂件" 与 ".pcm" 拼接等到结果 "⾳频⽂件.pcm"
pcm_file = "%s.pcm" %(wav_file.split(".")[0])
# 就是此前我们在cmd窗⼝中输⼊命令,这⾥⾯就是在让Python帮我们在cmd中执⾏命令
os.system("ffmpeg -y -i %s -acodec pcm_s16le -f s16le -ac 1 -ar 16000 %s"%(wav_file,pcm_file))
return pcm_file
这样我们就有了把wav转为pcm的函数了 , 再重新构建⼀次咱们的代码
这次的返回结果还挺让⼈满意的嘛
{'corpus_no': '6569869134617218414', 'err_msg': 'success.', 'err_no': 0, 'result': ['⽼男孩教育'], 'sn': '8116162981529666859'}
拿到语⾳识别的字符串了,接下来⽤这段字符串语⾳合成, 学习咱们说出来的话
三.语⾳合成与 FFmpeg 播放mp3 ⽂件
拿到字符串了,直接调⽤synthesis⽅法去合成吧
这段代码衔接上⼀段代码,成功获得了 synth.mp3 ⾳频⽂件,并且确定了实在学习我们说的话
接下来就是让我们的程序⾃动将 synth.mp3 ⾳频⽂件播放了其实PyAudio 有播放的功能,但是操作有点复杂
所以我们还是选择⽤简单的⽅式解决复杂的问题,就是这么简单粗暴,是否还记得FFmpeg 呢?
FFmpeg 这个系统⼯具中,有⼀个 ffplay 的⼯具⽤来打开并播放⾳频⽂件的,使⽤⽅法⼤概是: ffplay ⾳频⽂件.mp3
建⽴⼀个playmp3.py⽂件, 写⼀个 play_mp3 的函数⽤来播放已经合成的语⾳
# playmp3.py ⽂件内容
import os
def play_mp3(file_name):
os.system("ffplay %s"%(file_name))
回到主⽂件,调⽤playmp3.py⽂件中的 play_mp3 函数
执⾏代码,当你看到 : 开始录⾳,请说话......
请⼤声的说出: 学IT ⽼男孩教育
住友生命然后你就会听到,⼀个娇滴滴声⾳重复你说的话
四.简单问答
⾸先我们要把代码重新梳理⼀下:
把语⾳合成语⾳识别部分的代码独⽴成函数放到baidu_ai.py⽂件中
# baidu_ai.py ⽂件内容
from aip import AipSpeech
# 这⾥的三个参数,对应在百度语⾳创建的应⽤中的三个参数
APP_ID = "xxxxx"
API_KEY = "xxxxxxx"
SECRET_KEY = "xxxxxxxx"
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
def audio_to_text(pcm_file):
# 读取⽂件 , 终于得到了PCM⽂件
with open(pcm_file, 'rb') as fp:
file_context = fp.read()
# 识别本地⽂件
res = client.asr(file_context, 'pcm', 16000, {
'dev_pid': 1536,
})
# 从字典⾥⾯获取"result"的value 列表中第1个元素,就是识别出来的字符串"⽼男孩教育"
res_str = ("result")[0]
return res_str
def text_to_audio(res_str):
synth_file = "synth.mp3"
synth_context = client.synthesis(res_str, "zh", 1, {
"vol": 5,
"spd": 4,
"pit": 9,
"per": 4
})
with open(synth_file, "wb") as f:
f.write(synth_context)
return synth_file
然后把我们的主⽂件进⾏⼀下修改
import pyrec # 录⾳函数⽂件
import wav2pcm # wav转换pcm 函数⽂件
import baidu_ai # 语⾳合成函数,语⾳识别函数⽂件
import playmp3 # 播放mp3 函数⽂件
<("1.wav") # 录⾳并⽣成wav⽂件,使⽤⽅式传⼊⽂件名
pcm_file = wav2pcm.wav_to_pcm("1.wav") # 将wav⽂件转换成pcm⽂件返回 pcm的⽂件名res_str = baidu_ai.audio_to_text(pcm_file) # 将转换后的pcm⾳频⽂件识别成⽂字 res_str synth_file = _to_audio(res_str) # 将res_str 字符串合成语⾳返回⽂件名 synth_file playmp3.play_mp3(synth_file) # 播放 synth_file
然后就是⼤展宏图的时候了,展开你们的想象⼒:
res_str 是字符串,如果字符串等于"你叫什么名字"的时候,我们就要给他⼀个回答:我的名字叫⽼男孩教育新建⼀个FAQ.py的⽂件然后建⽴⼀个函数faq:
# FAQ.py ⽂件内容
def faq(Q):
if Q == "你叫什么名字": # 问题
return"我的名字是⽼男孩教育"# 答案
return "我不知道你在说什么" #问题没有答案时返
在主⽂件中导⼊这个函数,并将语⾳识别后的字符串传⼊函数中
现在来尝试⼀下:"你叫什么名字","你今年⼏岁了"
成功了,现在你可以对 FAQ.py 这个⽂件进⾏更多的问题匹配了
还是那句话,别玩⼉坏了
思考题:
1.如何实现⼀直问答不⽤问⼀次停⼀次?
2.问题那么多,是不是要写这么多问题呢?
3.如果我问你是谁,是不是要重复也⼀次我的名字叫⽼男孩教育的答案呢?
发布评论