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

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

首先要先 pip 一个 PyAudio

pip install pyaudio

一.PyAudio 实现麦克风录音

然后建立一个py文件,复制如下代码

import pyaudioimport 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 pyaudioimport wave

CHUNK = 1024

FORMAT = pyaudio.paInt16

CHANNELS = 2

RATE = 16000

RECORD_SECONDS = 2def 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 函数就是我们调用的录音函数,并且给他一个文件名,他就会自动将声音写入到文件中了

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

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

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

{'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 osdef 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 osdef 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 = res.get("result")[0]return res_strdef 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_strsynth_file = baidu_ai.text_to_audio(res_str) #将res_str 字符串 合成语音 返回文件名 synth_fileplaymp3.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.如果我问你是谁,是不是要重复也一次 我的名字叫老男孩教育 的答案呢?

python 工业自动化 人工智能_Python人工智能之路 - 第三篇 : PyAudio 实现录音 自动化交互实现问答...相关推荐

  1. python语音识别播放音乐_Python人工智能 : PyAudio 实现录音 自动化交互实现问答

    Python 很强大其原因就是因为它庞大的三方库 , 资源是非常的丰富 , 当然也不会缺少关于音频的库 关于音频, PyAudio 这个库, 可以实现开启麦克风录音, 可以播放音频文件等等,此刻我们不 ...

  2. 黎想深度访谈腾讯顶级产品经理的进阶之路——第三篇《需求》

    16个月精心打磨,9位顶级产品专家研讨提炼,凝聚腾讯产品经验的八集八分钟产品课分别从用户.定位.需求.时机.匠心.危机.合作.商业角度出发,还原产品背后的故事,分享给你腾讯产品的心法.艺形艺意工作室创 ...

  3. python智能识别_Python人工智能识别文字内容(OCR)

    环境准备 安装pytesseract和PIL安装这两个包可以借助pip命令行安装 pip install PIL pip install pytesseract 安装识别引擎tesseract-ocr ...

  4. python最终目标_Python晋级之路-工欲善其事必先利其器

    猴子老师Live中用一个盖房子的例子,很好的解释了大多数零基础朋友开始学习编程时的迷茫.面对一个客户需求,如何分三个步骤就能得出最后的结果. 我简单整理一下,第一步先仔细分析客户的需求,明确最终目标( ...

  5. python 工业自动化控制_python工业自动化测试教程

    python工业自动化测试教程内容摘要 python工业自动化测试教程P>winpython基础教程,为你的店堂营造出一种艺术氛围,为男性开辟集中便捷的专门场所已为不少商场所采纳,为目标顾客提供 ...

  6. python str 换行_Python学习之路(1)

    一.Python3.x IDLE的安装(windows) 1.Python 官网:https://www.python.org/ 2.Downloads---- --->Windows--- - ...

  7. python 前端学习_python学习之路7 前端学习3

    1.页面布局 PosTion :fixed Title .left{float:left; }.right{float:right; }.head{height:58px;background-col ...

  8. python正则表达式生成器_Python学习之路-装饰器生成器正则表达式

    装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器,def login_decorator(fun ...

  9. python画大象_Python学习之路(01)-- Python基础

    一. 初识Python-HelloWorld 1 #!/usr/bin/env python 2 #当py文件为可执行程序时,需添加该项 3 4 5 #coding: utf-8 6 7 print( ...

最新文章

  1. codevs1002 搭桥
  2. mfc 实现 设备 热插拔功能
  3. 《数据中台实战》:用户留存分析
  4. 用最少的机器支撑万亿级访问,微博6年Redis优化历程
  5. java中struts2日期_Struts2中Date日期转换的问题
  6. android标题栏添加按钮_[办公小技巧]Excel 添加页码,自定义和指定单元格页码添加...
  7. 吴晓波上市梦碎,罗永浩:梦太大又入错行
  8. XMLHttpRequest对象的open方法
  9. 故障:笔记本电脑部分按键失效
  10. The Book Thief
  11. [前端积累]--响应式布局(二)
  12. Windows Phone开发-- 多任务之墓碑机制
  13. 800名科学家联名反对统计学意义,放弃P值“决定论”!
  14. 归并排序算法代码实现
  15. vc++之oncreate
  16. 三重邪骨手机版怎么登录服务器未响应,三重邪骨手机版-三重邪骨模拟器预约v1.0-k73游戏之家...
  17. CMTime,CMTimeMake CMTimeMakeWithSeconds
  18. 国内几个重要的B2C网站
  19. additional、extra与supplementary 区别
  20. 2018(2017)美图java服务端笔试(回忆录)

热门文章

  1. 机器都会学习了,你的神经网络还跑不动?来看看这些建议
  2. Attention is all your need 谷歌的超强特征提取网络——Transformer
  3. Vue登录切换中的问题及解决
  4. LeetCode中等题之在排序数组中查找元素的第一个和最后一个位置
  5. TensorFlow编程结构
  6. 车联网,挖掘数据价值
  7. 利用NVIDIA-NGC中的MATLAB容器加速语义分割
  8. 客快物流大数据项目(五十二):根据数据库表及字段创建公共模块
  9. [JavaScript]走进 JAVASCRIPT 黑洞
  10. python的 局部变量与全局变量