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']))
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: mysql 触发器的 like 语句