リアルタイム音声認識サービスは、音声ストリームを句読点付きのテキストに変換します。マイク入力、会議録音、ローカル音声ファイルなど、さまざまな音声ソースからの文字起こしが可能です。主な利用シーンには、リアルタイム会議文字起こし、ライブ字幕、音声チャット、インテリジェントカスタマーサービスなどがあります。
主な機能
中国語、英語、および各種方言を含む複数言語向けのリアルタイム音声認識。
タイムスタンプ出力により、構造化された認識結果を生成。
柔軟なサンプルレートと複数の音声フォーマットに対応し、さまざまな録音環境に最適化。
オプションの音声活動検出(VAD)により、無音セグメントを自動的にフィルタリングし、長時間音声の処理効率を向上。
SDK および WebSocket 接続による安定的かつ低遅延のサービス提供。
可用性
サポートされるモデル:
国際
「国際デプロイモード」では、エンドポイントおよびデータストレージがシンガポールリージョンに配置されます。システムは、中国本土を除くグローバルなリージョン間でモデル推論コンピューティングリソースを動的にスケジュールします。
以下のモデルを呼び出す際は、シンガポール リージョンのAPI キーを使用してください:
Fun-ASR:fun-asr-realtime(安定版、現在は fun-asr-realtime-2025-11-07 と同等)、fun-asr-realtime-2025-11-07(スナップショット)
中国本土
「中国本土デプロイモード」では、エンドポイントおよびデータストレージが中国 (北京)リージョンに配置されます。モデル推論コンピューティングリソースは、中国本土内でのみ稼働します。
以下のモデルを呼び出す場合は、中国 (北京)リージョンのAPI キーをご使用ください:
Fun-ASR:fun-asr-realtime(安定版、現在は fun-asr-realtime-2025-11-07 と同等)、fun-asr-realtime-2026-02-28(最新スナップショット)、fun-asr-realtime-2025-11-07(スナップショット)、fun-asr-realtime-2025-09-15(スナップショット)
fun-asr-flash-8k-realtime(安定版、現在は fun-asr-flash-8k-realtime-2026-01-28 と同等)、fun-asr-flash-8k-realtime-2026-01-28
Paraformer:paraformer-realtime-v2、paraformer-realtime-v1、paraformer-realtime-8k-v2、paraformer-realtime-8k-v1
詳細については、「モデル一覧」をご参照ください。
モデル選択ガイド
利用シナリオ | 推奨 | 選定理由 |
中国語(標準語)の認識(会議/ライブ配信) | fun-asr-realtime、fun-asr-realtime-2026-02-28、paraformer-realtime-v2 | 安定した遅延性能を提供し、複数の音声フォーマットおよび高サンプルレートに対応。 |
多言語認識(越境カスタマーサービス/国際会議) | paraformer-realtime-v2 | 越境シナリオに対応し、シームレスな言語切り替えを実現。 |
中国語方言の認識(カスタマーサービス/行政サービス) | fun-asr-realtime-2026-02-28、paraformer-realtime-v2 | 複数の地域方言をカバー。 |
中国語・英語・日本語の混合認識(授業/プレゼンテーション) | fun-asr-realtime、fun-asr-realtime-2025-11-07 | 中国語、英語、日本語の認識に最適化。 |
低サンプルレートの電話音声の文字起こし | fun-asr-flash-8k-realtime | 中国語カスタマーサービス通話の文字起こしに最適化。 |
詳細については、「モデル比較」をご参照ください。
クイックスタート
以下は API 呼び出しのサンプルコードです。一般的な利用シーンをカバーするその他のサンプルについては、「GitHub」をご参照ください。
API キーの取得およびAPI キーを環境変数として設定を行ってください。SDK を使用して呼び出しを行う場合、DashScope SDK のインストールが必要です。
Fun-ASR
マイク入力
リアルタイム音声認識サービスは、マイクから入力された音声をリアルタイムで文字起こしし、話す内容を即座にテキスト出力します。
Java
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionResult;
import com.alibaba.dashscope.common.ResultCallback;
import com.alibaba.dashscope.utils.Constants;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.TargetDataLine;
import java.nio.ByteBuffer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws InterruptedException {
// 以下の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
Constants.baseWebsocketApiUrl = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference";
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(new RealtimeRecognitionTask());
executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.MINUTES);
System.exit(0);
}
}
class RealtimeRecognitionTask implements Runnable {
@Override
public void run() {
RecognitionParam param = RecognitionParam.builder()
.model("fun-asr-realtime")
// シンガポールリージョンと中国 (北京) リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
// 環境変数を設定していない場合は、次の行を API キーに置き換えてください: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.format("pcm")
.sampleRate(16000)
.build();
Recognition recognizer = new Recognition();
ResultCallback<RecognitionResult> callback = new ResultCallback<RecognitionResult>() {
@Override
public void onEvent(RecognitionResult result) {
if (result.isSentenceEnd()) {
System.out.println("最終結果: " + result.getSentence().getText());
} else {
System.out.println("中間結果: " + result.getSentence().getText());
}
}
@Override
public void onComplete() {
System.out.println("認識完了");
}
@Override
public void onError(Exception e) {
System.out.println("RecognitionCallback エラー: " + e.getMessage());
}
};
try {
recognizer.call(param, callback);
// AudioFormat を作成します。
AudioFormat audioFormat = new AudioFormat(16000, 16, 1, true, false);
// 指定されたフォーマットに一致する TargetDataLine を取得します。
TargetDataLine targetDataLine =
AudioSystem.getTargetDataLine(audioFormat);
targetDataLine.open(audioFormat);
// 録音を開始します。
targetDataLine.start();
ByteBuffer buffer = ByteBuffer.allocate(1024);
long start = System.currentTimeMillis();
// 50 秒間録音し、リアルタイム音声文字起こしを実行します。
while (System.currentTimeMillis() - start < 50000) {
int read = targetDataLine.read(buffer.array(), 0, buffer.capacity());
if (read > 0) {
buffer.limit(read);
// 録音された音声データをストリーミング認識サービスに送信します。
recognizer.sendAudioFrame(buffer);
buffer = ByteBuffer.allocate(1024);
// CPU 使用率を抑えるため、短時間スリープします。
Thread.sleep(20);
}
}
recognizer.stop();
} catch (Exception e) {
e.printStackTrace();
} finally {
// タスク完了後に WebSocket 接続を閉じます。
recognizer.getDuplexApi().close(1000, "bye");
}
System.out.println(
"[メトリクス] requestId: "
+ recognizer.getLastRequestId()
+ ", 最初のパッケージ遅延 (ms): "
+ recognizer.getFirstPackageDelay()
+ ", 最後のパッケージ遅延 (ms): "
+ recognizer.getLastPackageDelay());
}
}Python
Python サンプルを実行する前に、pip install pyaudio コマンドを実行して PyAudio パッケージをインストールしてください。
import os
import signal # キーボードイベント処理(「Ctrl+C」で録音を停止)。
import sys
import dashscope
import pyaudio
from dashscope.audio.asr import *
mic = None
stream = None
# 録音パラメーターを設定します。
sample_rate = 16000 # サンプリングレート(Hz)。
channels = 1 # モノラルチャンネル。
dtype = 'int16' # データ型。
format_pcm = 'pcm' # 音声データのフォーマット。
block_size = 3200 # バッファーあたりのフレーム数。
# リアルタイム音声認識コールバックを定義します。
class Callback(RecognitionCallback):
def on_open(self) -> None:
global mic
global stream
print('RecognitionCallback 開始。')
mic = pyaudio.PyAudio()
stream = mic.open(format=pyaudio.paInt16,
channels=1,
rate=16000,
input=True)
def on_close(self) -> None:
global mic
global stream
print('RecognitionCallback 終了。')
stream.stop_stream()
stream.close()
mic.terminate()
stream = None
mic = None
def on_complete(self) -> None:
print('RecognitionCallback 完了。') # 認識が完了しました。
def on_error(self, message) -> None:
print('RecognitionCallback task_id: ', message.request_id)
print('RecognitionCallback エラー: ', message.message)
# 実行中の音声ストリームを停止および閉じます。
if 'stream' in globals() and stream.active:
stream.stop()
stream.close()
# プログラムを強制終了します。
sys.exit(1)
def on_event(self, result: RecognitionResult) -> None:
sentence = result.get_sentence()
if 'text' in sentence:
print('RecognitionCallback テキスト: ', sentence['text'])
if RecognitionResult.is_sentence_end(sentence):
print(
'RecognitionCallback 文末検出、request_id:%s、使用量:%s'
% (result.get_request_id(), result.get_usage(sentence)))
def signal_handler(sig, frame):
print('Ctrl+C が押されました。認識を停止しています…')
# 認識を停止します。
recognition.stop()
print('認識が停止しました。')
print(
'[メトリクス] requestId: {}, 最初のパッケージ遅延 (ms): {}, 最後のパッケージ遅延 (ms): {}'
.format(
recognition.get_last_request_id(),
recognition.get_first_package_delay(),
recognition.get_last_package_delay(),
))
# プログラムを強制終了します。
sys.exit(0)
# メイン関数を定義します。
if __name__ == '__main__':
# シンガポールリージョンと中国 (北京) リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
# 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')
# 以下の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'
# 認識コールバックを作成します。
callback = Callback()
# 非同期モードで認識サービスを呼び出します。モデル、フォーマット、サンプルレートなどの認識パラメーターをカスタマイズできます。
recognition = Recognition(
model='fun-asr-realtime',
format=format_pcm,
# サポートされるフォーマットには 'pcm'、'wav'、'opus'、'speex'、'aac'、'amr' があります。詳細については、ドキュメントをご参照ください。
sample_rate=sample_rate,
# 8000 および 16000 をサポート。
semantic_punctuation_enabled=False,
callback=callback)
# 認識を開始します。
recognition.start()
signal.signal(signal.SIGINT, signal_handler)
print("録音および認識を停止するには、「Ctrl+C」を押してください…")
# インタラプト信号(Ctrl+C)をキャッチするためのシグナルハンドラーを設定します。
while True:
if stream:
data = stream.read(3200, exception_on_overflow=False)
recognition.send_audio_frame(data)
else:
break
recognition.stop()ローカルファイル入力
この API は、音声チャット、音声コマンド、音声入力、音声検索など、リアルタイムに近い短時間音声のシナリオに最適です。
Java
サンプルで使用される音声ファイルは asr_example.wav です。
import com.alibaba.dashscope.api.GeneralApi;
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionResult;
import com.alibaba.dashscope.base.HalfDuplexParamBase;
import com.alibaba.dashscope.common.GeneralListParam;
import com.alibaba.dashscope.common.ResultCallback;
import com.alibaba.dashscope.protocol.GeneralServiceOption;
import com.alibaba.dashscope.protocol.HttpMethod;
import com.alibaba.dashscope.protocol.Protocol;
import com.alibaba.dashscope.protocol.StreamingMode;
import com.alibaba.dashscope.utils.Constants;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
class TimeUtils {
private static final DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
public static String getTimestamp() {
return LocalDateTime.now().format(formatter);
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
// 以下の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
Constants.baseWebsocketApiUrl = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference";
// 本番環境では、アプリケーション起動時に一度だけこのメソッドを呼び出せば十分です。
warmUp();
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(new RealtimeRecognitionTask(Paths.get(System.getProperty("user.dir"), "asr_example.wav")));
executorService.shutdown();
// 全タスクの完了を待機
executorService.awaitTermination(1, TimeUnit.MINUTES);
System.exit(0);
}
public static void warmUp() {
try {
// 接続確立のための軽量 GET リクエスト
GeneralServiceOption warmupOption = GeneralServiceOption.builder()
.protocol(Protocol.HTTP)
.httpMethod(HttpMethod.GET)
.streamingMode(StreamingMode.OUT)
.path("assistants")
.build();
warmupOption.setBaseHttpUrl(Constants.baseHttpApiUrl);
GeneralApi<HalfDuplexParamBase> api = new GeneralApi<>();
api.get(GeneralListParam.builder().limit(1L).build(), warmupOption);
} catch (Exception e) {
// プリウォーミング失敗時に再試行を許可するためフラグをリセット
}
}
}
class RealtimeRecognitionTask implements Runnable {
private Path filepath;
public RealtimeRecognitionTask(Path filepath) {
this.filepath = filepath;
}
@Override
public void run() {
RecognitionParam param = RecognitionParam.builder()
.model("fun-asr-realtime")
// シンガポールリージョンと中国 (北京) リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
// 環境変数を設定していない場合は、次の行を API キーに置き換えてください: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.format("wav")
.sampleRate(16000)
.build();
Recognition recognizer = new Recognition();
String threadName = Thread.currentThread().getName();
ResultCallback<RecognitionResult> callback = new ResultCallback<RecognitionResult>() {
@Override
public void onEvent(RecognitionResult message) {
if (message.isSentenceEnd()) {
System.out.println(TimeUtils.getTimestamp()+" "+
"[プロセス " + threadName + "] 最終結果:" + message.getSentence().getText());
} else {
System.out.println(TimeUtils.getTimestamp()+" "+
"[プロセス " + threadName + "] 中間結果: " + message.getSentence().getText());
}
}
@Override
public void onComplete() {
System.out.println(TimeUtils.getTimestamp()+" "+"[" + threadName + "] 認識完了");
}
@Override
public void onError(Exception e) {
System.out.println(TimeUtils.getTimestamp()+" "+
"[" + threadName + "] RecognitionCallback エラー: " + e.getMessage());
}
};
try {
recognizer.call(param, callback);
// パスを音声ファイルのパスに置き換えてください
System.out.println(TimeUtils.getTimestamp()+" "+"[" + threadName + "] 入力ファイルパス: " + this.filepath);
// ファイルを読み込み、チャンク単位で音声を送信
FileInputStream fis = new FileInputStream(this.filepath.toFile());
byte[] allData = new byte[fis.available()];
int ret = fis.read(allData);
fis.close();
int sendFrameLength = 3200;
for (int i = 0; i * sendFrameLength < allData.length; i ++) {
int start = i * sendFrameLength;
int end = Math.min(start + sendFrameLength, allData.length);
ByteBuffer byteBuffer = ByteBuffer.wrap(allData, start, end - start);
recognizer.sendAudioFrame(byteBuffer);
Thread.sleep(100);
}
System.out.println(TimeUtils.getTimestamp()+" "+LocalDateTime.now());
recognizer.stop();
} catch (Exception e) {
e.printStackTrace();
} finally {
// タスク完了後に WebSocket 接続を閉じます。
recognizer.getDuplexApi().close(1000, "bye");
}
System.out.println(
"["
+ threadName
+ "][メトリクス] requestId: "
+ recognizer.getLastRequestId()
+ ", 最初のパッケージ遅延 (ms): "
+ recognizer.getFirstPackageDelay()
+ ", 最後のパッケージ遅延 (ms): "
+ recognizer.getLastPackageDelay());
}
}Python
サンプルで使用される音声ファイルは:asr_example.wav です。
import os
import time
import dashscope
from dashscope.audio.asr import *
# シンガポールリージョンと中国 (北京) リージョンの API キーは異なります。API キーの取得方法については、https://www.alibabacloud.com/help/en/model-studio/get-api-key をご参照ください。
# 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')
# 以下の URL はシンガポールリージョン向けです。中国 (北京) リージョンのモデルを使用する場合は、URL を wss://dashscope.aliyuncs.com/api-ws/v1/inference に置き換えてください。
dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'
from datetime import datetime
def get_timestamp():
now = datetime.now()
formatted_timestamp = now.strftime("[%Y-%m-%d %H:%M:%S.%f]")
return formatted_timestamp
class Callback(RecognitionCallback):
def on_complete(self) -> None:
print(get_timestamp() + ' 認識完了') # 認識が完了しました。
def on_error(self, result: RecognitionResult) -> None:
print('Recognition task_id: ', result.request_id)
print('Recognition エラー: ', result.message)
exit(0)
def on_event(self, result: RecognitionResult) -> None:
sentence = result.get_sentence()
if 'text' in sentence:
print(get_timestamp() + ' RecognitionCallback テキスト: ', sentence['text'])
if RecognitionResult.is_sentence_end(sentence):
print(get_timestamp() +
'RecognitionCallback 文末検出、request_id:%s、使用量:%s'
% (result.get_request_id(), result.get_usage(sentence)))
callback = Callback()
recognition = Recognition(model='fun-asr-realtime',
format='wav',
sample_rate=16000,
callback=callback)
try:
audio_data: bytes = None
f = open("asr_example.wav", 'rb')
if os.path.getsize("asr_example.wav"):
# バッファー全体にファイルを一度に読み込みます。
file_buffer = f.read()
f.close()
print("認識を開始します")
recognition.start()
# バッファーから 3200 バイト単位でデータを送信します。
buffer_size = len(file_buffer)
offset = 0
chunk_size = 3200
while offset < buffer_size:
# 現在送信するデータチャンクのサイズを計算します。
remaining_bytes = buffer_size - offset
current_chunk_size = min(chunk_size, remaining_bytes)
# バッファーから現在のデータチャンクを抽出します。
audio_data = file_buffer[offset:offset + current_chunk_size]
# 音声データフレームを送信します。
recognition.send_audio_frame(audio_data)
# オフセットを更新します。
offset += current_chunk_size
# リアルタイム送信を模倣するために遅延を追加します。
time.sleep(0.1)
recognition.stop()
else:
raise Exception(
'指定されたファイルは空です(0 バイト)')
except Exception as e:
raise e
print(
'[メトリクス] requestId: {}, 最初のパッケージ遅延 (ms): {}, 最後のパッケージ遅延 (ms): {}'
.format(
recognition.get_last_request_id(),
recognition.get_first_package_delay(),
recognition.get_last_package_delay(),
))Paraformer
マイク入力
リアルタイム音声認識サービスは、マイク入力音声をリアルタイムでテキストに変換します。
Java
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.exception.NoApiKeyException;
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;
public class Main {
public static void main(String[] args) throws NoApiKeyException {
// Flowable<ByteBuffer> を作成
Flowable<ByteBuffer> audioSource = Flowable.create(emitter -> {
new Thread(() -> {
try {
// 音声フォーマットを作成
AudioFormat audioFormat = new AudioFormat(16000, 16, 1, true, false);
// 指定された音声フォーマットに対応するデフォルト録音デバイスを取得
TargetDataLine targetDataLine =
AudioSystem.getTargetDataLine(audioFormat);
targetDataLine.open(audioFormat);
// 録音を開始
targetDataLine.start();
ByteBuffer buffer = ByteBuffer.allocate(1024);
long start = System.currentTimeMillis();
// 300 秒間録音し、リアルタイム文字起こしを実行
while (System.currentTimeMillis() - start < 300000) {
int read = targetDataLine.read(buffer.array(), 0, buffer.capacity());
if (read > 0) {
buffer.limit(read);
// 録音された音声データをストリーミング認識サービスに送信
emitter.onNext(buffer);
buffer = ByteBuffer.allocate(1024);
// 録音レートを制限し、CPU 使用率を抑えるためにスリープします。
Thread.sleep(20);
}
}
// 文字起こし完了を通知
emitter.onComplete();
} catch (Exception e) {
emitter.onError(e);
}
}).start();
},
BackpressureStrategy.BUFFER);
// Recognizer インスタンスを作成
Recognition recognizer = new Recognition();
// 認識パラメーターを構築
RecognitionParam param = RecognitionParam.builder()
.model("paraformer-realtime-v2")
.format("pcm")
.sampleRate(16000)
// 環境変数に API キーが設定されていない場合は、次の行のコメントを解除し、「apikey」を実際の API キーに置き換えてください。
// .apiKey("apikey")
.build();
// ストリーミングモードで API を呼び出し
recognizer.streamCall(param, audioSource)
// blockingForEach を使用して結果を受信
.blockingForEach(
result -> {
// 最終結果を出力
if (result.isSentenceEnd()) {
System.out.println("最終結果:" + result.getSentence().getText());
} else {
System.out.println("結果:" + result.getSentence().getText());
}
});
System.exit(0);
}
}Python
Python サンプルを実行する前に、pip install pyaudio コマンドを実行して PyAudio 音声再生および録音スイートをインストールしてください。
import pyaudio
from dashscope.audio.asr import (Recognition, RecognitionCallback,
RecognitionResult)
# 環境変数に API キーが設定されていない場合は、次の行のコメントを解除し、「apiKey」を実際の API キーに置き換えてください。
# import dashscope
# dashscope.api_key = "apiKey"
mic = None
stream = None
class Callback(RecognitionCallback):
def on_open(self) -> None:
global mic
global stream
print('RecognitionCallback 開始。')
mic = pyaudio.PyAudio()
stream = mic.open(format=pyaudio.paInt16,
channels=1,
rate=16000,
input=True)
def on_close(self) -> None:
global mic
global stream
print('RecognitionCallback 終了。')
stream.stop_stream()
stream.close()
mic.terminate()
stream = None
mic = None
def on_event(self, result: RecognitionResult) -> None:
print('RecognitionCallback 文: ', result.get_sentence())
callback = Callback()
recognition = Recognition(model='paraformer-realtime-v2',
format='pcm',
sample_rate=16000,
callback=callback)
recognition.start()
while True:
if stream:
data = stream.read(3200, exception_on_overflow=False)
recognition.send_audio_frame(data)
else:
break
recognition.stop()ローカル音声ファイル
リアルタイム音声認識サービスは、ローカル音声ファイルの認識および文字起こしが可能です。この API は、音声チャット、制御コマンド、音声入力、音声検索など、リアルタイムに近い短時間音声のシナリオに最適です。
Java
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
public class Main {
public static void main(String[] args) {
// URL からのファイルダウンロードを無視し、ローカルファイルを使用して API を呼び出すことができます。
String exampleWavUrl =
"https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav";
try {
InputStream in = new URL(exampleWavUrl).openStream();
Files.copy(in, Paths.get("asr_example.wav"), StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
System.out.println("エラー: " + e);
System.exit(1);
}
// Recognition インスタンスを作成
Recognition recognizer = new Recognition();
// RecognitionParam を作成
RecognitionParam param =
RecognitionParam.builder()
// 環境変数に API キーが設定されていない場合は、次の行のコメントを解除し、「apikey」を実際の API キーに置き換えてください。
// .apiKey("apikey")
.model("paraformer-realtime-v2")
.format("wav")
.sampleRate(16000)
// 「language_hints」パラメーターは、paraformer-v2 および paraformer-realtime-v2 モデルでのみサポートされています。
.parameter("language_hints", new String[]{"zh", "en"})
.build();
try {
System.out.println("認識結果: " + recognizer.call(param, new File("asr_example.wav")));
} catch (Exception e) {
e.printStackTrace();
}
System.exit(0);
}
}Python
import requests
from http import HTTPStatus
from dashscope.audio.asr import Recognition
# 環境変数に API キーが設定されていない場合は、次の行のコメントを解除し、「apiKey」を実際の API キーに置き換えてください。
# import dashscope
# dashscope.api_key = "apiKey"
# URL からのファイルダウンロードを無視し、ローカルファイルを使用して認識を行えます。
r = requests.get(
'https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav'
)
with open('asr_example.wav', 'wb') as f:
f.write(r.content)
recognition = Recognition(model='paraformer-realtime-v2',
format='wav',
sample_rate=16000,
# 「language_hints」パラメーターは、paraformer-v2 および paraformer-realtime-v2 モデルでのみサポートされています。
language_hints=['zh', 'en'],
callback=None)
result = recognition.call('asr_example.wav')
if result.status_code == HTTPStatus.OK:
print('認識結果:')
print(result.get_sentence())
else:
print('エラー: ', result.message)本番稼働
認識精度の向上
適切なサンプルレートのモデルを選択:8 kHz で録音されたテレフォニー音声の場合は、8 kHz モデルをご使用ください。認識のために 16 kHz へのアップサンプリングは避けてください。これは歪みを引き起こし、精度を低下させる可能性があります。
入力音声品質の最適化:高品質なマイクを使用し、録音環境の信号対雑音比(SNR)を高く保ち、エコーがない状態を確保してください。アプリケーションレベルでは、ノイズリダクションアルゴリズム(例:RNNoise)および音響エコーキャンセレーション(AEC)を統合して、クリーンな入力を実現するための音声前処理を行ってください。
認識言語の明示指定:Paraformer-v2 などの多言語モデルでは、音声の言語を事前に指定してください(例:「Language_hints」パラメーターを使用して
['zh','en']を指定)。これにより、モデルの収束が促進され、類似した発音の言語間の混同を回避し、精度が向上します。不流暢語除去機能の有効化:Paraformer モデルでは、「disfluency_removal_enabled」パラメーターを設定することで、不流暢語除去機能を有効化できます。これにより、より形式的で読みやすいテキスト出力が得られます。
フォールトトレランスポリシーの設定
クライアント側の再接続:ネットワークジャイターに対応するため、クライアント側で自動再接続メカニズムを実装してください。Python ソフトウェア開発キット(SDK)の場合、以下の推奨事項が適用されます:
例外のキャッチ:「
on_error」メソッドを「Callback」クラスに実装します。dashscopeSDK は、ネットワークエラーまたはその他の問題が発生した際に、このメソッドを呼び出します。再接続用の信号: お使いの
on_errorメソッドで、再接続用の信号を設定します。Python では、threading.Eventを使用できます。これは、スレッドセーフな信号通知メカニズムです。再接続ループの実装:メインロジックを「
for」ループでラップしてリトライを管理します(例:最大 3 回の試行)。再接続シグナルを検出した場合、現在の認識タスクを中断し、すべてのリソースをクリーンアップした後、数秒待機してから新しい接続を確立するためにループを再開します。
接続切断防止のためのハートビート設定:サービスとの長期間の接続を維持するには、「heartbeat」パラメーターを「
true」に設定します。これにより、音声の長時間のサイレンス中であっても、接続が切断されるのを防ぎます。レート制限:モデル API を呼び出す際は、モデルの「レート制限」ルールに従ってください。
API
モデル機能比較
機能 | Fun-ASR | Paraformer |
サポート言語 | モデルによって異なります:
| モデルによって異なります:
|
サポート音声フォーマット | PCM、WAV、MP3、OPUS、Speex、AAC、AMR。 | |
サンプルレート | モデルによって異なります:
| モデルによって異なります:
|
音声チャンネル | Mono. | |
入力フォーマット | バイナリ音声ストリーム。 | |
音声持続時間 | 無制限版。 | 無制限版 |
感情認識 | モデルによって異なります:
| |
センシティブワードフィルタリング | ||
話者識別 | ||
フィラー語フィルタリング | ||
タイムスタンプ | ||
句読点予測 | モデルによって異なります:
| |
ホットワード | ||
逆テキスト正規化(ITN) | ||
音声活動検出(VAD) | ||
レート制限(RPS) | 20 | 20 |
統合方法 | Java、Python、Android、iOS SDK;WebSocket API。 | |
価格 | モデルによって異なります:
| 中国本土:$0.000034/秒 |