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贪吃蛇游戏编写代码
Oct 26 Python
python利用正则表达式排除集合中字符的功能示例
Oct 10 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
Python分割指定页数的pdf文件方法
Oct 26 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
Python实现把类当做字典来访问
Dec 16 Python
Jupyter notebook快速入门教程(推荐)
May 18 Python
tensorflow转换ckpt为savermodel模型的实现
May 25 Python
Python读取pdf表格写入excel的方法
Jan 22 Python
python 爬取腾讯视频评论的实现步骤
Feb 18 Python
Python日志模块logging用法
Jun 05 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
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
一个简单的PHP验证码实现代码
2014/05/10 PHP
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
jQuery MD5加密实现代码
2010/03/15 Javascript
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
Django单元测试中Fixtures的使用方法
2020/02/26 Python
python获取响应某个字段值的3种实现方法
2020/04/30 Python
解决python 执行sql语句时所传参数含有单引号的问题
2020/06/06 Python
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
建龙钢铁面试总结
2014/04/15 面试题
松材线虫病防治方案
2014/06/15 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
自我查摆剖析材料
2014/10/11 职场文书
工作自我推荐信范文
2015/03/25 职场文书
亮剑观后感
2015/06/05 职场文书
实践论读书笔记
2015/06/29 职场文书
话题作文之成长
2019/12/09 职场文书
Java数组与堆栈相关知识总结
2021/06/29 Java/Android
浅谈Java父子类加载顺序
2021/08/04 Java/Android