Python调用百度语音API实战:音频预处理与识别流程详解

Nora
Nora
发布时间:2026-10-13 | 4人浏览过
原创

本文详解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']))

以上内容为本文全部介绍,希望能为各位的学习提供有益帮助,同时也欢迎大家继续支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表