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多线程扫描端口示例
Jan 16 Python
Windows下安装python2.7及科学计算套装
Mar 05 Python
python链接Oracle数据库的方法
Jun 28 Python
编写自定义的Django模板加载器的简单示例
Jul 21 Python
Python实现基本线性数据结构
Aug 22 Python
python删除服务器文件代码示例
Feb 09 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
对numpy中数组转置的求解以及向量内积计算方法
Oct 31 Python
pycharm 取消默认的右击运行unittest的方法
Nov 29 Python
python制作朋友圈九宫格图片
Nov 03 Python
python如何设置静态变量
Sep 07 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 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面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
2015/12/03 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
2016/05/05 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
WEEX环境搭建与入门详解
2019/10/16 Javascript
js实现动态时钟
2020/03/12 Javascript
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python创建和使用字典实例详解
2013/11/01 Python
python实现的一个火车票转让信息采集器
2014/07/09 Python
python任务调度实例分析
2015/05/19 Python
Python中的lstrip()方法使用简介
2015/05/19 Python
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
python executemany的使用及注意事项
2017/03/13 Python
Python实现点云投影到平面显示
2020/01/18 Python
HTML5 拖放功能实现代码
2016/07/14 HTML / CSS
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
类和结构的区别
2012/08/15 面试题
讲文明树新风演讲稿
2014/05/12 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
给朋友的道歉短信
2015/05/12 职场文书
催款函范文
2015/06/24 职场文书
Python基础之字符串格式化详解
2021/04/21 Python
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技