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 yield使用方法示例
Dec 04 Python
flask + pymysql操作Mysql数据库的实例
Nov 13 Python
TensorFlow损失函数专题详解
Apr 26 Python
python 删除非空文件夹的实例
Apr 26 Python
详解Python3.6安装psutil模块和功能简介
May 30 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
Jul 11 Python
python 实现让字典的value 成为列表
Dec 16 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
Mar 09 Python
Python脚本导出为exe程序的方法
Mar 25 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 Python
利用Vscode进行Python开发环境配置的步骤
Jun 22 Python
Python2与Python3关于字符串编码处理的差别总结
Sep 07 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
星际争霸任务指南——神族
2020/03/04 星际争霸
Zerg剧情介绍
2020/03/14 星际争霸
PHP的面试题集,附我的答案和分析(一)
2006/11/19 PHP
PHP判断图片格式的七种方法小结
2013/06/03 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
PHP实现登录注册之BootStrap表单功能
2017/09/03 PHP
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
javascript打印输出json实例
2013/11/11 Javascript
js确认删除对话框效果的示例代码
2014/02/20 Javascript
js判断滚动条是否已到页面最底部或顶部实例
2014/11/20 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
2016/03/14 Javascript
详解jQuery中的deferred对象的使用(一)
2016/05/27 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
如何使用JavaScript实现无缝滚动自动播放轮播图效果
2020/08/20 Javascript
Vue使用screenfull实现全屏效果
2020/09/17 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
深入了解Vue3模板编译原理
2020/11/19 Vue.js
python3图片转换二进制存入mysql
2013/12/06 Python
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
Python 搭建Web站点之Web服务器网关接口
2016/11/06 Python
python中解析json格式文件的方法示例
2017/05/03 Python
详解python函数传参是传值还是传引用
2018/01/16 Python
Python:slice与indices的用法
2019/11/25 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
大学生毕业自我鉴定范文
2014/02/03 职场文书
小学开学典礼主持词
2014/03/19 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
公司车队管理制度
2015/08/04 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书