Paraformer语音识别
支持的领域 / 任务:audio(音频) / asr(语音识别)
Paraformer语音识别提供的实时转写API,能够对长时间的语音数据流进行识别,并将结果流式返回给调用者,适用于会议演讲、视频直播等长时间不间断识别的场景。
新一代语音识别模型paraformer-realtime-v2,支持常见的视频直播、电话客服等场景下的音频输入,同时可以通过language_hints参数选择语种获得更准确的识别效果。
Paraformer实时语音识别返回较为丰富的结果供调用者选择使用,包括中间文字结果、句子级文字、词和时间戳等。模型默认进行标点符号预测和逆文本正则化。
模型名 | 模型简介 |
paraformer-realtime-v2 | 推荐使用 Paraformer最新实时语音识别模型,支持多个语种自由切换的视频直播、会议等实时场景的语音识别。可以通过language_hints参数选择语种获得更准确的识别效果。支持任意采样率的音频。 支持的语言包括:中文(包含中文普通话和各种方言)、英文、日语、韩语。支持热词功能,用法请参考定制热词。 |
paraformer-realtime-8k-v2 | 推荐使用 Paraformer最新8k中文实时语音识别模型,模型结构升级,具有更快的推理速度和更好的识别效果。支持8kHz电话客服等场景下的实时语音识别。仅支持中文热词。用法请参考 定制热词。 |
paraformer-realtime-v1 | Paraformer中文实时语音识别模型,支持视频直播、会议等实时场景下的语音识别。仅支持16kHz采样率的音频。 |
paraformer-realtime-8k-v1 | Paraformer中文实时语音识别模型,支持8kHz电话客服等场景下的实时语音识别。 |
API参考
前提条件
已开通服务并获得API-KEY:获取API Key。
已安装最新版SDK:安装SDK。
重要SDK仅支持Java和Python。如需其他语言支持,请参考通过WebSocket连接访问实时语音识别服务。
本文档主要以Python接口和参数为主进行讲解。
导入模块
import pyaudio
import dashscope
from dashscope.audio.asr import (Recognition, RecognitionCallback,
RecognitionResult)
dashscope.api_key = '<your-dashscope-api-key>'
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;
import java.nio.ByteBuffer;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.TargetDataLine;
请求参数
以下代码片段展示了如何创建一个使用paraformer-realtime-v2模型,使用16k采样率,PCM音频格式的实时识别请求参数:
recognition = Recognition(model='paraformer-realtime-v2',
format='pcm',
sample_rate=16000,
callback=callback)
RecognitionParam param =
RecognitionParam.builder()
.model("paraformer-realtime-v2")
.format("pcm")
.sampleRate(16000)
.apiKey("your-dashscope-api-key")
.build();
参数说明
参数 | 类型 | 默认值 | 说明 |
model | str | - | 指定用于实时语音识别的模型 |
sample_rate | int | - | 识别音频采样率支持8000Hz以及16000Hz
|
format | str | - | 支持'pcm'、'wav'、'opus'、'speex'、'aac'、'amr'等多种音频格式 |
vocabulary_id | str | - | 最新热词ID,支持最新v2系列模型并配置语种信息,此次语音识别中生效此热词ID对应的热词信息。默认不启用。使用方法请参考定制热词 |
phrase_id | str | - | 热词ID,此次语音识别中生效此热词ID对应的热词信息。默认不启用。 注:phrase_id为旧版本热词方案,不支持v2及后续系列模型。支持旧版本热词的模型列表请参考Paraformer语音识别热词定制与管理 |
disfluency_removal_enabled | bool | False | 过滤语气词,默认关闭 |
language_hints | list[str] | ['zh', 'en'] | 指定识别语音中语言的代码列表。支持的语言代码:
仅对支持多语言的模型生效。如果不填写则模型会自动识别语种。 注:在java sdk中,此参数需要通过parameter额外参数配置,用法请参考快速开始中示例代码。 |
流式调用
提交单个语音实时转写任务,通过实现回调接口或者工作流的方式流式输出实时识别结果。
通过回调方式的流式调用
以下代码片段展示了创建Recognition示例并使用上文创建的参数来调用基于回调方式的流式实时识别。
class Callback(RecognitionCallback):
def on_complete(self) -> None:
# 识别完成
def on_error(self, result: RecognitionResult) -> None:
# 错误处理
def on_event(self, result: RecognitionResult) -> None:
# 处理识别结果
callback = Callback()
recognition = Recognition(model='paraformer-realtime-v2',
format='pcm',
sample_rate=16000,
callback=callback)
recognition.start()
class RecognitionCallback extends ResultCallback<RecognitionResult> {
@Override
public void onEvent(RecognitionResult message) {
// 处理识别结果
}
@Override
public void onComplete() {
// 识别完成
}
@Override
public void onError(Exception e) {
// 错误处理
}
}
Recognition recognition = new Recognition();
recognition.call(param, new RecognitionCallback());
该方法签名如下:
成员方法 | 方法签名 | 说明 |
start | def start(self): | 基于回调形式的流式实时识别,该方法不会阻塞当前线程 |
回调函数
以Python SDK为例,其他SDK命名方式可能不同
方法签名
是否必须被override
说明
def on_open(self) -> None:
否
当websocket建立链接完成后立刻会被回调。
def on_event(self, result: RecognitionResult) -> None:
是
当服务有回复时会被回调,RecognitionResult 类型会在后文中介绍。
def on_complete(self) -> None:
否
当所有合成数据全部返回后进行回调。
def on_error(self, result: RecognitionResult) -> None:
否
当调用过程出现异常以及服务返回错误后以RecognitionResult类型进行回调。
def on_close(self) -> None:
否
当服务已经关闭连接后进行回调。
返回结果说明
RecognitionResult代表一次实时识别的结果,包含了时间戳和文本信息以及文本识别是否结束
成员方法
方法签名
说明
get_sentence
def get_sentence(self) -> Union[Dict[str, Any], List[Any]]:
获取当前识别的句子及时间戳信息。回调中返回的是单句信息,所以此方法返回类型为Dict[str, Any]
get_request_id
def get_request_id(self) -> str:
获取请求的RequestId
is_sentence_end
@staticmethod
def is_sentence_end(sentence: Dict[str, Any]) -> bool:
判断给定句子是否已经结束
Sentence类成员如下:
参数
类型
说明
beginTime
Long
句子开始时间
endTime
Long
句子结束时间
text
String
识别文本
words
List<Word>
字时间戳信息
Word类成员如下:
参数
类型
说明
beginTime
long
字开始时间
endTime
long
字结束时间
text
String
字
punctuation
String
标点
发送音频数据
以下代码片段展示在一段循环中通过Recognition对象的send_audio_frame来发送二进制音频数据:
// buffer是一个Bytes类型对象,用户需要处理如何从音频源中流式生成Bytes对象 recognition.send_audio_frame(buffer)
// buffer是一个ByteBuffer类型对象,用户需要处理如何从音频源中流式生成ByteBuffer对象 recognition.sendAudioFrame(buffer);
该方法签名如下:
成员方法
方法签名
说明
send_audio_frame
def send_audio_frame(self, buffer: bytes):
推送音频,Bytes不应过短或过长,建议在1KB-16KB之间
结束实时识别
以下代码片段展示停止实时识别:
recognition.stop();
recognition.stop();
该方法签名如下:
成员方法
方法签名
说明
stop
def stop(self):
停止实时识别,该方法会阻塞当前线程至回调的on_complete或者on_error返回
基于Java Flowable的流式调用
为了方便Java开发者尽可能的简化开发过程,实时语音识别支持Java Flowable调用。以下代码片段展示使用Flowable的流式实时识别调用。该代码片段中,param为上文创建的RecognitionParam对象,streamByteBuffer为一个Flowable<ByteBuffer>类型的对象,该streamCall调用返回一个Flowable<RecognitionResult>。关于Flowable的使用,可以参考http://reactivex.io/RxJava/2.x/javadoc/
recognition
.streamCall(param, streamByteBuffer)
.subscribe(
result -> {
// result为RecognitionResult对象
},
error -> {
// 错误处理
},
() -> {
// 识别结束处理
});
该方法签名如下:
成员方法 | 方法签名 | 说明 |
streamCall | Flowable<RecognitionResult> streamCall(RecognitionParam param, Flowable<ByteBuffer>); | 基于Flowable的流式实时识别 |
返回结果说明
该接口主要通过返回的Flowable<RecognitionResult>来获取流式结果,关于RecognitionResult的说明可以参考前文
同步调用
提交单个语音实时转写任务,通过传入本地文件的方式同步阻塞的拿到转写结果。
以下代码片段展示了使用本地音频文件“asr_example.wav"来调用同步接口:
result = recognition.call('asr_example.wav')
String result = recognizer.call(param, new File("asr_example.pcm"));
该方法签名如下:
成员方法 | 方法签名 | 说明 |
call | def call(self, file: str) -> Dict[str, Any]: | 基于本地文件的同步调用,该方法会阻塞当前线程直到文件全部音频读完,该方法要求所识别文件具有可读权限 |
返回结果说明
返回一个Dict类型,该Dict字符串格式如下:
参数 | 类型 | 说明 |
sentences | List<Sentence> | 完整句子时间戳列表 |
其中List<Sentence>中每一个Sentence都是一个Sentence样式的Dict对象,对于Sentence以及Sentence下的Word对象,可以参考上文本中关于Sentence类型和Word类型的说明。以下给出一个返回示例,该例子中sentences参数下仅有一个Sentence:
{
'begin_time': 280,
'end_time': 4000,
'text': 'hello word, 这里是阿里巴巴语音实验室。',
'words': [{
'begin_time': 280,
'end_time': 776,
'text': 'hello ',
'punctuation': ''
}, {
'begin_time': 776,
'end_time': 1024,
'text': 'word',
'punctuation': ', '
}, {
'begin_time': 1024,
'end_time': 1520,
'text': '这里',
'punctuation': ''
}, {
'begin_time': 1520,
'end_time': 1768,
'text': '是',
'punctuation': ''
}, {
'begin_time': 1768,
'end_time': 2760,
'text': '阿里巴巴',
'punctuation': ''
}, {
'begin_time': 2760,
'end_time': 3256,
'text': '语音',
'punctuation': ''
}, {
'begin_time': 3256,
'end_time': 4000,
'text': '实验室',
'punctuation': '。'
}]
}
并发调用
Python
在Python中,由于存在全局解释器锁,同一时刻只有一个线程可以执行Python代码(虽然某些性能导向的库可能会去除此限制)。如果您想更好地利用多核心计算机的计算资源,推荐你使用multiprocessing或concurrent.futures.ProcessPoolExecutor。 多线程在较高并发下会显著增加SDK调用延迟。
Java
在Java SDK中,Dashscope SDK使用了okhttp3的连接池技术降低重复建联开销。默认配置为32个连接。如果您的最高并发数超过此数值,请通过下述环境变量增加连接数。
export DASHSCOPE_MAXIMUM_ASYNC_REQUESTS=2000
export DASHSCOPE_MAXIMUM_ASYNC_REQUESTS_PER_HOST=2000
export DASHSCOPE_CONNECTION_POOL_SIZE=2000
示例中设置为2000,请按照实际单机峰值并发量的1.5倍到2倍配置。
连接池配置为全局变量,请在调用SDK前完成,否则不会生效。
连接池的连接数为所有任务(包含语音识别、语音合成、其他百炼平台非语音任务)的总和。