欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python语音识别实践之百度语音API

程序员文章站 2024-01-21 20:15:58
百度语音对上传的语音要求目前必须是单声道,16k采样率,采样深度可以是16位或者8位的pcm编码。其他编码输出的语音识别不出来。 语音的处理技巧: 录制为mp3的语音(...

百度语音对上传的语音要求目前必须是单声道,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']))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。