このトピックでは、Paraformer リアルタイム音声認識 Java SDK のパラメーターおよびインターフェイスの詳細について説明します。
重要Alibaba Cloud Model Studio は、中国 (北京) リージョン向けにワークスペース専用ドメインをリリースしました。この新しい専用ドメインは、推論リクエストに対して優れたパフォーマンスと高い安定性を提供します。dashscope.aliyuncs.com から {WorkspaceId}.cn-beijing.maas.aliyuncs.com への移行を推奨します。
{WorkspaceId} は、実際の ワークスペース ID に置き換えてください。既存のドメインは引き続き完全に機能します。
重要このドキュメントは 中国 (北京) リージョンにのみ適用されます。モデルを使用するには、中国 (北京) リージョンの API キー を使用する必要があります。
ユーザーガイド: モデルの概要および選択に関する推奨事項については、「リアルタイム音声認識 - Fun-ASR/Paraformer」をご参照ください。
前提条件
サービスを有効化し、API キーを取得 してください。コード漏洩によるセキュリティリスクを回避するため、コード内に API キーをハードコードせず、環境変数として API キーを構成 することを推奨します。
注記サードパーティのアプリケーションやユーザーに一時的なアクセス権を付与する必要がある場合や、機密データへのアクセスや削除など高リスク操作を厳密に制御したい場合は、一時認証トークン の使用を推奨します。
長期的な API キーと比較して、一時認証トークンは有効期間が短く(60 秒)、セキュリティが高く、一時的な呼び出しシナリオに適しており、API キーの漏洩リスクを効果的に低減できます。
使用方法: コード内で、認証に使用していた API キーを取得した一時認証トークンに置き換えます。
モデル一覧
| paraformer-realtime-v2 | paraformer-realtime-8k-v2 | |
|---|---|---|
| 利用シーン | ライブ配信、会議などのシナリオ | 電話オペレーターやボイスメールなどの 8 kHz 音声の認識 |
| サンプルレート | 任意 | 8kHz |
| 言語 | 中国語(標準中国語および各種方言)、英語、日本語、韓国語、ドイツ語、フランス語、ロシア語 サポートされる中国語方言: 上海語、呉語、閩南語、東北弁、甘粛弁、貴州弁、河南弁、湖北弁、湖南弁、江西弁、寧夏弁、山西弁、陝西弁、山東弁、四川弁、天津弁、雲南弁、広東語 | 中国語 |
| 句読点予測 | デフォルトでサポートされており、追加の設定は不要です | デフォルトでサポートされており、追加の設定は不要です |
| 逆テキスト正規化 (ITN) | デフォルトでサポートされており、追加の設定は不要です | デフォルトでサポートされており、追加の設定は不要です |
| カスタムホットワード | 「カスタムホットワード」をご参照ください | 「カスタムホットワード」をご参照ください |
| 認識言語の指定 |
| |
| 感情認識 | (クリックして使用方法を表示) 感情認識には以下の制約があります:
感情認識の結果の取得方法: 文情報 (Sentence) の |
クイックスタート
Recognition クラス は、非ストリーミングおよび双方向ストリーミングの呼び出しインターフェイスを提供します。ニーズに応じて適切な呼び出し方法を選択してください:
- 非ストリーミング呼び出し: ローカルファイルを認識し、一度に完全な結果を返します。事前に録音された音声の処理に適しています。
- 双方向ストリーミング呼び出し: 音声ストリームを直接認識し、結果をリアルタイムで出力します。音声ストリームは外部デバイス(マイクなど)から取得することも、ローカルファイルから読み取ることもできます。即時のフィードバックが必要なシナリオに適しています。
非ストリーミング呼び出し
ローカルファイルを渡して、単一のリアルタイム音声テキスト変換タスクを送信し、転写結果を同期的に取得します。
Recognition クラス のインスタンスを作成し、リクエストパラメーター および認識対象のファイルを指定して call メソッドを呼び出し、認識を実行して認識結果を取得します。
完全な例を表示
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.utils.Constants;
import java.io.File;
public class Main {
public static void main(String[] args) {
// 以下の構成は中国 (北京) リージョン用です。"{WorkspaceId}" は実際のワークスペース ID に置き換えてください。リージョンによって構成は異なります。
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/inference";
// Recognition インスタンスを作成
Recognition recognizer = new Recognition();
// RecognitionParam を作成
RecognitionParam param =
RecognitionParam.builder()
// API キーを環境変数として構成していない場合は、次の行のコメントを解除し、apiKey をご自身の API キーに置き換えてください
// .apiKey("yourApikey")
.model("paraformer-realtime-v2")
.format("wav")
.sampleRate(16000)
// "language_hints" は paraformer-realtime-v2 モデルでのみサポートされています
.parameter("language_hints", new String[]{"zh", "en"})
.build();
try {
System.out.println("Recognition result: " + recognizer.call(param, new File("{YOUR_AUDIO_FILE}")));
} catch (Exception e) {
e.printStackTrace();
} finally {
// タスク終了後に WebSocket 接続を閉じます
recognizer.getDuplexApi().close(1000, "bye");
}
System.out.println(
"[Metric] requestId: "
+ recognizer.getLastRequestId()
+ ", first package delay ms: "
+ recognizer.getFirstPackageDelay()
+ ", last package delay ms: "
+ recognizer.getLastPackageDelay());
System.exit(0);
}
}
双方向ストリーミング: コールバックベース
単一のリアルタイム音声テキスト変換タスクを送信し、コールバックインターフェイスを通じてリアルタイム認識結果をストリーミングします。
-
ストリーミング音声認識を開始
Recognition クラス のインスタンスを作成し、リクエストパラメーター および コールバックインターフェイス (ResultCallback) を指定して
callメソッドを呼び出し、ストリーミング音声認識を開始します。 -
音声データをストリーミング
Recognition クラス の
sendAudioFrameメソッドをループで呼び出し、ローカルファイルまたはデバイス(マイクなど)から読み取ったバイナリ音声ストリームのセグメントをサーバーに送信します。音声データ送信中に、サーバーは コールバックインターフェイス (ResultCallback) の
onEventメソッドを通じて認識結果をリアルタイムでクライアントに返します。各音声セグメントは約 100 ミリ秒の長さ、データサイズは 1 KB ~ 16 KB 程度にすることを推奨します。
-
処理を終了
Recognition クラス の
stopメソッドを呼び出して、音声認識を終了します。このメソッドは、コールバックインターフェイス (ResultCallback) の
onCompleteまたはonErrorコールバックがトリガーされるまで、現在のスレッドをブロックします。
完全な例を表示
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 {
// 以下の構成は中国 (北京) リージョン用です。"{WorkspaceId}" は実際のワークスペース ID に置き換えてください。リージョンによって構成は異なります。
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.cn-beijing.maas.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()
// API キーを環境変数として構成していない場合は、apiKey をご自身の API キーに置き換えてください
// .apiKey("yourApikey")
.model("paraformer-realtime-v2")
.format("wav")
.sampleRate(16000)
// "language_hints" は paraformer-realtime-v2 モデルでのみサポートされています
.parameter("language_hints", new String[]{"zh", "en"})
.build();
Recognition recognizer = new Recognition();
ResultCallback<RecognitionResult> callback = new ResultCallback<RecognitionResult>() {
@Override
public void onEvent(RecognitionResult result) {
if (result.isSentenceEnd()) {
System.out.println("Final Result: " + result.getSentence().getText());
} else {
System.out.println("Intermediate Result: " + result.getSentence().getText());
}
}
@Override
public void onComplete() {
System.out.println("Recognition complete");
}
@Override
public void onError(Exception e) {
System.out.println("RecognitionCallback error: " + e.getMessage());
}
};
try {
recognizer.call(param, callback);
// 音声フォーマットを作成
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();
// 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(
"[Metric] requestId: "
+ recognizer.getLastRequestId()
+ ", first package delay ms: "
+ recognizer.getFirstPackageDelay()
+ ", last package delay ms: "
+ recognizer.getLastPackageDelay());
}
}
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 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.CountDownLatch;
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 {
// 以下の構成は中国 (北京) リージョン用です。"{WorkspaceId}" は実際のワークスペース ID に置き換えてください。リージョンによって構成は異なります。
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/inference";
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(new RealtimeRecognitionTask(Paths.get(System.getProperty("user.dir"), "{YOUR_AUDIO_FILE}")));
executorService.shutdown();
// すべてのタスクが完了するのを待ちます
executorService.awaitTermination(1, TimeUnit.MINUTES);
System.exit(0);
}
}
class RealtimeRecognitionTask implements Runnable {
private Path filepath;
public RealtimeRecognitionTask(Path filepath) {
this.filepath = filepath;
}
@Override
public void run() {
RecognitionParam param = RecognitionParam.builder()
// API キーを環境変数として構成していない場合は、apiKey をご自身の API キーに置き換えてください
// .apiKey("yourApikey")
.model("paraformer-realtime-v2")
.format("wav")
.sampleRate(16000)
// "language_hints" は paraformer-realtime-v2 モデルでのみサポートされています
.parameter("language_hints", new String[]{"zh", "en"})
.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()+" "+
"[process " + threadName + "] Final Result:" + message.getSentence().getText());
} else {
System.out.println(TimeUtils.getTimestamp()+" "+
"[process " + threadName + "] Intermediate Result: " + message.getSentence().getText());
}
}
@Override
public void onComplete() {
System.out.println(TimeUtils.getTimestamp()+" "+"[" + threadName + "] Recognition complete");
}
@Override
public void onError(Exception e) {
System.out.println(TimeUtils.getTimestamp()+" "+
"[" + threadName + "] RecognitionCallback error: " + e.getMessage());
}
};
try {
recognizer.call(param, callback);
// パスを音声ファイルパスに置き換えてください
System.out.println(TimeUtils.getTimestamp()+" "+"[" + threadName + "] Input file_path is: " + this.filepath);
// ファイルを読み取り、チャンク単位で音声を送信
FileInputStream fis = new FileInputStream(this.filepath.toFile());
// 16KHz サンプルレートの場合、チャンクサイズを 1 秒に設定
byte[] buffer = new byte[3200];
int bytesRead;
// ファイルのチャンクをループで読み取り
while ((bytesRead = fis.read(buffer)) != -1) {
ByteBuffer byteBuffer;
// 最後のチャンクはバッファーサイズより小さい可能性があるため処理
System.out.println(TimeUtils.getTimestamp()+" "+"[" + threadName + "] bytesRead: " + bytesRead);
if (bytesRead < buffer.length) {
byteBuffer = ByteBuffer.wrap(buffer, 0, bytesRead);
} else {
byteBuffer = ByteBuffer.wrap(buffer);
}
recognizer.sendAudioFrame(byteBuffer);
buffer = new byte[3200];
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
+ "][Metric] requestId: "
+ recognizer.getLastRequestId()
+ ", first package delay ms: "
+ recognizer.getFirstPackageDelay()
+ ", last package delay ms: "
+ recognizer.getLastPackageDelay());
}
}
双方向ストリーミング: Flowable ベース
単一のリアルタイム音声テキスト変換タスクを送信し、Flowable ワークフローを通じてリアルタイム認識結果をストリーミングします。
Flowable は Apache 2.0 ライセンスの下でリリースされた、ワークフローおよびビジネスプロセス管理のためのオープンソースフレームワークです。Flowable の詳細については、「Flowable API ドキュメント」をご参照ください。
完全な例を表示
Recognition クラス の streamCall メソッドを直接呼び出して認識を開始します。
streamCall メソッドは Flowable<RecognitionResult> インスタンスを返します。Flowable インスタンスの blockingForEach メソッドや subscribe メソッドを呼び出して認識結果を処理できます。認識結果は RecognitionResult にカプセル化されています。
streamCall メソッドには以下の 2 つのパラメーターが必要です:
RecognitionParamインスタンス (リクエストパラメーター): 音声認識のモデル、サンプルレート、音声フォーマットなどのパラメーターを設定するために使用します。Flowable<ByteBuffer>インスタンス:Flowable<ByteBuffer>型のインスタンスを作成し、その内部で音声ストリームの解析メソッドを実装する必要があります。
import com.alibaba.dashscope.audio.asr.recognition.Recognition;
import com.alibaba.dashscope.audio.asr.recognition.RecognitionParam;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.Constants;
import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.TargetDataLine;
import java.nio.ByteBuffer;
public class Main {
public static void main(String[] args) throws NoApiKeyException {
// 以下の構成は中国 (北京) リージョン用です。"{WorkspaceId}" は実際のワークスペース ID に置き換えてください。リージョンによって構成は異なります。
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/inference";
// 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();
// 50 秒間録音し、リアルタイムで文字起こしを実行
while (System.currentTimeMillis() - start < 50000) {
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 を作成し、上記で作成した Flowable<ByteBuffer> を audioFrames パラメーターに渡します
RecognitionParam param = RecognitionParam.builder()
// API キーを環境変数として構成していない場合は、apiKey をご自身の API キーに置き換えてください
// .apiKey("yourApikey")
.model("paraformer-realtime-v2")
.format("pcm")
.sampleRate(16000)
// "language_hints" は paraformer-realtime-v2 モデルでのみサポートされています
.parameter("language_hints", new String[]{"zh", "en"})
.build();
// ストリーミング呼び出しインターフェイス
recognizer
.streamCall(param, audioSource)
.blockingForEach(
result -> {
// 出力結果をサブスクライブ
if (result.isSentenceEnd()) {
System.out.println("Final Result: " + result.getSentence().getText());
} else {
System.out.println("Intermediate Result: " + result.getSentence().getText());
}
});
// タスク終了後に WebSocket 接続を閉じます
recognizer.getDuplexApi().close(1000, "bye");
System.out.println(
"[Metric] requestId: "
+ recognizer.getLastRequestId()
+ ", first package delay ms: "
+ recognizer.getFirstPackageDelay()
+ ", last package delay ms: "
+ recognizer.getLastPackageDelay());
System.exit(0);
}
}
高同時実行呼び出し
DashScope Java SDK は、OkHttp3 のコネクションプーリングを使用して、接続を繰り返し確立するオーバーヘッドを削減します。詳細については、「Paraformer リアルタイム音声認識の高い同時実行性の最適化」をご参照ください。
リクエストパラメーター
RecognitionParam のチェーンメソッドを通じて、モデル、サンプルレート、音声フォーマットなどのパラメーターを構成します。構成済みのパラメーターオブジェクトを Recognition クラス の call/streamCall メソッドに渡します。
例を表示
RecognitionParam param = RecognitionParam.builder()
.model("paraformer-realtime-v2")
.format("pcm")
.sampleRate(16000)
// "language_hints" は paraformer-realtime-v2 モデルでのみサポートされています
.parameter("language_hints", new String[]{"zh", "en"})
.build();
| パラメーター | 型 | デフォルト | 必須 | 説明 |
|---|---|---|---|---|
model | String | はい | リアルタイム音声認識のモデル。詳細については、「モデル一覧」をご参照ください。 | |
sampleRate | Integer | はい | 認識対象の音声のサンプルレート(Hz 単位)を設定します。 モデルによって異なります:
| |
format | String | はい | 認識対象の音声フォーマットを設定します。 サポートされる音声フォーマット: pcm、wav、mp3、opus、speex、aac、amr。 重要opus/speex: Ogg カプセル化を使用する必要があります。 wav: PCM エンコーディングである必要があります。 amr: AMR-NB タイプのみをサポートします。 | |
vocabularyId | String | いいえ | ホットワード ID を設定します。設定しない場合、ホットワードは有効になりません。v2 以降のモデルでは、このフィールドを使用してホットワード ID を設定します。 現在の音声認識セッションでは、このホットワード ID に対応するホットワード情報が適用されます。詳細な使用方法については、「カスタムホットワード」をご参照ください。 | |
disfluencyRemovalEnabled | boolean | false | いいえ | フィラー語のフィルターを設定します:
|
language_hints | String[] | ["zh", "en"] | いいえ | 認識対象の言語コードを設定します。事前に言語を特定できない場合は、未設定のままにしておくと、モデルが自動的に言語を検出します。 現在サポートされている言語コード:
このパラメーターは、複数言語をサポートするモデルでのみ有効になります(「モデル一覧」をご参照ください)。 注記 |
semantic_punctuation_enabled | boolean | false | いいえ | セマンティックセグメンテーションを有効にするかどうかを設定します。デフォルトでは無効です。
セマンティックセグメンテーションは精度が高く、会議の文字起こしなどのシナリオに適しています。VAD(Voice Activity Detection)セグメンテーションは遅延が低く、インタラクティブなシナリオに適しています。
このパラメーターは、モデルが v2 以降の場合にのみ有効になります。 注記 |
max_sentence_silence | Integer | 800 | いいえ | VAD(Voice Activity Detection)セグメンテーションのサイレンス持続時間しきい値(ms 単位)を設定します。 発話セグメント後のサイレンス持続時間がこのしきい値を超えると、システムは文が終了したと判断します。 パラメーター範囲は 200 ms ~ 6000 ms で、デフォルト値は 800 ms です。 このパラメーターは、 注記 |
multi_threshold_mode_enabled | boolean | false | いいえ | このスイッチを有効にすると(true)、VAD セグメンテーションによる長すぎる文の切断を防止します。デフォルトでは無効です。 このパラメーターは、 注記 |
punctuation_prediction_enabled | boolean | true | いいえ | 認識結果に自動的に句読点を追加するかどうかを設定します:
このパラメーターは、モデルが v2 以降の場合にのみ有効になります。 注記 |
heartbeat | boolean | false | いいえ | サーバーとの長時間接続を維持する必要がある場合、このスイッチで動作を制御します:
このパラメーターは、モデルが v2 以降の場合にのみ有効になります。 注記このフィールドを使用するには、SDK バージョンが 2.19.1 以降である必要があります。
|
inverse_text_normalization_enabled | boolean | true | いいえ | ITN(逆テキスト正規化)を有効にするかどうかを設定します。 デフォルトでは有効(true)です。有効にすると、漢数字がアラビア数字に変換されます。 このパラメーターは、モデルが v2 以降の場合にのみ有効になります。 注記 |
apiKey | String | いいえ | ユーザーの API キー。 |
主要インターフェイス
Recognition クラス
Recognition は "import com.alibaba.dashscope.audio.asr.recognition.Recognition;" でインポートします。主要インターフェイスは以下のとおりです:
| インターフェイス/メソッド | パラメーター | 戻り値 | 説明 |
|---|---|---|---|
|
| なし | コールバックベースのストリーミングリアルタイム認識。このメソッドは現在のスレッドをブロックしません。 |
|
| 認識結果 | ローカルファイルに基づく非ストリーミング呼び出し。このメソッドは、すべての音声が読み取られるまで現在のスレッドをブロックします。認識対象のファイルには読み取り権限が必要です。 |
|
|
| Flowable ベースのストリーミングリアルタイム認識。 |
|
| なし | 音声データを送信します。各音声パケットは大きすぎず小さすぎないことが望ましいです。各パケットは約 100 ms の長さ、サイズは 1 KB ~ 16 KB 程度にすることを推奨します。 認識結果は、コールバックインターフェイス (ResultCallback) の onEvent メソッドを通じて取得します。 |
| なし | なし | リアルタイム認識を停止します。 このメソッドは、 |
| code: WebSocket のクローズコード reason: クローズ理由 これらの 2 つのパラメーターは、The WebSocket Protocol ドキュメントに従って構成できます。 | true | タスク終了後は、例外が発生したかどうかに関係なく、接続リークを回避するために WebSocket 接続を閉じる必要があります。接続を再利用して効率を向上させる方法については、「Paraformer リアルタイム音声認識の高い同時実行性の最適化」をご参照ください。 |
| なし | requestId | 現在のタスクの requestId を取得します。 注記このメソッドは、SDK バージョン 2.18.0 以降で利用可能です。 |
| なし | 最初のパッケージ遅延 | 最初のパッケージ遅延を取得します。これは、最初の音声パケットを送信してから最初の認識結果を受信するまでの遅延です。タスク完了後に使用します。 注記このメソッドは、SDK バージョン 2.18.0 以降で利用可能です。 |
| なし | 最後のパッケージ遅延 | 最後のパッケージ遅延を取得します。これは、 注記このメソッドは、SDK バージョン 2.18.0 以降で利用可能です。 |
コールバックインターフェイス (ResultCallback)
双方向ストリーミング呼び出し 中、サーバーはコールバックを通じてクライアントに重要なプロセス情報およびデータを返します。サーバーから返された情報またはデータを処理するために、コールバックメソッドを実装する必要があります。
コールバックメソッドは、抽象クラス ResultCallback を拡張することで実装します。この抽象クラスを拡張する際、ジェネリック型を RecognitionResult に指定できます。RecognitionResult は、サーバーから返されるデータ構造をカプセル化しています。
Java は接続の再利用をサポートしているため、onClose または onOpen コールバックはありません。
| インターフェイス/メソッド | パラメーター | 戻り値 | 説明 |
|---|---|---|---|
|
| なし | サーバーに応答があるときに呼び出されます。 |
| なし | なし | タスクが完了したときに呼び出されます。 |
|
| なし | 例外が発生したときに呼び出されます。 |
応答
リアルタイム認識結果 (RecognitionResult)
RecognitionResult は、リアルタイム認識セッションの結果を表します。
| インターフェイス/メソッド | パラメーター | 戻り値 | 説明 |
|---|---|---|---|
| なし | requestId | requestId を取得します。 |
| なし | 完全な文であるか、つまり文境界に達しているか | 指定された文が終了したかどうかを判定します。 |
| なし | タイムスタンプおよびテキストを含む文情報を取得します。 |
文情報 (Sentence)
| インターフェイス/メソッド | パラメーター | 戻り値 | 説明 |
|---|---|---|---|
| なし | 文の開始時刻(ms 単位) | 文の開始時刻を返します。 |
| なし | 文の終了時刻(ms 単位) | 文の終了時刻を返します。 |
| なし | 認識テキスト | 認識されたテキストを返します。 |
| なし | 単語タイムスタンプ情報 (Word) のリスト | 単語レベルのタイムスタンプ情報を返します。 |
| なし | 現在の文の感情 | 現在の文の感情を返します:
感情認識には以下の制約があります:
|
| なし | 現在の文の感情信頼度 | 現在の文の感情信頼度を返します。値の範囲: [0.0, 1.0]。値が高いほど信頼度が高いことを示します。 感情認識には以下の制約があります:
|
単語タイムスタンプ情報 (Word)
| インターフェイス/メソッド | パラメーター | 戻り値 | 説明 |
|---|---|---|---|
| なし | 単語の開始時刻(ms 単位) | 単語の開始時刻を返します。 |
| なし | 単語の終了時刻(ms 単位) | 単語の終了時刻を返します。 |
| なし | 単語 | 認識された単語を返します。 |
| なし | 句読点 | 句読点を返します。 |
エラーコード
エラーが発生した場合は、「エラーコード」を参照してトラブルシューティングを行ってください。
問題が解決しない場合は、開発者コミュニティ に参加し、問題を報告して Request ID を提供してください。
その他の例
その他の例については、「GitHub」をご参照ください。
よくある質問
機能に関する質問
Q: 長時間のサイレンス中にサーバーとの長時間接続を維持するにはどうすればよいですか?
リクエストパラメーター heartbeat を true に設定し、サーバーに継続的にサイレント音声を送信します。
サイレント音声とは、音声信号を含まない音声ファイルまたはデータストリームを指します。サイレント音声は、Audacity や Adobe Audition などの音声編集ソフトウェアや、FFmpeg などのコマンドラインツールを使用して生成できます。
Q: 音声をサポートされているフォーマットに変換するにはどうすればよいですか?
FFmpeg ツール を使用できます。詳細な使用方法については、FFmpeg 公式サイトをご参照ください。
# 基本的な変換コマンド(汎用テンプレート)
# -i: 入力ファイルパス。例: audio.wav
# -c:a: 音声コーデック。例: aac、libmp3lame、pcm_s16le
# -b:a: ビットレート(品質制御)。例: 192k、320k
# -ar: サンプルレート。例: 44100(CD)、48000、16000
# -ac: チャンネル数。例: 1(モノラル)、2(ステレオ)
# -y: 既存のファイルを上書き(値は不要)
ffmpeg -i input_audio.ext -c:a codec_name -b:a bitrate -ar sample_rate -ac channels output.ext
# 例: WAV → MP3(オリジナル品質を保持)
ffmpeg -i input.wav -c:a libmp3lame -q:a 0 output.mp3
# 例: MP3 → WAV(16 ビット PCM 標準フォーマット)
ffmpeg -i input.mp3 -c:a pcm_s16le -ar 44100 -ac 2 output.wav
# 例: M4A → AAC(Apple 音声の抽出/変換)
ffmpeg -i input.m4a -c:a copy output.aac # 再エンコードせずに直接抽出
ffmpeg -i input.m4a -c:a aac -b:a 256k output.aac # 高品質のために再エンコード
# 例: FLAC ロスレス → Opus(高圧縮)
ffmpeg -i input.flac -c:a libopus -b:a 128k -vbr on output.opus
Q: 各文の時間範囲を確認できますか?
はい。音声認識結果には各文の開始時刻および終了時刻のタイムスタンプが含まれており、これを使用して各文の時間範囲を確認できます。
Q: ローカルファイル(録音済み音声)を認識するにはどうすればよいですか?
ローカルファイルを認識するには、以下の 2 つの方法があります:
-
ローカルファイルパスを直接渡す: この方法では、認識が完全に完了した後にのみ完全な認識結果を取得でき、即時のフィードバックが必要なシナリオには適していません。
「非ストリーミング呼び出し」をご参照ください。Recognition クラス の
callメソッドにファイルパスを渡して、録音済みファイルを直接認識します。 -
ローカルファイルをバイナリストリームに変換して認識する: この方法では、ファイルをストリーミングしながら認識結果を取得でき、即時のフィードバックが必要なシナリオに適しています。
- 「双方向ストリーミング: コールバックベース」をご参照ください。Recognition クラス の
sendAudioFrameメソッドを使用して、バイナリストリームをサーバーに送信して認識します。 - 「双方向ストリーミング: Flowable ベース」をご参照ください。Recognition クラス の
streamCallメソッドを使用して、バイナリストリームをサーバーに送信して認識します。
- 「双方向ストリーミング: コールバックベース」をご参照ください。Recognition クラス の
トラブルシューティング
Q: 音声が認識されない(認識結果がない)原因は何ですか?
-
リクエストパラメーター内の音声フォーマット(
format)およびサンプルレート(sampleRate/sample_rate)が正しく設定され、パラメーター制約に準拠しているか確認してください。以下は一般的なエラー例です:- 音声ファイルの拡張子が .wav ですが、実際のフォーマットは MP3 であり、リクエストパラメーター
formatが mp3 に設定されている(不正確なパラメーター設定)。 - 音声のサンプルレートが 3600 Hz ですが、リクエストパラメーター
sampleRate/sample_rateが 48000 に設定されている(不正確なパラメーター設定)。
音声のコンテナ、コーデック、サンプルレート、チャンネルなどの情報を取得するには、ffprobe ツールを使用できます:
- 音声ファイルの拡張子が .wav ですが、実際のフォーマットは MP3 であり、リクエストパラメーター
ffprobe -v error -show_entries format=format_name -show_entries stream=codec_name,sample_rate,channels -of default=noprint_wrappers=1 input.xxx
-
paraformer-realtime-v2モデルを使用する場合、language_hintsで設定された言語が音声の実際の言語と一致しているか確認してください。例: 音声は実際に中国語ですが、
language_hintsがen(英語)に設定されている。 -
上記のすべてのチェックに合格すれば、特定の単語に対する認識精度を向上させるためにカスタムホットワードを使用できます。