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前完成,否則不會生效。
連接池的連接數為所有任務(包含語音識別、語音合成、其他百煉平臺非語音任務)的總和。