ML Kit の GenAI Speech Recognition API を使用すると、音声コンテンツをテキストに変換できます。この API は、次のモードをサポートしています。
- Advanced: Speech Recognition API は、より幅広い言語をカバーし、全体的な品質を向上させる GenAI モデルを使用します。言語ごとに個別の言語パックをダウンロードする必要がないため、ストレージを節約できます。
- 基本: Speech Recognition API は、SpeechRecognizer API と同様に、従来のオンデバイス音声認識モデルを使用します。
Speech Recognition API は、音声コンテンツを同じ言語のテキストに変換します。音声を別の言語のテキストに文字変換するには、Speech Translation API を使用します。
主な機能
- マイクまたは音声ファイルからのストリーミング入力をキャプチャします。
AudioSource.fromFile()メソッドまたはAudioSource.fromUri()メソッドを使用して、事前に録音されたファイル全体を音声文字変換します。詳細については、音声入力の要件をご覧ください。- ストリーミング入力の場合、認識された各単語の正確な開始時刻を提供します。これにより、UI アニメーションの同期、字幕の生成、発話された単語のハイライト表示が可能になります。認識された各単語の開始時間(ミリ秒単位)は、イベントの開始(タイムスタンプ 0)からのオフセットです。
- 音声文字変換されたテキストは、連続ストリームとして提供されます。最初は部分的なテキスト(変更される可能性があります)として提供され、最終的に認識されたテキストになります。
検索結果の例
| 音声 | モード | 言語/地域 | 音声文字変換 |
|---|---|---|---|
| audio_2 | 高度 | es-ES | 「Este es un mensaje corto.」 |
| audio_1 | 基本 | en-US | 「これは短いメッセージです」 |
プラットフォームの Speech Recognition API との比較
ML Kit Speech Recognition API は、基本モードを使用する場合のプラットフォーム SpeechRecognizer API の基本機能をカバーしています。ML Kit の主な利点は、特定のプラットフォーム バージョンに縛られないことです。
また、ML Kit Speech Recognition API は、詳細モードを使用する場合に、デバイス上の Gemini モデルを使用した音声認識をサポートし、より多くの言語に対応しています。
始める
build.gradle 構成に依存関係として ML Kit Speech Recognition API を追加します。
implementation("com.google.mlkit:genai-speech-recognition:1.0.0-alpha1")
Speech Recognition API をアプリに統合するには、SpeechRecognizer クライアントを作成します。必要なオンデバイス モデル機能のステータスを確認し、デバイスにまだ存在しない場合はモデルをダウンロードします。SpeechRecognizerRequest で音声入力を準備したら、クライアントを使用して推論を実行し、Kotlin フローからストリーミング出力を受信します。最後に、リソースを解放するために、クライアントを閉じる必要があります。
// 1. Create a SpeechRecognizer with desired options.
val options: SpeechRecognizerOptions =
speechRecognizerOptions {
locale = Locale.US
preferredMode = SpeechRecognizerOptions.Mode.MODE_ADVANCED
}
val speechRecognizer: SpeechRecognizer = SpeechRecognition.getClient(options)
// 2. Check if the recognition model is available or needs downloading.
launch {
val status: Int = speechRecognizer.checkStatus()
if (status == FeatureStatus.DOWNLOADABLE) {
// 3. If needed, download the model and monitor progress.
speechRecognizer.download.collect { downloadStatus ->
when (downloadStatus) {
is DownloadStatus.DownloadCompleted -> {
// Model is ready, start recognition.
startMyRecognition(speechRecognizer)
}
is DownloadStatus.DownloadFailed -> {
// Handle download failure (e.g., inform the user).
}
is DownloadStatus.DownloadProgress -> {
// Handle download progress (e.g., update a progress bar).
}
}
}
} else if (status == FeatureStatus.AVAILABLE) {
// Model is already ready, start recognition immediately.
startMyRecognition(speechRecognizer)
} else {
// Handle other statuses (e.g., DOWNLOADING, UNAVAILABLE).
}
}
// 4. Define your recognition logic using a suspend function.
suspend fun startMyRecognition(recognizer: SpeechRecognizer) {
// Create a request (e.g., specifying audio source).
val request: SpeechRecognizerRequest
= speechRecognizerRequest { audioSource = AudioSource.fromMic() }
// Start recognition and process the continuous stream of responses.
recognizer.startRecognition(request).collect {
// Process the SpeechRecognitionResponse data here.
}
}
// 5. Stop recognition and clean up resources when the session is complete.
launch {
recognizer.stopRecognition()
recognizer.close()
}
音声入力の要件
GenAI Speech Recognition API は、マイクまたはカスタムソースからの入力をファイル記述子を介してサポートします。
AudioSource.fromPfd(parcelFileDescriptor) を使用する場合、入力オーディオは次の厳しい要件を満たす必要があります。
- 形式: RAW、ヘッダーなし 16 ビット PCM。
- チャンネル: モノラル(シングル チャンネル)。
- サンプルレート: 16 kHz。
ほとんどのユースケースでは、これらの制約を自動的に処理する AudioSource.fromMic() をおすすめします。
サポートされている音声入力形式
Speech Recognition API は、次の音声入力形式をサポートしています。
- MP3、WAV、FLAC、M4A、OGG ファイルは、デバイス上で自動的にデコードされます。
- 未加工のヘッダーレス音声(
.rawまたは.pcm)は、16 ビット PCM、16 kHz、モノラル形式である必要があります。
形式が無効であるかサポートされていない場合、認識の開始時に ErrorResponse 値が返されます。
Speech Recognition API を実装する
Speech Recognition API を使用して音声を文字変換し、単語のタイミングを使用する方法は次のとおりです。
音声を文字に変換する
Speech Recognition API は、デバイスのマイク、録音済みのファイル、ParcelFileDescriptor オブジェクトを使用したカスタム パイプラインからの音声入力をサポートしています。
音声データを準備するには、次の表に示すファクトリ メソッドのいずれかを使用して AudioSource オブジェクトを作成します。
| メソッド | 音声モード | おすすめの使用例 |
|---|---|---|
AudioSource.fromMic() |
STREAMING |
ユーザーからのライブ音声入力をキャプチャします。RECORD_AUDIO 権限が必要です。
|
AudioSource.fromFile(file)AudioSource.fromUri(context, uri)
|
ONE_SHOT |
事前に録音された音声ファイルを文字起こしします。標準のファイル形式をデバイス上で直接自動的にデコードします。 |
AudioSource.fromPfd(pfd, mode)AudioSource.fromPfd(pfd, mode, audioFormat)
|
STREAMING または ONE_SHOT |
カスタム オーディオ パイプライン(アプリ内の別の場所でデータ処理されるオーディオ データなど)。 |
AudioSource.Mode 定数は、API が受信音声を処理する方法を制御します。
AudioSource.Mode.STREAMING定数は、音声データが到着すると、部分的な音声文字変換結果と最終的な音声文字変換結果を継続的に返すように認識ツールを構成します。カスタムParcelFileDescriptorオブジェクトを指定する場合は、リアルタイムのペース(標準の 16 kHz、16 ビット、モノラル PCM 音声の場合は約 32,000 バイト/秒)でストリームにデータを書き込む必要があります。データの書き込みが速すぎると、バッファがオーバーフローする可能性があります。AudioSource.Mode.ONE_SHOT定数は、推論を実行して最終的な音声文字変換を配信する前に、音声ソース全体が転送されるまで待機するように認識機能を構成します。音声データはできるだけ早く書き込むことができますが、ファイル記述子の書き込み側を閉じて、ファイルの終わりを通知する必要があります。このファイル終了シグナルを受信するまで、最終的な音声文字変換の結果は配信されません。
次の例では、事前に録音された音声ファイルを文字変換します。
suspend fun recognizeFromFile(recognizer: SpeechRecognizer, audioFile: File) {
val audioSource = AudioSource.fromFile(audioFile)
val request = speechRecognizerRequest { this.audioSource = audioSource }
try {
recognizer.startRecognition(request).collect { response ->
when (response) {
is SpeechRecognizerResponse.FinalTextResponse -> {
// Process the transcription of the whole file.
}
is SpeechRecognizerResponse.ErrorResponse -> {
// Handle the error, for example an unsupported audio format.
}
else -> {}
}
}
} finally {
audioSource.close()
}
}
単語のタイミングを使用する
認識された各単語の開始時間をリクエストするには、リクエストの recognitionOptions 構成ブロックで enableWordTiming パラメータを true に設定します。
単語のタイミングが有効になっている場合、各 SpeechRecognizerResponse.FinalTextResponse オブジェクトには、SpeechRecognizerResponse.WordTiming オブジェクトのリストを含む wordTimings プロパティが含まれます。各オブジェクトは、認識された単語文字列(text)と、音声認識セッションの開始からのミリ秒オフセット(timestampMs)を提供します。単語のタイミングが無効になっている場合(デフォルト設定)、wordTimings リストは空で返されます。
次のコード例は、単語のタイミングを構成して有効にする方法を示しています。
suspend fun recognizeWithWordTiming(recognizer: SpeechRecognizer) {
val request = speechRecognizerRequest {
audioSource = AudioSource.fromMic()
recognitionOptions { enableWordTiming = true }
}
recognizer.startRecognition(request).collect { response ->
if (response is SpeechRecognizerResponse.FinalTextResponse) {
for (wordTiming in response.wordTimings) {
val word: String = wordTiming.text
val timestamp: Long = wordTiming.timestampMs
}
}
}
}
サポートされている言語
| Mode | 言語 / 地域 |
| 高度 | ar-SA(ベータ版)、cmn-Hans-CN、cmn-Hant-TW、da-DK(ベータ版)、de-DE、en-US、es-ES、fr-FR、hi-IN(ベータ版)、id-ID(ベータ版)、it-IT、ja-JP、ko-KR、nl-NL(ベータ版)、pl-PL(ベータ版)、pt-PT、ru-RU、sv-SE(ベータ版)、th-TH、tr-TR(ベータ版)、vi-VN(ベータ版) |
| 基本 | cmn-Hans-CN(ベータ版)、cmn-Hant-TW(ベータ版)、de-DE(ベータ版)、en-US、es-ES(ベータ版)、fr-FR(ベータ版)、hi-IN(ベータ版)、it-IT(ベータ版)、ja-JP(ベータ版)、ko-KR(ベータ版)、pl-PL(ベータ版)、pt-BR(ベータ版)、ru-RU(ベータ版)、tr-TR(ベータ版)、vi-VN(ベータ版) |
サポートされているデバイス
| Mode | サポートされているデバイス |
| 基本 | API レベル 31 以降を使用する Android デバイス。 |
| 高度 |
Google Pixel 10 シリーズ、Google Pixel 11 シリーズ、および以下のチップセットを搭載した Gemini Nano 対応デバイス(Samsung Galaxy S26、Z Flip8、Z Fold8 シリーズなど):
|
セットアップに関する一般的な問題
ML Kit GenAI API は、Android AICore アプリを使用して Gemini Nano にアクセスします。デバイスをセットアップ(リセットを含む)した直後や、AICore アプリをリセット(データの消去、アンインストール後の再インストールなど)した直後は、AICore アプリの初期化(サーバーからの最新の設定のダウンロードを含む)が完了するまでに十分な時間が経過していない可能性があります。そのため、ML Kit GenAI API が想定どおりに機能しない可能性があります。一般的な設定エラー メッセージとその対処方法は次のとおりです。
| エラー メッセージの例 | 対応方法 |
| AICore がエラータイプ 4-CONNECTION_ERROR、エラーコード 601-BINDING_FAILURE で失敗しました。AICore サービスをバインドできませんでした。 | これは、デバイスのセットアップ直後に ML Kit GenAI API を使用してアプリをインストールした場合や、アプリのインストール後に AICore がアンインストールされた場合に発生する可能性があります。AICore アプリを更新してからアプリを再インストールすると、問題が解決します。 |
| AICore がエラータイプ 3-PREPARATION_ERROR、エラーコード 606-FEATURE_NOT_FOUND で失敗しました。機能 ... は利用できません。 |
これは、AICore が最新の構成のダウンロードを完了していない場合に発生することがあります。デバイスがインターネットに接続されている場合、通常は数分から数時間で更新されます。デバイスを再起動すると、更新が速くなることがあります。
デバイスのブートローダーがロック解除されている場合も、このエラーが表示されます。この API は、ブートローダーがロック解除されているデバイスをサポートしていません。 |
| AICore がエラータイプ 1-DOWNLOAD_ERROR、エラーコード 0-UNKNOWN で失敗しました。機能 ... が失敗ステータス 0、エラー esz: UNAVAILABLE: ホスト ... を解決できません、で失敗しました。 | ネットワーク接続を維持し、数分待ってから再試行してください。 |
サンプルコード
- GitHub で ML Kit Speech Recognition API のコードサンプルを確認する