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多线程学习资料
Dec 19 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
May 25 Python
python距离测量的方法
Mar 06 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
Python socket实现的简单通信功能示例
Aug 21 Python
python2与python3的print及字符串格式化小结
Nov 30 Python
Python中的元组介绍
Jan 28 Python
python的pygal模块绘制反正切函数图像方法
Jul 16 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
django实现模型字段动态choice的操作
Apr 01 Python
将python字符串转化成长表达式的函数eval实例
May 11 Python
Python实现智慧校园自动评教全新版
Jun 18 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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
关于webuploader插件使用过程遇到的小问题
2016/11/07 Javascript
javascript实现右下角广告框效果
2017/02/01 Javascript
JS实现模糊查询带下拉匹配效果
2018/06/21 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
2019/07/05 Javascript
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
Python Deque 模块使用详解
2014/07/04 Python
利用Python破解验证码实例详解
2016/12/08 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
python面试题小结附答案实例代码
2019/04/11 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
Python执行时间的几种计算方法
2020/07/31 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
Linux操作面试题
2012/05/16 面试题
门卫岗位安全职责
2013/12/13 职场文书
主题实践活动总结
2014/05/08 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书
使用Redis实现实时排行榜功能
2021/07/02 Redis