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之hello world
May 21 Python
使用python和Django完成博客数据库的迁移方法
Jan 05 Python
python2 与python3的print区别小结
Jan 16 Python
Python遍历pandas数据方法总结
Feb 09 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
May 15 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
浅析python内置模块collections
Nov 15 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
Pandas实现一列数据分隔为两列
May 18 Python
Python使用shutil模块实现文件拷贝
Jul 31 Python
scrapy处理python爬虫调度详解
Nov 23 Python
python 中[0]*2与0*2的区别说明
May 10 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.ini中文版(2)
2006/10/09 PHP
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
微盾PHP脚本加密专家php解密算法
2020/09/13 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
2019/03/27 PHP
js 调整select 位置的函数
2008/02/21 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
Jquery组件easyUi实现表单验证示例
2016/08/23 Javascript
使用 bootstrap modal遇到的问题小结
2016/11/09 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
pycharm设置鼠标悬停查看方法设置
2019/07/29 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
Python实现图片识别加翻译功能
2019/12/26 Python
Django实现将views.py中的数据传递到前端html页面,并展示
2020/03/16 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
华润集团网上药店:健一网
2016/09/19 全球购物
Crabtree & Evelyn英国官网:瑰珀翠护手霜、香水、沐浴和身体护理
2018/04/26 全球购物
会计学自我鉴定
2014/02/06 职场文书
坚定理想信念心得体会
2014/03/11 职场文书
个人授权委托书范本
2014/04/03 职场文书
银行内勤岗位职责
2014/04/09 职场文书
班主任先进事迹材料
2014/12/17 职场文书
初中军训感想
2015/08/07 职场文书
Redis 哨兵集群的实现
2021/06/18 Redis
TypeScript 内置高级类型编程示例
2022/09/23 Javascript