全部产品
云市场
云游戏

Python SDK

更新时间:2020-08-05 18:01:43

本文介绍如何使用阿里云智能语音服务提供的Python SDK,包括SDK的安装方法及SDK代码示例。

前提条件

使用SDK前,请先阅读接口说明,详情请参见接口说明

下载安装

说明

  • SDK仅支持Python3.4及以上版本,暂不支持Python 2。

  • 确认已安装Python包管理工具setuptools,如果没有安装,请在Linux终端使用以下命令安装:

    pip install setuptools
  1. 下载Python SDK

  2. 安装SDK,在Linux终端的SDK目录下,执行以下命令:

     # 打包
     python setup.py bdist_egg
     # 安装
     python setup.py install

关键接口

  • NlsClient:语音处理客户端,利用该客户端可以进行一句话识别、实时语音识别和语音合成的语音处理任务。该客户端为线程安全,建议全局仅创建一个实例。

  • SpeechTranscriber:实时语音识别类,通过该接口设置请求参数、发送请求及语音数据。非线程安全。

    • start方法:建立与服务端的连接。默认参数ping_interval表示自动发送ping命令的间隔,ping_timeout表示等待ping命令响应的pong消息的超时时间,需要满足ping_interval大于 ping_timeout

    • send方法:发送语音数据到服务端。

    • stop方法:结束识别并关闭与服务端的连接。

    • close方法:关闭与服务端的网络链接。

  • SpeechTranscriberCallback:回调事件函数集合类,语音结果、异常等回调的统一入口。

    • on_started方法:客户端与服务端建立连接成功的回调。

    • on_result_changed方法:客户端接收到中间识别结果的回调。

    • on_sentence_begin方法:客户端接收到一句话开始的回调。

    • on_sentence_end方法:客户端接收到一句话结束的回调。

    • on_completed方法:客户端接收到识别结束的回调。

    • on_task_failed方法:客户端接收到异常错误的回调。

    • on_channel_closed方法:客户端接收到断开网络连接成功的回调。

SDK调用注意事项

  • NlsClient对象创建一次可以重复使用。

  • 一个识别任务对应一个SpeechTranscriber对象。例如,有N个音频文件,则要进行N次识别任务,创建N个SpeechTranscriber对象。

  • SpeechTranscriberCallback对象和SpeechTranscriber对象是一一对应的,不能将一个实现的SpeechTranscriberCallback对象设置到多个SpeechTranscriber对象中,否则无法区分是哪个识别任务。

示例代码

说明

  • Demo中使用的音频文件为16000Hz采样率,下载nls-sample-16k.wav。请在智能语音交互管控台中将Appkey对应项目的模型设置为通用模型,以获取正确的识别结果;如果使用其他音频,请设置为支持该音频场景的模型,模型设置请参见管理项目

  • Demo中使用了SDK内置的默认外网访问服务端URL,如果您使用阿里云上海ECS并需要使用内网访问服务端URL,则在创建NlsClient对象时,设置内网访问的URL:

    transcriber = client.create_transcriber(callback, "ws://nls-gateway.cn-shanghai-internal.aliyuncs.com/ws/v1")
# -*- coding: utf-8 -*-
import os
import time
import threading
import ali_speech
from ali_speech.callbacks import SpeechTranscriberCallback
from ali_speech.constant import ASRFormat
from ali_speech.constant import ASRSampleRate

class MyCallback(SpeechTranscriberCallback):
    """
    构造函数的参数没有要求,可根据需要设置添加。
    示例中的name参数可作为待识别的音频文件名,用于在多线程中进行区分。
    """
    def __init__(self, name='default'):
        self._name = name

    def on_started(self, message):
        print('MyCallback.OnRecognitionStarted: %s' % message)

    def on_result_changed(self, message):
        print('MyCallback.OnRecognitionResultChanged: file: %s, task_id: %s, result: %s' % (
            self._name, message['header']['task_id'], message['payload']['result']))

    def on_sentence_begin(self, message):
        print('MyCallback.on_sentence_begin: file: %s, task_id: %s, sentence_id: %s, time: %s' % (
            self._name, message['header']['task_id'], message['payload']['index'], message['payload']['time']))

    def on_sentence_end(self, message):
        print('MyCallback.on_sentence_end: file: %s, task_id: %s, sentence_id: %s, time: %s, result: %s' % (
            self._name,
            message['header']['task_id'], message['payload']['index'],
            message['payload']['time'], message['payload']['result']))

    def on_completed(self, message):
        print('MyCallback.OnRecognitionCompleted: %s' % message)

    def on_task_failed(self, message):
        print('MyCallback.OnRecognitionTaskFailed-task_id:%s, status_text:%s' % (
            message['header']['task_id'], message['header']['status_text']))

    def on_channel_closed(self):
        print('MyCallback.OnRecognitionChannelClosed')

def process(client, appkey, token):
    audio_name = 'nls-sample-16k.wav'
    callback = MyCallback(audio_name)
    transcriber = client.create_transcriber(callback)
    transcriber.set_appkey(appkey)
    transcriber.set_token(token)
    transcriber.set_format(ASRFormat.PCM)
    transcriber.set_sample_rate(ASRSampleRate.SAMPLE_RATE_16K)
    transcriber.set_enable_intermediate_result(False)
    transcriber.set_enable_punctuation_prediction(True)
    transcriber.set_enable_inverse_text_normalization(True)

    try:
        ret = transcriber.start()
        if ret < 0:
            return ret

        print('sending audio...')
        with open(audio_name, 'rb') as f:
            audio = f.read(3200)
            while audio:
                ret = transcriber.send(audio)
                if ret < 0:
                    break
                time.sleep(0.1)
                audio = f.read(3200)

        transcriber.stop()
    except Exception as e:
        print(e)
    finally:
        transcriber.close()


def process_multithread(client, appkey, token, number):
    thread_list = []
    for i in range(0, number):
        thread = threading.Thread(target=process, args=(client, appkey, token))
        thread_list.append(thread)
        thread.start()

    for thread in thread_list:
        thread.join()


if __name__ == "__main__":
    client = ali_speech.NlsClient()
    # 设置输出日志信息的级别:DEBUG、INFO、WARNING、ERROR。
    client.set_log_level('INFO')

    appkey = '您的Appkey'
    token = '您的Token'

    process(client, appkey, token)

    # 多线程示例
    # process_multithread(client, appkey, token, 2)