Python调用百度API实现语音识别(二)

咪哥杂谈

共 2220字,需浏览 5分钟

 ·

2019-11-23 23:20

咪哥杂谈

d0ca95e667cbffa2cbcc56d6748549a5.webp

本篇阅读时间约为 5 分钟。


1

前言


上一篇文章里,大致介绍了百度官方 api 的一些前置准备工作。


想回顾的同学,可以看完本篇在下面找到历史链接。


今天就来上手实战编码,体验一下代码实现以及编程中遇到的坑。


2

环境准备


开始之前,安装百度语音 sdk ,Python 版。


pip install baidu-aip


b520f9bab7a0f31d6781be43522c668f.webp


环境很简单,就这一步,完成即可编码。


3

代码撸起


直接拷贝官方提供的代码,就行了,改点参数,上篇文章介绍百度官方申请到的 key 之类的信息自行填入:


from aip import AipSpeech
""" 你的 APPID AK SK """APP_ID = '你的 App ID'API_KEY = '你的 Api Key'SECRET_KEY = '你的 Secret Key'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
# 读取文件def get_file_content(file_path): with open(file_path, 'rb') as fp: return fp.read()# 识别本地文件result = client.asr(get_file_content('disco.wav'), 'wav', 16000, { 'dev_pid': 1537, # 默认1537(普通话 输入法模型),dev_pid参数见本节开头的表格})


脚本同级目录下,把上次解析的 野狼disco.mp3 改下后缀,变成 wav 格式的,上传。注意下 dev_pid,这里贴出官方参数,用 1537 即可。


9db704be562b41bcb0ae89191304a02b.webp





看下百度封装好的源码,我们最终以什么样的形式来接受数据。
封装请求的代码是 client.asr ,下面逐步来看下它。
1. asr 函数

9ee88ac4253871733d9cf2551d2d021b.webp


进来可以看到,有几个默认参数,格式默认 pcm 音频后缀,采样率默认 16000。然后最终封装成 data 字典的形式传入到 _requests() 里,这里有个 __asUrl 变量,即百度请求的 api 地址。

29861e4cd680161595e642977594615d.webp


2. _requests 函数


f15bc31012735fb0b9312f64c637ce11.webp


不论最终走到哪里,反正返回的 obj 对象都是经过 _proccessResult函数进行处理返回的。而传进的参数则是 requests 库请求后返回的结果。

3. _proccessResult 函数

ff711bbf1e3faf19fbf423c6fb4284a1.webp


根据 sys.version_info.major 进行不同的 Python 版本号判断,进行不同的 json 解析,如果是 2,则不用对内容进行解码。




源码看到这里,所以了解最终返回的是什么类型了吗。。e1bbbdc73981b91ac18d2d41dc2b77bc.webp
json.loads,在之前小课堂 json 篇中说过,返回的是 dict 类型。
运行下代码:

28f7517ed6d43439ba760e73d6313d02.webp


哎,返回了 3301 ,错误信息写着,音频质量错误,查阅下官方文档:

c9f1e6d2e73f36136e81c9f5f9d4949c.webp

看来是野狼 disco 背景音乐太嘈杂哦,那换一个无背景音乐的音频试试。

自己动手,丰衣足食,于是用 Siri 录了一段 11 s的音频,一定要亲自听一下,笑声挺鬼畜的772d0c8ab771c5a6dba801633c26bc7c.webp

但是呢,这里又遇到个坑,当你从视频中如果提取音频时,也需要注意这个问题。

这个坑就是,音频的采样率:

81ed2bef2ed1378d5f5c7cc6910c9447.webp


用 mac 自带的 QuickTime 录制的音频采样率默认为 48 kHz。而百度要求采样率是 16 kHz
如果你不把采样率转成符合它的要求,则会下面的状态码 3307 ,服务端语音识别错误

696c012ac79500e4ddc3d0b5f21f0b20.webp




解决方案很简单,按百度的要求来呗!把音频采样率转化一下。
安装第三方库 ffmpeg-python
pip install ffmpeg-python

11d7608458b4127f8666ab5b5e6cf23b.webp


一行代码即可完成转化采样率:
import ffmpegffmpeg.input('mi.wav').output('mi2.wav', ar=16000).run()

如果执行这段代码后,报错:

7b645a5e2df1496c453d9b7608650fd2.webp


mac的同学用下面命令安装下 ffmpeg 即可,windows同学估计不会遇到,如果遇到,自行去官网下载安装尝试下。
brew install ffmpeg

安装成功后,执行代码,可以看到生成了新的音频文件:

58e29a24703f75f23fa563a0843f9f99.webp


回到语音转文字代码的文件中,再次执行代码:

f61a25effd3fdfb8bb729012d1b18ba0.webp


先看百度解析成功,返回的文字结果在 key 为 result 中,其中是个 list,所以直接取出来即可。
可以发现,结果中文并不准确。此时用的 1537,而 Siri 配音的可能带点外国口音,所以试试 1536 。

b3c5aead3ee3731466a7972dd132e47b.webp


看来还是有一些误差的,Siri男版口音可能严重些,至于怎么选输入法模型的 dev_pid 码,自己尝试,看看准确率高的即可。上面有介绍到官方文档的码表。

4

总结


简单总结下,这篇文章即符合主线机器人,也符合之前后台提问题的那个小伙伴。上述所有过程,都是我在编码过程中亲身遇到的坑。


所以可以借鉴,没遇到相同错误更好,遇到了自己对着百度的官网看看到底是什么错误。


至于本篇文章的编码,涉及的不多,就不上传到 github 了,下一篇要讲下如何用 Python 玩转 Word 操作,所以打算把下篇文章涉及到的代码留个记录,转语音后的文字,落地到 Word 中,敬请期待!


如果学习中遇到什么问题的小伙伴,欢迎评论区下方留言!87850a839bf4109b0ff1c97f9eedd17b.webp





▼往期精彩回顾▼Python调用百度API实现语音识别(一)
用Python玩转视频剪辑,秀的飞起!Python实现电脑录音(含音频基础知识讲解)



58c2c4ba0984e93834673dfb11afb814.webp你点的每个在看,我都认真当成了喜欢


浏览 45
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报