このトピックでは、Qwen-Audio-3.0-ASR-Flash-Streaming/Fun-ASR-Realtime リアルタイム音声認識用の Java SDK のパラメーターとインターフェイスについて説明します。
重要Alibaba Cloud Model Studio は、中国 (北京) およびシンガポールリージョン向けにワークスペース固有のドメインをリリースしました。新しい専用ドメインは、推論リクエストに対して優れたパフォーマンスと高い安定性を提供します。新しいドメインへの移行を推奨します:
- 中国 (北京):
dashscope.aliyuncs.comから{WorkspaceId}.cn-beijing.maas.aliyuncs.comへ - シンガポール:
dashscope-intl.aliyuncs.comから{WorkspaceId}.ap-southeast-1.maas.aliyuncs.comへ
{WorkspaceId} を実際のワークスペース ID に置き換えてください。既存のドメインも引き続き完全に機能します。
ユーザーガイド:モデルの紹介とモデル選択のガイダンスについては、「音声テキスト変換」をご参照ください。
前提条件
サービスが有効化されており、「API キーの取得」が完了していること。コード漏洩によるセキュリティリスクを防ぐため、コードにハードコーディングするのではなく、「API キーを環境変数として設定」してください。
クイックスタート
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}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/inference";
// Recognition インスタンスを作成
Recognition recognizer = new Recognition();
// RecognitionParam を作成
RecognitionParam param =
RecognitionParam.builder()
.model("qwen-audio-3.0-asr-flash-streaming")
// API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得:https://www.alibabacloud.com/help/ja/model-studio/get-api-key
// 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えてください:.apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.format("wav")
.sampleRate(16000)
//.parameter("language_hints", new String[]{"zh"})
.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 クラスをインスタンス化し、
callメソッドを呼び出してリクエストパラメーターとコールバックインターフェイス (ResultCallback) をバインドし、ストリーミング音声認識を開始します。 -
音声のストリーミング
Recognition クラスの
sendAudioFrameメソッドをループで呼び出し、バイナリ音声ストリームをセグメントに分けてサーバーに送信します。音声はローカルファイルまたはマイクなどのデバイスから読み取ります。音声データが送信されている間、サーバーはコールバックインターフェイス (ResultCallback) の
onEventメソッドを通じて、リアルタイムで認識結果をクライアントに返します。フレームごとに約 100 ms の音声を送信し、各ペイロードを 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}.ap-southeast-1.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()
.model("qwen-audio-3.0-asr-flash-streaming")
// API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得:https://www.alibabacloud.com/help/ja/model-studio/get-api-key
// 環境変数を設定していない場合は、次の行を Model Studio の 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("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.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 {
// 以下はシンガポールリージョンの設定です。呼び出す際は、"{WorkspaceId}" を実際のワークスペース ID に置き換えてください。設定はリージョンによって異なります。
Constants.baseWebsocketApiUrl = "wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/inference";
// 実際のアプリケーションでは、このメソッドはプログラムの最初に一度だけ実行すればよく、複数回実行する必要はありません。
warmUp();
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);
}
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("qwen-audio-3.0-asr-flash-streaming")
// API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得:https://www.alibabacloud.com/help/ja/model-studio/get-api-key
// 環境変数を設定していない場合は、次の行を Model Studio の 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()+" "+
"[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());
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
+ "][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}.ap-southeast-1.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()
.model("qwen-audio-3.0-asr-flash-streaming")
// API キーはシンガポールリージョンと北京リージョンで異なります。API キーの取得:https://www.alibabacloud.com/help/ja/model-studio/get-api-key
// 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えてください:.apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.format("pcm")
.sampleRate(16000)
.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("qwen-audio-3.0-asr-flash-streaming")
.format("pcm")
.sampleRate(16000)
//.parameter("language_hints", new String[]{"zh"})
.build();
| パラメーター | タイプ | 必須 | 説明 |
|---|---|---|---|
model | String | はい | モデル名。Qwen-Audio-3.0-ASR-Flash-Streaming および Fun-ASR-Realtime モデルシリーズがサポートされています。詳細については、「サポートされているモデルとリージョン」をご参照ください。 |
sampleRate | Integer | はい | サンプルレート (Hz)。 有効値:8 kHz モデルは 8000 Hz のみをサポートします。その他のモデルは任意のサンプルレートをサポートします。 |
format | String | はい | 音声フォーマット。 有効値:
重要opus/speex:Ogg カプセル化を使用する必要があります。 wav:PCM エンコーディングを使用する必要があります。 amr:AMR-NB タイプのみがサポートされています。 |
vocabularyId | String | いいえ | プリコンパイルされたホットワードリストの ID。 この ID は、ホットワードリスト作成 API を呼び出して事前に生成します。認識時に ID を渡して、リスト内のホットワードを使用します。 語彙が既知で比較的安定しており、同じ単語リストをリクエスト間で再利用する必要があるシナリオに適しています。 使用方法の詳細については、「プリコンパイルされたホットワード」をご参照ください。 |
vocabulary | Map<String, Integer> | いいえ | 即時ホットワード。 キーと値のペアとして渡されます。キーはホットワードのテキスト ( 一時的な、セッションレベルのホットワード最適化に適しています。 プリコンパイルされたホットワードと一緒に設定された場合、即時ホットワードのみが有効になります。使用方法の詳細については、「即時ホットワード」をご参照ください。 重要 注記 |
semantic_punctuation_enabled | boolean | いいえ | セマンティックセグメンテーションを有効にするかどうか。 デフォルト値:false。
セマンティックセグメンテーションはより正確で、会議の文字起こしシナリオに適しています。VAD (音声アクティビティ検出) セグメンテーションはレイテンシが低く、インタラクティブなシナリオに適しています。 注記 |
max_sentence_silence | Integer | いいえ | セグメンテーションのための VAD 無音しきい値 (ms)。音声セグメントの後の無音がこのしきい値を超えると、システムは文が終了したと判断します。 デフォルト値:1300。 有効値:[200, 6000]。 注記 |
multi_threshold_mode_enabled | boolean | いいえ | 重要 マルチしきい値モードを有効にするかどうか。有効にすると、VAD セグメントが長くなりすぎるのを防ぎます。 デフォルト値:false。 注記 |
punctuation_prediction_enabled | boolean | いいえ | 認識結果に句読点を自動的に追加するかどうかを設定します:
注記 |
heartbeat | boolean | いいえ | ハートビートパケットを有効にするかどうか。 デフォルト値:false。
無音音声とは、音声ファイルまたはデータストリームに音響信号が含まれていないコンテンツを指します。Audacity や Adobe Audition などの音声編集ソフトウェア、または FFmpeg などのコマンドラインツールを使用して、いくつかの方法で無音音声を生成できます。 注記このフィールドを使用するには、SDK バージョンが 2.19.1 以降である必要があります。
|
language_hints | String[] | いいえ | 認識する音声の言語。デフォルト値はありません。設定しない場合、モデルは自動的に言語を検出します。 Qwen-Audio-3.0-ASR-Flash-Streaming モデルシリーズでは、最大 4 つの値を設定できます。4 つ以上設定した場合、最初の 4 つのみが有効になります。Fun-ASR-Realtime モデルシリーズでは、1 つの値しか設定できません。複数の値を設定した場合、最初の 1 つのみが有効になります。 クリックしてサポートされている言語コードを表示
注記 |
speech_noise_threshold | float | いいえ | 音声とノイズを区別するためのしきい値で、音声アクティビティ検出 (VAD) の感度を調整するために使用されます。 有効値:[-1.0, 1.0]。 値の説明:
これは詳細設定パラメーターです。調整すると認識結果に大きな影響を与える可能性があります。推奨事項:
注記 |
special_word_filter | String | いいえ | 音声認識中に処理する禁止用語を指定し、異なる禁止用語に対して異なる処理方法を設定することをサポートします。詳細については、「禁止用語フィルター」をご参照ください。 注記 |
input | Map<String, Object> | いいえ | 会話コンテキストを渡す入力オブジェクト。コンテキストは認識を助け、固有名詞の認識精度を向上させます。使用方法については、「クイックスタート」をご参照ください。 重要 Map には、
重要使用制限: 重要コンテキストを渡す場合、 注記このフィールドを使用するには、SDK バージョンが 2.22.23 以降である必要があります。
|
apiKey | String | いいえ | ご利用の API キー。 |
主要なインターフェイス
Recognition クラス
import com.alibaba.dashscope.audio.asr.recognition.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 はありません。
例
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("Task complete");
}
@Override
public void onError(Exception e) {
System.out.println("Task failed: " + e.getMessage());
}
};
| インターフェイス/メソッド | パラメーター | 戻り値 | 説明 |
|---|---|---|---|
| なし | サーバーが応答を送信したときに呼び出されます。 | |
| なし | なし | タスク完了後に呼び出されます。 |
|
| なし | 例外が発生したときに呼び出されます。 |
応答
リアルタイム認識結果 (RecognitionResult)
RecognitionResult は、単一のリアルタイム認識の結果を表します。
| インターフェイス/メソッド | パラメーター | 戻り値 | 説明 |
|---|---|---|---|
| なし | requestId | requestId を取得します。 |
| なし | 完全な文が形成されたかどうか、つまり文の境界が検出されたかどうか。 | 与えられた文が終了したかどうかを判断します。 |
| なし | タイムスタンプやテキストを含む文情報を取得します。 |
文情報 (Sentence)
| インターフェイス/メソッド | パラメーター | 戻り値 | 説明 |
|---|---|---|---|
| なし | 文の開始時刻 (ms)。 | 文の開始時刻を返します。 |
| なし | 文の終了時刻 (ms)。 | 文の終了時刻を返します。 |
| なし | 認識されたテキスト。 | 認識されたテキストを返します。 |
| なし | 単語レベルのタイムスタンプ情報 (Word) オブジェクトのリスト。 | 単語レベルのタイムスタンプ情報を返します。 |
単語レベルのタイムスタンプ情報 (Word)
| インターフェイス/メソッド | パラメーター | 戻り値 | 説明 |
|---|---|---|---|
| なし | 単語の開始時刻 (ms)。 | 単語の開始時刻を返します。 |
| なし | 単語の終了時刻 (ms)。 | 単語の終了時刻を返します。 |
| なし | 単語。 | 認識された単語を返します。 |
| なし | 句読点。 | 句読点を返します。 |
エラーコード
エラーが発生した場合は、「エラーコード」を参照してトラブルシューティングを行ってください。
問題が解決しない場合は、開発者コミュニティに参加して問題を報告し、詳細な調査のためにリクエスト ID を提供してください。
よくある質問
機能
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 encoder_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:ローカルファイル (録音) を認識するにはどうすればよいですか?
ローカルファイルを認識するには 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
-
language_hintsで設定された言語が、音声の実際の言語と一致していることを確認してください。たとえば、音声は実際には中国語ですが、
language_hintsはen(英語) に設定されています。 -
上記のチェックで問題が見つからない場合は、カスタムホットワードを設定して特定の用語の認識を向上させてください。