Python调用百度语音API实战:音频预处理与识别流程详解
本文详解Python调用百度语音API的完整流程,重点解析音频预处理技巧。针对MP3格式需转换为单声道16K采样率的PCM编码,提供了GoldWave与ffmpeg两种处理方法。同时探讨了长语音分割策略以规避连接错误,并附带完整的Python代码示例及API配置说明。
百度语音API对上传的音频文件有明确格式要求:必须为单声道,采样率固定为16K,采样深度支持16位或8位的PCM编码。若使用其他编码格式,将无法进行有效识别。
针对语音数据的预处理,建议采用以下技巧:
若原始录音为MP3格式(通常采样率为44100Hz),需分两步处理方可符合识别要求。第一步,利用GoldWave等音频编辑软件,将文件另存为采样率16K的MP3格式;第二步,打开该16K MP3文件,再次另存为WAV格式,在参数设置中选择PCM编码并指定为单声道。
此外,也可使用ffmpeg工具直接将MP3转换为PCM格式,后续代码示例即采用此方法实现。
由于PCM编码属于无损未压缩格式,文件体积与语音时长成正比。百度语音平台对单次语音时长的具体限制尚未明确公布。当文件过大且网络状况不佳时,极易触发“连接错误”提示。因此,对于时长较长的语音,建议将其分割为多个片段分别进行识别(目前采用等长分割策略)。
运行以下代码前,需先在百度开发者平台申请对应的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']))
以上内容为本文全部介绍,希望能为各位的学习提供有益帮助,同时也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













