对于“Python调用百度api实现语音识别”的完整攻略,我将分成以下几个部分进行讲解。
1. 百度AI平台的申请和配置
在使用百度AI平台的语音识别API前,需要先进行相关配置。具体步骤如下:
1.1 注册百度智能云账号
如果你没有百度智能云的账号,需要先进行注册。注册地址为:https://cloud.baidu.com/
1.2 创建应用
创建应用是为了在百度AI平台上获取相关的API Key和Secret Key。创建应用时需要选择“语音识别”服务,并填写相关信息。具体创建步骤可以参照百度AI平台的官方文档进行。
1.3 获取API Key和Secret Key
在创建应用后,百度AI平台会生成一对API Key和Secret Key。这两个Key是调用百度AI平台的接口时必须的参数,需要妥善保管。
2. 安装Python依赖库
在使用Python调用百度AI平台的接口时,需要使用到以下两个Python第三方库:
- requests
- json
可以使用以下命令进行安装:
pip install requests json
3. 调用百度AI平台的语音识别接口
调用百度AI平台的语音识别接口需要构造一个特定的HTTP请求,并包含相应的API Key和Secret Key等参数。具体步骤如下:
3.1 构造HTTP请求
需要构造以下参数:
- 必须参数:
- URL:接口的URL,需要根据具体需要选择对应的URL。例如使用语音识别接口的URL为:https://vop.baidu.com/server_api
- Method:请求方法,一般为POST
- Content-Type:请求的内容格式,一般为application/json
- 参数部分:
- dev_pid:识别模型ID,具体可以参考官方文档。例如使用通用模型(中文普通话)的模型ID为1537
- rate:
- len:
- channels:
- cuid:用户ID,可以为空
3.2 添加API Key和Secret Key
在构造HTTP请求中,需要添加API Key和Secret Key等参数。具体添加方式如下:
import hashlib
import hmac
api_key = "your_api_key"
secret_key = "your_secret_key"
def generate_signature(api_key,secret_key,url,params):
sign_params = ''
for key in sorted(params.keys()):
sign_params += '{}={}'.format(key,params[key])
sign_str = url+'?'+sign_params+secret_key
sign = hmac.new(api_key.encode('utf-8'),sign_str.encode('utf-8'),hashlib.sha1).hexdigest()
return sign
生成签名后,需要将签名添加到HTTP请求的参数中。
3.3 调用API接口并处理响应
可以使用Python的requests库来发送HTTP请求,并处理响应结果。以下是一个示例代码:
import requests
import json
url = "https://vop.baidu.com/server_api"
api_key = "your_api_key"
secret_key = "your_secret_key"
dev_pid = 1537
rate = 16000
len = 0
channels = 1
cuid ="test_python"
token = '24.14970dep0506HEksRSEUH1NNZkc-PCRn3H-hWf5YYUVA8dn0512FZP12OVzfXHWokiY_eRlQYyMYUhPmX4-YTTNYcldKQ'
params = {
"format": "wav",
"rate": rate,
"lan": "zh",
"token": token,
"len": len,
"channel": channels,
"cuid": cuid,
"dev_pid": dev_pid,
}
headers = {
'Content-Type': 'application/json',
}
signature = generate_signature(api_key,secret_key,url,params)
params['signature'] = signature
file_path = "path-to-your-audio-file"
files = [
('audio', ('file', open(file_path, 'rb'), 'audio/wav'))
]
response = requests.post(url=url,data=params, headers=headers,files=files).json()
if response:
result = response.get('result',[])
if result:
print(result[0])
else:
print('识别失败')
else:
print('调用API失败')
以上代码中,需要注意的是:
- 在构造HTTP请求时,需要根据具体的参数构造请求URI和请求参数
- 在调用API接口时,需要添加签名等安全相关参数
- 在发送HTTP请求时,需要以文件的形式上传音频文件,并包含相关的请求头信息
4. 示例说明
以下是两个Python调用百度语音识别API的示例说明。
示例1. 语音识别本地音频文件
假设有一个本地音频文件test.wav
,需要对该音频文件进行语音识别。可以使用以下代码:
import requests
import json
url = "https://vop.baidu.com/server_api"
api_key = "your_api_key"
secret_key = "your_secret_key"
dev_pid = 1537
rate = 16000
len = 0
channels = 1
cuid ="test_python"
token = '24.14970dep0506HEksRSEUH1NNZkc-PCRn3H-hWf5YYUVA8dn0512FZP12OVzfXHWokiY_eRlQYyMYUhPmX4-YTTNYcldKQ'
params = {
"format": "wav",
"rate": rate,
"lan": "zh",
"token": token,
"len": len,
"channel": channels,
"cuid": cuid,
"dev_pid": dev_pid,
}
headers = {
'Content-Type': 'application/json',
}
signature = generate_signature(api_key,secret_key,url,params)
params['signature'] = signature
file_path = "test.wav"
files = [
('audio', ('file', open(file_path, 'rb'), 'audio/wav'))
]
response = requests.post(url=url,data=params, headers=headers,files=files).json()
if response:
result = response.get('result',[])
if result:
print(result[0])
else:
print('识别失败')
else:
print('调用API失败')
以上演示了如何调用百度API实现语音识别。在实际使用时,需要修改相应的参数,比如api_key
和secret_key
是需要替换成自己的Key的。
示例2. 实时语音识别
如果需要实现实时语音识别,可以将录制的语音进行分片,并通过Websocket实时进行发送。以下是一个示例代码:
import json
import time
import uuid
import threading
import websocket
import pyaudio
def generate_ws_url(token):
return 'wss://vop.baidu.com/realtime_asr?token={}'.format(token)
def get_auth_token(api_key,secret_key):
url = 'https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}'.format(api_key,secret_key)
response = requests.post(url).json()
token = response.get('access_token',None)
return token
class AsrClient(object):
def __init__(self, api_key, secret_key,dev_pid=1536,rate=16000,channel=1,cuid=None):
self.api_key = api_key
self.secret_key = secret_key
self.dev_pid = dev_pid
self.rate = rate
self.channel = channel
self.cuid = str(uuid.uuid1()) if not cuid else cuid
self.token = get_auth_token(api_key,secret_key)
self.ws_url = generate_ws_url(self.token)
self.chunk_size = 640
self.audio_finished = False
self.buffer = []
def audio_recorder_callback(self, in_data, frame_count, time_info, status):
if self.audio_finished:
return None, pyaudio.paComplete
self.buffer.append(in_data)
return None, pyaudio.paContinue
def create_ws_thread(self):
def on_message(ws, message):
result = json.loads(message)
print(result['results'][0]['alternatives'][0]['transcript'])
def on_error(ws, error):
print(error)
def on_close(ws):
print("### closed ###")
def on_open(ws):
def run():
ws.send(json.dumps({
"common": {
"app_id": self.api_key,
"cuid": self.cuid,
"dev_pid": self.dev_pid
},
"business": {
"language": "zh",
"domain": "exhibition"
}
}))
time.sleep(1)
size = 0
for chunk in self.buffer:
ws.send(chunk, websocket.ABNF.OPCODE_BINARY)
size += len(chunk)
if size > self.chunk_size:
time.sleep(0.1)
size = 0
ws.send('', websocket.ABNF.OPCODE_BINARY)
self.audio_finished = True
time.sleep(5)
t = threading.Thread(target=run)
t.start()
websocket.enableTrace(True)
ws = websocket.WebSocketApp(self.ws_url,
on_message = on_message,
on_error = on_error,
on_close = on_close)
ws.on_open = on_open
ws.run_forever()
def recognition_audio(self, record_seconds = 10):
self.buffer = []
self.audio_finished = False
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,
channels=self.channel,
rate=self.rate,
input=True,
frames_per_buffer=self.chunk_size,
stream_callback=self.audio_recorder_callback)
stream.start_stream()
ws_thread = threading.Thread(target=self.create_ws_thread)
ws_thread.start()
time.sleep(record_seconds)
stream.stop_stream()
stream.close()
p.terminate()
print('Audio recording ended')
def main():
api_key = "XXX"
secret_key = "XXX"
client = AsrClient(api_key,secret_key,dev_pid=1536,rate=16000,cuid='test_python')
client.recognition_audio(60)
if __name__ == '__main__':
main()
以上示例演示了如何通过Websocket实时推送实时语音,并使用百度语音识别API来实现实时语音识别。需要注意的是,由于实时语音识别功能需要打开麦克风进行录制,因此需要使用到Pyaudio库来进行麦克风录音。同时,由于Websocket是实时通信,因此需要另开一个线程来进行Websocket的发送。这个线程中需要将麦克风录制的音频进行chunk分片,并进行Websocket发送。在音频录制结束后,需要人为进行Audio Finished的标记,以便Websocket发送线程可以知道音频已经录制完毕,避免出现网络服务端响应缓慢等问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python调用百度api实现语音识别详解 - Python技术站