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 相关文章推荐
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
Sep 06 Python
Python中subprocess的简单使用示例
Jul 28 Python
python与sqlite3实现解密chrome cookie实例代码
Jan 20 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
python线程池threadpool使用篇
Apr 27 Python
使用Python监控文件内容变化代码实例
Jun 04 Python
Python3实现的Mysql数据库操作封装类
Jun 06 Python
python 消除 futureWarning问题的解决
Dec 25 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
Python如何执行系统命令
Sep 23 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
Nov 15 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 IP及IP段进行访问限制的代码
2008/12/17 PHP
按上下级层次关系输出内容的PHP代码
2010/07/17 PHP
php引用传值实例详解学习
2013/11/06 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
php实现微信支付之企业付款
2018/05/30 PHP
简单JS代码压缩器
2006/10/12 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
浅析js绑定事件的常用方法
2016/05/15 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
2018/03/06 Javascript
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
Python中的Numpy入门教程
2014/04/26 Python
python 的列表遍历删除实现代码
2020/04/12 Python
Python编程中time模块的一些关键用法解析
2016/01/19 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
canvas绘制圆角头像的实现方法
2019/01/17 HTML / CSS
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
英格兰足协官方商店:England Store
2019/07/12 全球购物
化学相关工作求职信
2013/10/02 职场文书
学前教育毕业生自荐信范文
2013/12/24 职场文书
元旦晚会策划方案
2014/02/18 职场文书
岗位职责风险点
2014/03/12 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
python中 Flask Web 表单的使用方法
2022/05/20 Python