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中字典(dict)和列表(list)的排序方法实例
Jun 16 Python
基于Python的身份证号码自动生成程序
Aug 15 Python
python选择排序算法实例总结
Jul 01 Python
python实现多线程的方式及多条命令并发执行
Jun 07 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
Python进阶之递归函数的用法及其示例
Jan 31 Python
浅谈tensorflow中几个随机函数的用法
Jul 27 Python
在Python文件中指定Python解释器的方法
Feb 18 Python
python getopt模块使用实例解析
Dec 18 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
python手机号前7位归属地爬虫代码实例
Mar 31 Python
python中字符串的编码与解码详析
Dec 03 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连接SQLServer2005 的问题解决方法
2010/07/19 PHP
PHP连接Access数据库的方法小结
2013/06/20 PHP
Php无限级栏目分类读取的实现代码
2014/02/19 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
img onload事件绑定各浏览器均可执行
2012/12/19 Javascript
jquery如何获取复选框的值
2013/12/12 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
vue单页开发父子组件传值思路详解
2018/05/18 Javascript
vue v-model的用法解析
2020/10/19 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
Python简单的制作图片验证码实例
2017/05/31 Python
Python3 操作符重载方法示例
2017/11/23 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
详解django.contirb.auth-认证
2018/07/16 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
java中的控制结构(if,循环)详解
2019/06/26 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
家居设计专业个人自荐信范文
2013/11/26 职场文书
售后服务承诺书范文
2014/03/26 职场文书
岗位廉政承诺书
2014/03/27 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
表彰大会新闻稿
2015/07/17 职场文书
2015年小学远程教育工作总结
2015/07/28 职场文书
学习党史心得体会2016
2016/01/23 职场文书
写作技巧:优秀文案必备的3种结构
2019/08/19 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis