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简单程序读取串口信息的方法
Mar 13 Python
Python中字符串对齐方法介绍
May 21 Python
Python 打印中文字符的三种方法
Aug 14 Python
python  Django中的apps.py的目的是什么
Oct 15 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
Nov 29 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
Python实现图片批量加入水印代码实例
Nov 30 Python
Keras 使用 Lambda层详解
Jun 10 Python
Python爬虫设置ip代理过程解析
Jul 20 Python
基于django和dropzone.js实现上传文件
Nov 24 Python
Python 调用C++封装的进一步探索交流
Mar 04 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
怎么使 Mysql 数据同步
2006/10/09 PHP
PHP 身份证号验证函数
2009/05/07 PHP
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
JavaScript 利用Cookie记录用户登录信息
2009/12/08 Javascript
javascript奇异的arguments分析
2010/10/20 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
javascript中的this详解
2014/12/08 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
查看python安装路径及pip安装的包列表及路径
2019/04/03 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
python实现银行实战系统
2020/02/26 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
Kate Spade美国官网:纽约新兴时尚品牌,以包包闻名于世
2017/11/09 全球购物
*p++ 自增p 还是p所指向的变量
2016/07/16 面试题
公司业务主管岗位职责
2013/12/07 职场文书
班组长安全生产职责
2013/12/16 职场文书
留学生如何写好自荐信
2013/12/27 职场文书
市场营销调查计划书
2014/05/02 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书
庆七一晚会主持词
2015/06/30 职场文书
公司业务员管理制度
2015/08/05 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
部分武汉产收音机展览
2022/04/07 无线电
Win11筛选键导致键盘失灵怎么解决? Win11关闭筛选键的技巧
2022/04/08 数码科技