Skip to main content

Paraformer リアルタイム音声認識 Java SDK

このトピックでは、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-v2paraformer-realtime-8k-v2
利用シーンライブ配信、会議などのシナリオ電話オペレーターやボイスメールなどの 8 kHz 音声の認識
サンプルレート任意8kHz
言語中国語(標準中国語および各種方言)、英語、日本語、韓国語、ドイツ語、フランス語、ロシア語サポートされる中国語方言: 上海語、呉語、閩南語、東北弁、甘粛弁、貴州弁、河南弁、湖北弁、湖南弁、江西弁、寧夏弁、山西弁、陝西弁、山東弁、四川弁、天津弁、雲南弁、広東語中国語
句読点予測デフォルトでサポートされており、追加の設定は不要ですデフォルトでサポートされており、追加の設定は不要です
逆テキスト正規化 (ITN)デフォルトでサポートされており、追加の設定は不要ですデフォルトでサポートされており、追加の設定は不要です
カスタムホットワード「カスタムホットワード」をご参照ください「カスタムホットワード」をご参照ください
認識言語の指定language_hints パラメーターで指定
感情認識
感情認識には以下の制約があります:
  • paraformer-realtime-8k-v2 モデルでのみ利用可能です。
  • セマンティックセグメンテーションを無効にする必要があります(リクエストパラメーター semantic_punctuation_enabled で制御)。セマンティックセグメンテーションはデフォルトで無効になっています。
  • 感情認識の結果は、リアルタイム認識結果 (RecognitionResult) の isSentenceEnd メソッドが true を返す場合にのみ表示されます。
感情認識の結果の取得方法: 文情報 (Sentence) の getEmoTag メソッドおよび getEmoConfidence メソッドを呼び出して、それぞれ現在の文の感情および感情の信頼度を取得します。

クイックスタート

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);
    }
}

双方向ストリーミング: コールバックベース

単一のリアルタイム音声テキスト変換タスクを送信し、コールバックインターフェイスを通じてリアルタイム認識結果をストリーミングします。
  1. ストリーミング音声認識を開始 Recognition クラス のインスタンスを作成し、リクエストパラメーター および コールバックインターフェイス (ResultCallback) を指定して call メソッドを呼び出し、ストリーミング音声認識を開始します。
  2. 音声データをストリーミング Recognition クラス の sendAudioFrame メソッドをループで呼び出し、ローカルファイルまたはデバイス(マイクなど)から読み取ったバイナリ音声ストリームのセグメントをサーバーに送信します。 音声データ送信中に、サーバーは コールバックインターフェイス (ResultCallback) の onEvent メソッドを通じて認識結果をリアルタイムでクライアントに返します。 各音声セグメントは約 100 ミリ秒の長さ、データサイズは 1 KB ~ 16 KB 程度にすることを推奨します。
  3. 処理を終了 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());
    }
}

双方向ストリーミング: 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();
パラメーター型デフォルト必須説明
modelString
はいリアルタイム音声認識のモデル。詳細については、「モデル一覧」をご参照ください。
sampleRateInteger
はい認識対象の音声のサンプルレート(Hz 単位)を設定します。モデルによって異なります:
  • paraformer-realtime-v2 は任意のサンプルレートをサポートします。
  • paraformer-realtime-8k-v2 は 8000 Hz サンプルレートのみをサポートします。
formatString
はい認識対象の音声フォーマットを設定します。サポートされる音声フォーマット: pcm、wav、mp3、opus、speex、aac、amr。
opus/speex: Ogg カプセル化を使用する必要があります。wav: PCM エンコーディングである必要があります。amr: AMR-NB タイプのみをサポートします。
vocabularyIdString
いいえホットワード ID を設定します。設定しない場合、ホットワードは有効になりません。v2 以降のモデルでは、このフィールドを使用してホットワード ID を設定します。現在の音声認識セッションでは、このホットワード ID に対応するホットワード情報が適用されます。詳細な使用方法については、「カスタムホットワード」をご参照ください。
disfluencyRemovalEnabledbooleanfalseいいえフィラー語のフィルターを設定します:
  • true: フィラー語をフィルター
  • false(デフォルト): フィラー語をフィルターしない
language_hintsString[]["zh", "en"]いいえ認識対象の言語コードを設定します。事前に言語を特定できない場合は、未設定のままにしておくと、モデルが自動的に言語を検出します。現在サポートされている言語コード:
  • zh: 中国語
  • en: 英語
  • ja: 日本語
  • yue: 広東語
  • ko: 韓国語
  • de: ドイツ語
  • fr: フランス語
  • ru: ロシア語
このパラメーターは、複数言語をサポートするモデルでのみ有効になります(「モデル一覧」をご参照ください)。
language_hints は、RecognitionParam インスタンスの parameter メソッドまたは parameters メソッドを通じて設定する必要があります:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("language_hints", new String[]{"zh", "en"})
 .build();
semantic_punctuation_enabledbooleanfalseいいえセマンティックセグメンテーションを有効にするかどうかを設定します。デフォルトでは無効です。
  • true: セマンティックセグメンテーションを有効にし、VAD(Voice Activity Detection)セグメンテーションを無効にします。
  • false(デフォルト): VAD(Voice Activity Detection)セグメンテーションを有効にし、セマンティックセグメンテーションを無効にします。
セマンティックセグメンテーションは精度が高く、会議の文字起こしなどのシナリオに適しています。VAD(Voice Activity Detection)セグメンテーションは遅延が低く、インタラクティブなシナリオに適しています。semantic_punctuation_enabled パラメーターを調整することで、異なるシナリオに合わせて音声認識のセグメンテーション方法を柔軟に切り替えることができます。このパラメーターは、モデルが v2 以降の場合にのみ有効になります。
semantic_punctuation_enabled は、RecognitionParam インスタンスの parameter メソッドまたは parameters メソッドを通じて設定する必要があります:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("semantic_punctuation_enabled", true)
 .build();
max_sentence_silenceInteger800いいえVAD(Voice Activity Detection)セグメンテーションのサイレンス持続時間しきい値(ms 単位)を設定します。発話セグメント後のサイレンス持続時間がこのしきい値を超えると、システムは文が終了したと判断します。パラメーター範囲は 200 ms ~ 6000 ms で、デフォルト値は 800 ms です。このパラメーターは、semantic_punctuation_enabled パラメーターが false(VAD セグメンテーション)で、かつモデルが v2 以降の場合にのみ有効になります。
max_sentence_silence は、RecognitionParam インスタンスの parameter メソッドまたは parameters メソッドを通じて設定する必要があります:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("max_sentence_silence", 800)
 .build();
multi_threshold_mode_enabledbooleanfalseいいえこのスイッチを有効にすると(true)、VAD セグメンテーションによる長すぎる文の切断を防止します。デフォルトでは無効です。このパラメーターは、semantic_punctuation_enabled パラメーターが false(VAD セグメンテーション)で、かつモデルが v2 以降の場合にのみ有効になります。
multi_threshold_mode_enabled は、RecognitionParam インスタンスの parameter メソッドまたは parameters メソッドを通じて設定する必要があります:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("multi_threshold_mode_enabled", true)
 .build();
punctuation_prediction_enabledbooleantrueいいえ認識結果に自動的に句読点を追加するかどうかを設定します:
  • true(デフォルト): はい
  • false: いいえ
このパラメーターは、モデルが v2 以降の場合にのみ有効になります。
punctuation_prediction_enabled は、RecognitionParam インスタンスの parameter メソッドまたは parameters メソッドを通じて設定する必要があります:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("punctuation_prediction_enabled", false)
 .build();
heartbeatbooleanfalseいいえサーバーとの長時間接続を維持する必要がある場合、このスイッチで動作を制御します:
  • true: サイレント音声を継続的に送信しても、サーバーとの接続が途切れずに維持されます。
  • false(デフォルト): サイレント音声を継続的に送信しても、一定時間後に接続がタイムアウトして閉じられます。 サイレント音声とは、音声信号を含まない音声ファイルまたはデータストリームを指します。サイレント音声は、Audacity や Adobe Audition などの音声編集ソフトウェアや、FFmpeg などのコマンドラインツールを使用して生成できます。
このパラメーターは、モデルが v2 以降の場合にのみ有効になります。
このフィールドを使用するには、SDK バージョンが 2.19.1 以降である必要があります。heartbeat は、RecognitionParam インスタンスの parameter メソッドまたは parameters メソッドを通じて設定する必要があります:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("heartbeat", true)
 .build();
inverse_text_normalization_enabledbooleantrueいいえITN(逆テキスト正規化)を有効にするかどうかを設定します。デフォルトでは有効(true)です。有効にすると、漢数字がアラビア数字に変換されます。このパラメーターは、モデルが v2 以降の場合にのみ有効になります。
inverse_text_normalization_enabled は、RecognitionParam インスタンスの parameter メソッドまたは parameters メソッドを通じて設定する必要があります:
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameter("inverse_text_normalization_enabled", false)
 .build();
apiKeyString
いいえユーザーの API キー。

主要インターフェイス

Recognition クラス

Recognition は "import com.alibaba.dashscope.audio.asr.recognition.Recognition;" でインポートします。主要インターフェイスは以下のとおりです:
インターフェイス/メソッドパラメーター戻り値説明
public void call(RecognitionParam param, final ResultCallback<RecognitionResult> callback)
なしコールバックベースのストリーミングリアルタイム認識。このメソッドは現在のスレッドをブロックしません。
public String call(RecognitionParam param, File file)
認識結果ローカルファイルに基づく非ストリーミング呼び出し。このメソッドは、すべての音声が読み取られるまで現在のスレッドをブロックします。認識対象のファイルには読み取り権限が必要です。
public Flowable<RecognitionResult> streamCall(RecognitionParam param, Flowable<ByteBuffer> audioFrame)
Flowable<RecognitionResult>Flowable ベースのストリーミングリアルタイム認識。
public void sendAudioFrame(ByteBuffer audioFrame)
  • audioFrame: ByteBuffer 型のバイナリ音声ストリーム
なし音声データを送信します。各音声パケットは大きすぎず小さすぎないことが望ましいです。各パケットは約 100 ms の長さ、サイズは 1 KB ~ 16 KB 程度にすることを推奨します。認識結果は、コールバックインターフェイス (ResultCallback) の onEvent メソッドを通じて取得します。
public void stop()
なしなしリアルタイム認識を停止します。このメソッドは、ResultCallback インスタンスの onComplete または onError メソッドが呼び出されるまで、現在のスレッドをブロックします。
recognizer.getDuplexApi().close(int code, String reason)
code: WebSocket のクローズコードreason: クローズ理由これらの 2 つのパラメーターは、The WebSocket Protocol ドキュメントに従って構成できます。trueタスク終了後は、例外が発生したかどうかに関係なく、接続リークを回避するために WebSocket 接続を閉じる必要があります。接続を再利用して効率を向上させる方法については、「Paraformer リアルタイム音声認識の高い同時実行性の最適化」をご参照ください。
public String getLastRequestId()
なしrequestId現在のタスクの requestId を取得します。call または streamingCall で新しいタスクを開始した後に利用可能になります。
このメソッドは、SDK バージョン 2.18.0 以降で利用可能です。
public long getFirstPackageDelay()
なし最初のパッケージ遅延最初のパッケージ遅延を取得します。これは、最初の音声パケットを送信してから最初の認識結果を受信するまでの遅延です。タスク完了後に使用します。
このメソッドは、SDK バージョン 2.18.0 以降で利用可能です。
public long getLastPackageDelay()
なし最後のパッケージ遅延最後のパッケージ遅延を取得します。これは、stop コマンドを送信してから最後の認識結果を受信するまでの遅延です。タスク完了後に使用します。
このメソッドは、SDK バージョン 2.18.0 以降で利用可能です。

コールバックインターフェイス (ResultCallback)

双方向ストリーミング呼び出し 中、サーバーはコールバックを通じてクライアントに重要なプロセス情報およびデータを返します。サーバーから返された情報またはデータを処理するために、コールバックメソッドを実装する必要があります。 コールバックメソッドは、抽象クラス ResultCallback を拡張することで実装します。この抽象クラスを拡張する際、ジェネリック型を RecognitionResult に指定できます。RecognitionResult は、サーバーから返されるデータ構造をカプセル化しています。 Java は接続の再利用をサポートしているため、onClose または onOpen コールバックはありません。

例

ResultCallback<RecognitionResult> callback = new ResultCallback<RecognitionResult>() {
    @Override
    public void onEvent(RecognitionResult result) {
        System.out.println("RequestId: " + result.getRequestId());
        // 音声認識結果を処理するロジックをここに実装
    }

    @Override
    public void onComplete() {
        System.out.println("タスク完了");
    }

    @Override
    public void onError(Exception e) {
        System.out.println("タスク失敗: " + e.getMessage());
    }
};
インターフェイス/メソッドパラメーター戻り値説明
public void onEvent(RecognitionResult result)
result: リアルタイム認識結果 (RecognitionResult)なしサーバーに応答があるときに呼び出されます。
public void onComplete()
なしなしタスクが完了したときに呼び出されます。
public void onError(Exception e)
e: 例外情報なし例外が発生したときに呼び出されます。

応答

リアルタイム認識結果 (RecognitionResult)

RecognitionResult は、リアルタイム認識セッションの結果を表します。
インターフェイス/メソッドパラメーター戻り値説明
public String getRequestId()
なしrequestIdrequestId を取得します。
public boolean isSentenceEnd()
なし完全な文であるか、つまり文境界に達しているか指定された文が終了したかどうかを判定します。
public Sentence getSentence()
なし文情報 (Sentence)タイムスタンプおよびテキストを含む文情報を取得します。

文情報 (Sentence)

インターフェイス/メソッドパラメーター戻り値説明
public Long getBeginTime()
なし文の開始時刻(ms 単位)文の開始時刻を返します。
public Long getEndTime()
なし文の終了時刻(ms 単位)文の終了時刻を返します。
public String getText()
なし認識テキスト認識されたテキストを返します。
public List<Word> getWords()
なし単語タイムスタンプ情報 (Word) のリスト単語レベルのタイムスタンプ情報を返します。
public String getEmoTag()
なし現在の文の感情現在の文の感情を返します:
  • positive: 前向きな感情(例: 喜び、満足)
  • negative: ネガティブな感情(例: 怒り、憂鬱)
  • neutral: 明確な感情なし
感情認識には以下の制約があります:
  • paraformer-realtime-8k-v2 モデルでのみ利用可能です。
  • セマンティックセグメンテーションを無効にする必要があります(リクエストパラメーター semantic_punctuation_enabled で制御)。セマンティックセグメンテーションはデフォルトで無効になっています。
  • 感情認識の結果は、リアルタイム認識結果 (RecognitionResult) の isSentenceEnd メソッドが true を返す場合にのみ表示されます。
public Double getEmoConfidence()
なし現在の文の感情信頼度現在の文の感情信頼度を返します。値の範囲: [0.0, 1.0]。値が高いほど信頼度が高いことを示します。感情認識には以下の制約があります:
  • paraformer-realtime-8k-v2 モデルでのみ利用可能です。
  • セマンティックセグメンテーションを無効にする必要があります(リクエストパラメーター semantic_punctuation_enabled で制御)。セマンティックセグメンテーションはデフォルトで無効になっています。
  • 感情認識の結果は、リアルタイム認識結果 (RecognitionResult) の isSentenceEnd メソッドが true を返す場合にのみ表示されます。

単語タイムスタンプ情報 (Word)

インターフェイス/メソッドパラメーター戻り値説明
public long getBeginTime()
なし単語の開始時刻(ms 単位)単語の開始時刻を返します。
public long getEndTime()
なし単語の終了時刻(ms 単位)単語の終了時刻を返します。
public String getText()
なし単語認識された単語を返します。
public String getPunctuation()
なし句読点句読点を返します。

エラーコード

エラーが発生した場合は、「エラーコード」を参照してトラブルシューティングを行ってください。 問題が解決しない場合は、開発者コミュニティ に参加し、問題を報告して 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 メソッドにファイルパスを渡して、録音済みファイルを直接認識します。
  • ローカルファイルをバイナリストリームに変換して認識する: この方法では、ファイルをストリーミングしながら認識結果を取得でき、即時のフィードバックが必要なシナリオに適しています。

トラブルシューティング

Q: 音声が認識されない(認識結果がない)原因は何ですか?

  1. リクエストパラメーター内の音声フォーマット(format)およびサンプルレート(sampleRate/sample_rate)が正しく設定され、パラメーター制約に準拠しているか確認してください。以下は一般的なエラー例です:
    • 音声ファイルの拡張子が .wav ですが、実際のフォーマットは MP3 であり、リクエストパラメーター format が mp3 に設定されている(不正確なパラメーター設定)。
    • 音声のサンプルレートが 3600 Hz ですが、リクエストパラメーター sampleRate/sample_rate が 48000 に設定されている(不正確なパラメーター設定)。
    音声のコンテナ、コーデック、サンプルレート、チャンネルなどの情報を取得するには、ffprobe ツールを使用できます:
ffprobe -v error -show_entries format=format_name -show_entries stream=codec_name,sample_rate,channels -of default=noprint_wrappers=1 input.xxx
  1. paraformer-realtime-v2 モデルを使用する場合、language_hints で設定された言語が音声の実際の言語と一致しているか確認してください。 例: 音声は実際に中国語ですが、language_hints が en(英語)に設定されている。
  2. 上記のすべてのチェックに合格すれば、特定の単語に対する認識精度を向上させるためにカスタムホットワードを使用できます。