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设计模式之代理模式实例
Apr 26 Python
Python程序员开发中常犯的10个错误
Jul 07 Python
Python生成验证码实例
Aug 21 Python
使用Python编写一个在Linux下实现截图分享的脚本的教程
Apr 24 Python
介绍Python中的__future__模块
Apr 27 Python
Python计算三角函数之asin()方法的使用
May 15 Python
深入解析Python中的lambda表达式的用法
Aug 28 Python
python学生管理系统开发
Jan 30 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
Mar 17 Python
Python 实现一个计时器
Jul 28 Python
python批量修改交换机密码的示例
Sep 22 Python
python中的sys模块和os模块
Mar 20 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错误Warning: Cannot modify header information - headers already sent by解决方法
2014/09/27 PHP
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
js 处理URL实用技巧
2010/11/23 Javascript
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
js实现在字符串中提取数字
2013/11/05 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
2013/11/23 Javascript
js返回前一页刷新本页重载页面
2014/07/29 Javascript
nw.js实现类似微信的聊天软件
2015/03/16 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
javascript验证内容为数字以及长度为10的简单实例
2016/08/20 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
angular forEach方法遍历源码解读
2017/01/25 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
mint-ui的search组件在键盘显示搜索按钮的实现方法
2017/10/27 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
村党支部公开承诺书
2014/05/29 职场文书
幼师求职信
2014/06/23 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
放假通知
2015/04/14 职场文书
二审代理词范文
2015/05/25 职场文书
医院感染管理制度
2015/08/05 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android
深入理解MySQL中MVCC与BufferPool缓存机制
2022/05/25 MySQL
Python加密与解密模块hashlib与hmac
2022/06/05 Python