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

Alibaba Cloud Model Studio:リアルタイム音声認識:Fun-ASR/Paraformer

最終更新日:Mar 22, 2026

リアルタイム音声認識サービスは、音声ストリームを句読点付きのテキストに変換します。マイク入力、会議録音、ローカル音声ファイルなど、さまざまな音声ソースからの文字起こしが可能です。主な利用シーンには、リアルタイム会議文字起こし、ライブ字幕、音声チャット、インテリジェントカスタマーサービスなどがあります。

主な機能

  • 中国語、英語、および各種方言を含む複数言語向けのリアルタイム音声認識。

  • タイムスタンプ出力により、構造化された認識結果を生成。

  • 柔軟なサンプルレートと複数の音声フォーマットに対応し、さまざまな録音環境に最適化。

  • オプションの音声活動検出(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)の場合、以下の推奨事項が適用されます:

    1. 例外のキャッチ:「on_error」メソッドを「Callback」クラスに実装します。dashscope SDK は、ネットワークエラーまたはその他の問題が発生した際に、このメソッドを呼び出します。

    2. 再接続用の信号: お使いの on_error メソッドで、再接続用の信号を設定します。Python では、threading.Event を使用できます。これは、スレッドセーフな信号通知メカニズムです。

    3. 再接続ループの実装:メインロジックを「for」ループでラップしてリトライを管理します(例:最大 3 回の試行)。再接続シグナルを検出した場合、現在の認識タスクを中断し、すべてのリソースをクリーンアップした後、数秒待機してから新しい接続を確立するためにループを再開します。

  • 接続切断防止のためのハートビート設定:サービスとの長期間の接続を維持するには、「heartbeat」パラメーターを「true」に設定します。これにより、音声の長時間のサイレンス中であっても、接続が切断されるのを防ぎます。

  • レート制限:モデル API を呼び出す際は、モデルの「レート制限」ルールに従ってください。

API

モデル機能比較

機能

Fun-ASR

Paraformer

サポート言語

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

  • fun-asr-realtime、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:中国語。

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

  • paraformer-realtime-v2:中国語(標準語および広東語、呉語、上海語などの方言)、英語、日本語、韓国語、ドイツ語、フランス語、ロシア語。

  • paraformer-realtime-v1、paraformer-realtime-8k-v2、および paraformer-realtime-8k-v1:中国語(標準語)。

サポート音声フォーマット

PCM、WAV、MP3、OPUS、Speex、AAC、AMR。

サンプルレート

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

  • fun-asr-realtime、fun-asr-realtime-2026-02-28、fun-asr-realtime-2025-11-07、および fun-asr-realtime-2025-09-15:16 kHz。

  • fun-asr-flash-8k-realtime および fun-asr-flash-8k-realtime-2026-01-28:8 kHz。

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

  • paraformer-realtime-v2:任意のサンプルレート。

  • paraformer-realtime-v1:16 kHz。

  • paraformer-realtime-8k-v2 および paraformer-realtime-8k-v1:8 kHz。

音声チャンネル

Mono.

入力フォーマット

バイナリ音声ストリーム。

音声持続時間

無制限版。

無制限版

感情認識

非対応。

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

  • paraformer-realtime-v2、paraformer-realtime-v1、および paraformer-realtime-8k-v1:非対応。

  • paraformer-realtime-8k-v2:デフォルトで有効(無効化可能)。

センシティブワードフィルタリング

非対応。

話者識別

非対応。

フィラー語フィルタリング

非対応。

デフォルトで無効(有効化可能)。

タイムスタンプ

常に有効。

句読点予測

常に有効。

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

  • paraformer-realtime-v2 および paraformer-realtime-8k-v2:デフォルトで有効(無効化可能)。

  • paraformer-realtime-v1 および paraformer-realtime-8k-v1:常に有効。

ホットワード

非対応。

逆テキスト正規化(ITN)

常に有効。

音声活動検出(VAD)

常に有効。

レート制限(RPS)

20

20

統合方法

Java、Python、Android、iOS SDK;WebSocket API。

価格

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

  • fun-asr-realtime、fun-asr-realtime-2026-02-28、および fun-asr-realtime-2025-11-07:

    • 国際:$0.00009/秒

    • 中国本土:$0.000047/秒

  • fun-asr-realtime-2025-09-15:

    • 中国本土:$0.000047/秒

  • fun-asr-flash-8k-realtime および fun-asr-flash-8k-realtime-2026-01-28:

    • 中国本土:$0.000032/秒

中国本土:$0.000034/秒