すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Model Studio:Paraformer リアルタイム音声認識 Java SDK

最終更新日:Sep 09, 2026

このトピックでは、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());
    }
}
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 単位)を設定します。

モデルによって異なります:

  • paraformer-realtime-v2 は任意のサンプルレートをサポートします。
  • paraformer-realtime-8k-v2 は 8000 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

いいえ

フィラー語のフィルターを設定します:

  • true: フィラー語をフィルター
  • false(デフォルト): フィラー語をフィルターしない

language_hints

String[]

["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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("language_hints", new String[]{"zh", "en"}))
 .build();

semantic_punctuation_enabled

boolean

false

いいえ

セマンティックセグメンテーションを有効にするかどうかを設定します。デフォルトでは無効です。

  • 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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("semantic_punctuation_enabled", true))
 .build();

max_sentence_silence

Integer

800

いいえ

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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("max_sentence_silence", 800))
 .build();

multi_threshold_mode_enabled

boolean

false

いいえ

このスイッチを有効にすると(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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("multi_threshold_mode_enabled", true))
 .build();

punctuation_prediction_enabled

boolean

true

いいえ

認識結果に自動的に句読点を追加するかどうかを設定します:

  • 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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("punctuation_prediction_enabled", false))
 .build();

heartbeat

boolean

false

いいえ

サーバーとの長時間接続を維持する必要がある場合、このスイッチで動作を制御します:

  • 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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("heartbeat", true))
 .build();

inverse_text_normalization_enabled

boolean

true

いいえ

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();
RecognitionParam param = RecognitionParam.builder()
 .model("paraformer-realtime-v2")
 .format("pcm")
 .sampleRate(16000)
 .parameters(Collections.singletonMap("inverse_text_normalization_enabled", false))
 .build();

apiKey

String

いいえ

ユーザーの 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()

なし

requestId

requestId を取得します。

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_hintsen(英語)に設定されている。

  2. 上記のすべてのチェックに合格すれば、特定の単語に対する認識精度を向上させるためにカスタムホットワードを使用できます。