Python调用百度api实现语音识别详解

对于“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_keysecret_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技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • python中二分查找法的实现方法

    二分查找法是一种常用的查找算法,它可以在有序数组中快速查找指定元素。本文将详细讲解Python中二分查找法的实现方法。 1. 二分查找法的原理 二分查找法的原理是将有序数组分成两部分,然后判断要查找的元素在哪一部分中,再在该部分中继续进行二分查找,直到找到要查找的元素或者确定该元素不存在为止。 具体实现过程如下: 将有序数组的左边界设为0,右边界设为数组长度…

    python 2023年5月14日
    00
  • python中itertools模块使用小结

    Python中itertools模块使用小结 Python中itertools是一个标准库,用于生成迭代器的函数和无限迭代器。它提供了各种有用的迭代器用于有效地对迭代器工作。下面是一些最常用的itertools函数: itertools.count(start=0, step=1) 生成从start开始的连续整数,步骤为step。 import iterto…

    python 2023年6月3日
    00
  • Python列表常见操作详解(获取,增加,删除,修改,排序等)

    以下是详细讲解“Python列表常见操作详解(获取,增加,删除,修改,排序等)”的完整攻略。 Python列表常见操作 在Python中,列表是种常见的数据类型,它可以存储任意类型的数据,包括数字、字符串、列表、元组、字典等。下面是Python列表见操作的详细说明。 获取列表元素 获取列表元素是列表操作最基本的操作之一。可以使用下标(索引)的方式获取列表中的…

    python 2023年5月13日
    00
  • django多种支付、并发订单处理实例代码

    关于“django多种支付、并发订单处理实例代码”的攻略,我们可以分为以下几个部分进行详细讲解。 1. 多种支付方式接入 在django中,接入多种支付方式的方法可以有多种,可以通过第三方支付平台提供的SDK或API进行接入,也可以通过自己实现支付接口进行接入。 1.1 第三方支付SDK或API接入 以支付宝为例,支付宝提供了一套完整的SDK和API,使得开…

    python 2023年6月3日
    00
  • 解决Django提交表单报错:CSRF token missing or incorrect的问题

    下面是解决Django提交表单报错”CSRF token missing or incorrect”的完整攻略。 问题分析 在Django中,为了防止跨站请求伪造攻击(CSRF),需要对每个提交表单的请求添加CSRF Token验证。如果请求中没有CSRF Token或者CSRF Token不正确,就会出现”CSRF token missing or inc…

    python 2023年6月6日
    00
  • Python正则表达式经典入门教程

    Python正则表达式经典入门教程攻略 正则表达式是一种用于描述字符串模式的语言,可以用于匹配、查找、替换和割字符串。在Python,re模块提供了正则表达。本文将详细讲解Python正则表达式经典入门教程的内容,包正则表达式语法、re模块的用以及示例说明。 正则表达式语法 正则表达式语法是一组特殊字符符号用于描述字符串模式。面是一些常用正则表达式语法: .…

    python 2023年5月14日
    00
  • python调用机器喇叭发出蜂鸣声(Beep)的方法

    Python调用机器喇叭发出蜂鸣声(Beep)有多种方法,本文将介绍两种最为常见的方式。 方法一:winsound库 winsound库是Python自带的Windows声音库,其中包含Beep方法,可以直接调用。以下是使用winsound库进行Beep调用的示例代码: import winsound winsound.Beep(500, 1000) # 前…

    python 2023年5月23日
    00
  • Python多线程编程(五):死锁的形成

    死锁是一种多线程编程中的常见问题,是指两个或多个线程在执行过程中互相等待对方释放需要的资源,并导致所有线程无法继续执行的情况。下面我将详细讲解如何避免死锁的形成。 什么是死锁? 死锁是指在两个或多个线程协作完成某项任务的过程中,由于彼此之间相互等待对方释放需要的资源,导致所有线程都停止执行的现象。例如,线程 A 在占用资源 1 的同时等待获取资源 2,而线程…

    python 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部