百度语音识别API的使用样例(Python实现)
一、百度语音识别API概述
百度语音识别API是百度智能云提供的语音转文字服务,支持实时流式识别和异步文件识别两种模式,覆盖中文、英文及中英混合场景。其核心技术基于深度神经网络,具备高准确率、低延迟的特点,适用于智能客服、会议记录、语音输入等场景。开发者通过调用RESTful API即可实现语音到文本的转换,无需搭建复杂的语音处理模型。
1.1 API核心功能
- 实时语音识别:支持麦克风实时输入或音频流推送,返回逐字识别的中间结果和最终结果。
- 异步文件识别:上传音频文件后,通过轮询或回调获取识别结果,适合长音频处理。
- 多场景适配:提供电话场景、近场/远场语音、视频语音等专用模型。
- 参数定制:可设置语言类型、是否包含标点、是否过滤脏词等。
1.2 技术优势
- 高准确率:中文普通话识别准确率达98%以上(官方数据)。
- 低延迟:实时识别首字响应时间<300ms。
- 多格式支持:兼容wav、pcm、mp3、amr等常见音频格式。
- 弹性扩展:按需调用,支持高并发请求。
二、Python实现前的准备工作
2.1 环境配置
- Python版本:建议使用3.6+版本。
- 依赖库:
pip install requests pydub # pydub用于音频格式转换
- 音频处理工具:若需处理非标准格式音频,可安装ffmpeg:
# Ubuntusudo apt-get install ffmpeg# macOSbrew install ffmpeg
2.2 获取API密钥
- 登录百度智能云控制台。
- 创建应用并获取
API Key和Secret Key。 - 确保已开通”语音识别”服务(免费额度内可免费试用)。
三、Python实现详解
3.1 基础实现:异步文件识别
import base64import hashlibimport jsonimport timeimport requestsfrom urllib.parse import urlencode# 配置参数API_KEY = '您的API_KEY'SECRET_KEY = '您的SECRET_KEY'AUDIO_FILE = 'test.wav' # 支持16k/8k采样率,16bit位深,单声道def get_access_token():"""获取百度API访问令牌"""auth_url = f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={API_KEY}&client_secret={SECRET_KEY}"resp = requests.get(auth_url)return resp.json().get('access_token')def file_recognition(access_token):"""异步文件识别"""# 读取音频文件并base64编码with open(AUDIO_FILE, 'rb') as f:audio_data = base64.b64encode(f.read()).decode('utf-8')# 请求参数url = f"https://vop.baidu.com/server_api?access_token={access_token}"headers = {'Content-Type': 'application/json'}data = {"format": "wav","rate": 16000, # 采样率"channel": 1, # 单声道"cuid": "your_device_id", # 设备ID(可选)"token": access_token,"speech": audio_data,"len": len(audio_data)}# 发送请求resp = requests.post(url, headers=headers, data=json.dumps(data))result = resp.json()if result.get('err_no') == 0:task_id = result['sn']# 轮询获取结果for _ in range(30): # 最多轮询30次time.sleep(1)result_url = f"https://vop.baidu.com/pro_api?access_token={access_token}"result_data = {"task_id": task_id,"token": access_token}result_resp = requests.post(result_url, headers=headers, data=json.dumps(result_data))final_result = result_resp.json()if final_result.get('err_no') == 0 and 'result' in final_result:return final_result['result'][0] # 返回识别结果return "超时未获取结果"else:return f"请求失败: {result.get('err_msg')}"# 使用示例if __name__ == "__main__":token = get_access_token()print("识别结果:", file_recognition(token))
3.2 进阶实现:实时流式识别
import websocketimport jsonimport threadingimport base64import hashlibclass RealTimeRecognizer:def __init__(self, api_key, secret_key):self.api_key = api_keyself.secret_key = secret_keyself.access_token = Noneself.ws_url = Noneself.is_open = Falsedef get_token(self):auth_url = f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={self.api_key}&client_secret={self.secret_key}"resp = requests.get(auth_url)self.access_token = resp.json().get('access_token')def connect_ws(self):"""建立WebSocket连接"""if not self.access_token:self.get_token()# 获取WebSocket地址(实际需通过REST API获取,此处简化)self.ws_url = f"wss://vop.baidu.com/ws_api?access_token={self.access_token}"def on_message(ws, message):"""处理WebSocket消息"""data = json.loads(message)if data.get('error_code'):print(f"错误: {data.get('error_msg')}")elif 'result' in data:print("识别结果:", data['result']['result'][0])def on_error(ws, error):print("连接错误:", error)def on_close(ws):self.is_open = Falseprint("连接已关闭")websocket.enableTrace(False)self.ws = websocket.WebSocketApp(self.ws_url,on_message=on_message,on_error=on_error,on_close=on_close)self.ws.on_open = lambda ws: self.send_audio(ws)self.is_open = Trueself.ws.run_forever()def send_audio(self, ws):"""发送音频数据(示例中简化,实际需从麦克风或文件读取)"""# 模拟发送音频块(实际应实现音频采集逻辑)for i in range(10): # 发送10个模拟音频块audio_chunk = b'\x00' * 320 # 16000Hz采样率下20ms的音频数据encoded_chunk = base64.b64encode(audio_chunk).decode('utf-8')frame = {"format": "wav","rate": 16000,"audio": encoded_chunk,"encoding": "raw"}ws.send(json.dumps(frame))time.sleep(0.02) # 模拟20ms间隔# 发送结束标记ws.send(json.dumps({"end": True}))def start(self):"""启动实时识别"""if not self.is_open:threading.Thread(target=self.connect_ws).start()# 使用示例if __name__ == "__main__":recognizer = RealTimeRecognizer(API_KEY, SECRET_KEY)recognizer.start()
3.3 关键参数说明
| 参数 | 说明 | 推荐值 |
|---|---|---|
format |
音频格式 | wav/pcm/mp3 |
rate |
采样率 | 16000(推荐)或8000 |
channel |
声道数 | 1(单声道) |
dev_pid |
识别模型ID | 1537(普通话)、1737(英语) |
len |
音频长度(字节) | 实际音频大小 |
四、优化与异常处理
4.1 性能优化建议
-
音频预处理:
- 使用
pydub统一转换为16kHz、16bit、单声道的wav格式from pydub import AudioSegmentdef convert_audio(input_path, output_path):audio = AudioSegment.from_file(input_path)audio = audio.set_frame_rate(16000)audio = audio.set_channels(1)audio.export(output_path, format="wav")
- 使用
-
分块上传:对于长音频,建议分割为<60秒的片段
-
连接复用:避免频繁创建/销毁WebSocket连接
4.2 常见错误处理
| 错误码 | 原因 | 解决方案 |
|---|---|---|
| 110 | Access Token无效 | 重新获取token |
| 111 | Token过期 | 重新获取token |
| 112 | 请求频率过高 | 增加请求间隔 |
| 113 | 音频格式不支持 | 转换为标准格式 |
| 114 | 音频过长 | 分割音频文件 |
五、实际应用场景示例
5.1 会议记录系统
def record_meeting(audio_path, output_file):"""会议录音转文字"""token = get_access_token()with open(audio_path, 'rb') as f:audio_data = base64.b64encode(f.read()).decode('utf-8')url = f"https://vop.baidu.com/server_api?access_token={token}"data = {"format": "wav","rate": 16000,"channel": 1,"dev_pid": 1537, # 会议场景模型"speech": audio_data}resp = requests.post(url, json=data)result = resp.json()if result.get('err_no') == 0:with open(output_file, 'w', encoding='utf-8') as f:f.write(result['result'][0])print(f"识别结果已保存至{output_file}")else:print("识别失败:", result.get('err_msg'))
5.2 智能客服语音转写
class CustomerServiceASR:def __init__(self):self.token = get_access_token()self.session_id = 0def transcribe_call(self, audio_stream):"""实时转写客服通话"""self.session_id += 1ws_url = f"wss://vop.baidu.com/ws_api?access_token={self.token}&session_id={self.session_id}"def on_message(ws, message):data = json.loads(message)if 'result' in data:print("客服:", data['result']['result'][0])ws = websocket.WebSocketApp(ws_url,on_message=on_message)# 模拟发送音频流for chunk in audio_stream: # 实际应从网络接收ws.send(json.dumps({"audio": base64.b64encode(chunk).decode('utf-8'),"format": "wav","rate": 16000}))ws.run_forever()
六、总结与建议
百度语音识别API的Python实现具有以下特点:
- 易用性:提供清晰的RESTful接口和WebSocket协议
- 灵活性:支持多种识别模式和参数配置
- 可靠性:百度云基础设施保障服务稳定性
开发建议:
- 对于短音频,优先使用异步文件识别
- 对于实时场景,实现WebSocket连接管理
- 添加重试机制处理网络波动
- 监控API调用量避免超额费用
进阶方向:
- 结合NLP技术实现语义分析
- 构建语音交互机器人
- 实现多语言混合识别
- 开发语音搜索功能
通过本文的详细讲解和代码示例,开发者可以快速掌握百度语音识别API的Python实现方法,并根据实际需求进行定制开发。