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 字符串中的字符倒转
Sep 06 Python
python中 ? : 三元表达式的使用介绍
Oct 09 Python
python实现给字典添加条目的方法
Sep 25 Python
Python2.x版本中maketrans()方法的使用介绍
May 19 Python
python下实现二叉堆以及堆排序的示例
Sep 29 Python
python决策树之C4.5算法详解
Dec 20 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
用python 实现在不确定行数情况下多行输入方法
Jan 28 Python
jupyter notebook 多环境conda kernel配置方式
Apr 10 Python
500行python代码实现飞机大战
Apr 24 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
Apr 26 Python
Python实现Kerberos用户的增删改查操作
Dec 14 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文件上传后端处理小技巧
2016/05/22 PHP
JS实现随机数生成算法示例代码
2013/08/08 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
详解在Python程序中使用Cookie的教程
2015/04/30 Python
python中map()与zip()操作方法
2016/02/27 Python
Python彩色化Linux的命令行终端界面的代码实例分享
2016/07/02 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
2019/01/15 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
python学生信息管理系统实现代码
2019/12/17 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
详解python的super()的作用和原理
2020/10/29 Python
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
澳大利亚票务和娱乐市场领导者:Ticketmaster
2017/03/03 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
制药工程专业个人求职自荐信
2014/01/25 职场文书
租房协议书
2014/04/10 职场文书
公务员政审材料
2014/12/23 职场文书
聘任书的格式及模板
2019/10/28 职场文书
Python自动化测试PO模型封装过程详解
2021/06/22 Python
nginx服务器的下载安装与使用详解
2021/08/02 Servers
vue使用refs获取嵌套组件中的值过程
2022/03/31 Vue.js