python语音识别实践之百度语音API


Posted in Python onAugust 30, 2018

百度语音对上传的语音要求目前必须是单声道,16K采样率,采样深度可以是16位或者8位的PCM编码。其他编码输出的语音识别不出来。

语音的处理技巧:

录制为MP3的语音(通常采样率为44100),要分两步才能正确处理。第一步:使用诸如GoldWave的软件,先保存为16K采样率的MP3;第二步,打开16K采样率的MP3,另存为Wav格式,参数选择PCM,单声道即可。

另外,也可以使用ffmpeg将MP3处理为PCM。后文的程序即采用这种方法。

由于PCM编码的语音没有压缩,文件体积与语音长度成正比。百度语音平台对语音的长度的限制未知。文件太大,网速不好的时候,容易出现”连接错误“的提示。因此,对时间较长的语音,应该将语音分割成多个序列,在分别进行识别。(目前按照等长分割)

以下代码,使用前,需要在baidu 开发者上申请相关的API ID, API Key, Secret Key,并以申请的参数代入到文件中。

# 引入Speech SDK
from aip import AipSpeech
import subprocess
import datetime
import sys
import os
import time
from pydub import AudioSegment
import math
 
# 定义常量
#APP_ID = '你的 App ID'
APP_ID = '937****'
#API_KEY = '你的 API Key'
API_KEY = 'mOV9QaabNnkur0Aba15T****'
#SECRET_KEY = '你的 Secret Key'
SECRET_KEY = '097111374ad26d4ba00937c5e332****'
# 初始化AipSpeech对象
aipSpeech = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
 
# 文件处理
def get_wave_filename(fileFullName):
 # MP3文件转换成wav文件
 # 判断文件后缀,是mp3的,直接处理为16k采样率的wav文件;
 # 是wav的,判断文件的采样率,不是8k或者16k的,直接处理为16k的采样率的wav文件
 # 其他情况,就直接返回AudioSegment直接处理
 fileSufix = fileFullName[fileFullName.rfind('.')+1:]
 print(fileSufix)
 filePath = fileFullName[:fileFullName.find(os.sep)+1]
 print(filePath)
 if fileSufix.lower() == "mp3":
 wavFile = "wav_%s.wav" %datetime.datetime.now().strftime('%Y%m%d%H%M%S')
 wavFile = filePath + wavFile
 cmdLine = "ffmpeg -i \"%s\" -ar 16000 " %fileFullName
 cmdLine = cmdLine + "\"%s\"" %wavFile
 print(cmdLine)
 ret = subprocess.run(cmdLine)
 print("ret code:%i" %ret.returncode)
 return wavFile
 #if ret.returncode == 1:
 # return wavFile
 #else:
 # return None
 else:
 return fileFullName
 
 
#文件分片
try:
 script, fileFullName = sys.argv
except:
 print("参数 文件名 未指定!")
 exit()
 
if not os.path.isfile(fileFullName):
 print("参数 %s 不是一个文件名" %fileFullName)
 exit()
 
if not os.path.exists(fileFullName):
 print("参数 %s 指定的文件不存在" %fileFullName)
 exit()
 
filePath = fileFullName[:fileFullName.find(os.sep)+1]
# 文件处理为Wav,采样率16k的文件,返回文件名
wavFile = get_wave_filename(fileFullName)
print(wavFile)
record = AudioSegment.from_wav(wavFile)
if wavFile != fileFullName:
 time.sleep(1)
 os.remove(wavFile)
 
recLen = record.duration_seconds
interval = 120 * 1000
maxLoop = math.ceil(recLen*1000/float(interval))
for n in range(0,math.ceil(recLen*1000/float(interval))):
 recSeg = record[n * interval : (n + 1)*interval]
 #print("Segment:%i,startat:%i,length:%i" %n,n*interval/1000,recSeg.duration_seconds)
 print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + " >> Segment:" + str(n) +"/" + str(maxLoop))
 segFile = filePath + "seg%s.wav" %("0"*7 + str(n))[-6:]
 # 把分段的语音信息保存为临时文件
 file_handle = recSeg.export(segFile,format="wav",codec = "libvorbis")
 file_handle.close()
 # 读取分段的临时文件为字节
 file_handle = open(segFile, 'rb')
 file_content = file_handle.read()
 file_handle.close()
 # 删除临时文件
 os.remove(segFile)
 # 用百度API处理该语音
 result=aipSpeech.asr(file_content, 'pcm', 16000, {'lan': 'zh'})
 if result['err_no'] == 0:
 print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + " >> " + result['result'][0])
 else:
 print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + " >> " + "err_no:" + str(result['err_no']))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Django通用视图中的函数包装
Jul 21 Python
解决pycharm运行时interpreter为空的问题
Oct 29 Python
Python实现简易过滤删除数字的方法小结
Jan 09 Python
python 发送和接收ActiveMQ消息的实例
Jan 30 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 Python
利用python实现冒泡排序算法实例代码
Dec 01 Python
pytorch实现onehot编码转为普通label标签
Jan 02 Python
什么是python的函数体
Jun 19 Python
对python中list的五种查找方法说明
Jul 13 Python
k-means & DBSCAN 总结
Apr 27 Python
python调用百度语音识别实现大音频文件语音识别功能
Aug 30 #Python
python的中异常处理机制
Aug 30 #Python
python调用百度REST API实现语音识别
Aug 30 #Python
python调用百度语音REST API
Aug 30 #Python
python调用百度语音识别api
Aug 30 #Python
python实现ID3决策树算法
Aug 29 #Python
python实现C4.5决策树算法
Aug 29 #Python
You might like
PHP 转义使用详解
2013/07/15 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
JS解析XML实例分析
2015/01/30 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
2016/09/06 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
node.js中cluster的使用教程
2017/06/09 Javascript
基于zepto.js实现登录界面
2017/10/09 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
详解Angular6 热加载配置方案
2018/08/18 Javascript
jQuery pagination分页示例详解
2018/10/23 jQuery
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
vue2.0实现列表数据增加和删除
2020/06/17 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
Python中os和shutil模块实用方法集锦
2014/05/13 Python
在Python中使用__slots__方法的详细教程
2015/04/28 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
python支持多继承吗
2020/06/19 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
Python Spyder 调出缩进对齐线的操作
2021/02/26 Python
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
Linux面试题LINUX系统类
2014/11/19 面试题
我未来的职业规划范文
2014/01/11 职场文书
电力安全事故反思
2014/04/27 职场文书
关于安全演讲稿
2014/05/09 职场文书
汉语言文学毕业求职信
2014/07/17 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
大学军训口号大全
2015/12/24 职场文书