Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答


Posted in Python onAugust 13, 2019

Python 很强大其原因就是因为它庞大的三方库 , 资源是非常的丰富 , 当然也不会缺少关于音频的库

关于音频, PyAudio 这个库, 可以实现开启麦克风录音, 可以播放音频文件等等,此刻我们不去了解其他的功能,只了解一下它如何实现录音的

首先要先 pip 一个 PyAudio

pip install pyaudio

一.PyAudio 实现麦克风录音

然后建立一个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 = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
 data = stream.read(CHUNK)
 frames.append(data)
print("录音结束,请闭嘴!")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_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 = stream.read(CHUNK)
  frames.append(data)
 print("录音结束,请闭嘴!")
 stream.stop_stream()
 stream.close()
 p.terminate()
 wf = wave.open(file_name, 'wb')
 wf.setnchannels(CHANNELS)
 wf.setsampwidth(p.get_sample_size(FORMAT))
 wf.setframerate(RATE)
 wf.writeframes(b''.join(frames))
 wf.close()

rec 函数就是我们调用的录音函数,并且给他一个文件名,他就会自动将声音写入到文件中了

二.实现音频格式自动转换 并 调用语音识别

录音的问题解决了,赶快和百度语音识别接在一起使用一下:

Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答

不管你的录音有多么多么清晰,你发现百度给你返回的永远是:

{'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的函数了 , 再重新构建一次咱们的代码

Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答

这次的返回结果还挺让人满意的嘛

{'corpus_no': '6569869134617218414', 'err_msg': 'success.', 'err_no': 0, 'result': ['老男孩教育'], 'sn': '8116162981529666859'}

拿到语音识别的字符串了,接下来用这段字符串 语音合成, 学习咱们说出来的话

三.语音合成 与 FFmpeg 播放mp3 文件

拿到字符串了,直接调用synthesis方法去合成吧

Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答

这段代码衔接上一段代码,成功获得了 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 函数

Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答

执行代码,当你看到 : 开始录音,请说话......

请大声的说出: 学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 = res.get("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 函数 文件
pyrec.rec("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 = baidu_ai.text_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 "我不知道你在说什么" #问题没有答案时返

在主文件中导入这个函数,并将语音识别后的字符串传入函数中

Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答

现在来尝试一下:"你叫什么名字","你今年几岁了"

成功了,现在你可以对 FAQ.py 这个文件进行更多的问题匹配了

还是那句话,别玩儿坏了

思考题:

1.如何实现一直问答不用问一次停一次?

2.问题那么多,是不是要写这么多问题呢?

3.如果我问你是谁,是不是要重复也一次 我的名字叫老男孩教育 的答案呢?

总结

以上所述是小编给大家介绍的Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python中的sort方法使用详解
Jul 25 Python
python实现通过shelve修改对象实例
Sep 26 Python
Python中的ctime()方法使用教程
May 22 Python
Python新手入门最容易犯的错误总结
Apr 24 Python
python构建深度神经网络(DNN)
Mar 10 Python
关于Pycharm无法debug问题的总结
Jan 19 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
Dec 04 Python
如何基于windows实现python定时爬虫
May 01 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
May 07 Python
Python -m参数原理及使用方法解析
Aug 21 Python
Python 使用office365邮箱的示例
Oct 29 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 #Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 #Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 #Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 #Python
Python字符串处理的8招秘籍(小结)
Aug 13 #Python
python实现批量修改服务器密码的方法
Aug 13 #Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 #Python
You might like
用PHP制作静态网站的模板框架(三)
2006/10/09 PHP
深入分析PHP优化及注意事项
2016/07/04 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
纯js实现背景图片切换效果代码
2010/11/14 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
Javascript判断文件是否存在(客户端/服务器端)
2014/09/16 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
2016/12/01 Javascript
js+html获取系统当前时间
2017/11/10 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
在Vue中实现随hash改变响应菜单高亮
2020/03/09 Javascript
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
python使用turtle库绘制时钟
2020/03/25 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
python实现点击按钮修改数据的方法
2019/07/17 Python
浅谈Python 函数式编程
2020/06/20 Python
python2和python3哪个使用率高
2020/06/23 Python
python 实现百度网盘非会员上传超过500个文件的方法
2021/01/07 Python
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
求职信范文怎么写
2014/01/29 职场文书
业务部门经理岗位职责
2014/02/23 职场文书
优秀食品类广告词
2014/03/19 职场文书
师范生自我鉴定
2014/03/20 职场文书
借款担保书范文
2014/05/13 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
初一数学教学反思
2016/02/17 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技