はじめに — Android
speech-androidはONNX Runtimeを使用してAndroid上でオンデバイス音声処理を提供します。パイプラインはVAD + STT + TTSをバージインサポートで実行し、モデルダウンロード後は完全にオフラインで動作します。
動作要件
- Android 8+ (API 26)
- arm64-v8a アーキテクチャ
すぐに試すためにプリビルドデモアプリをダウンロード:
Gradle依存関係
build.gradle.ktsにSDKを追加します:
implementation("audio.soniqo:speech:0.0.9")
クイックスタート
val modelDir = ModelManager.ensureModels(context)
val pipeline = SpeechPipeline(SpeechConfig(modelDir = modelDir))
pipeline.events.collect { event ->
when (event) {
is SpeechEvent.TranscriptionCompleted -> println(event.text)
is SpeechEvent.ResponseDone -> pipeline.resumeListening()
else -> {}
}
}
pipeline.start()
pipeline.pushAudio(samples) // 16kHz mono float32
モデルは初回使用時にHuggingFaceから自動ダウンロードされます(合計約1.2 GB)。初回ダウンロード後、すべての推論は完全にオフラインで実行されます。
システム音声入力 (RecognitionService)
SDK には、Android フレームワークの SpeechRecognizer API に組み込めるすぐに使える SpeechRecognitionService が含まれています — コードを書く必要はありません。アプリがデフォルトの音声認識サービスに選択されると、SpeechRecognizer.createSpeechRecognizer(context)(ComponentName なし)を呼び出す任意のサードパーティアプリが、あなたのパイプラインを通じて完全なオンデバイス STT を利用できます。
1. AndroidManifest.xml で RECORD_AUDIO とサービスを宣言します:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<application>
<service
android:name="audio.soniqo.speech.service.SpeechRecognitionService"
android:exported="true"
android:permission="android.permission.RECORD_AUDIO">
<intent-filter>
<action android:name="android.speech.RecognitionService" />
</intent-filter>
<meta-data
android:name="android.speech"
android:resource="@xml/recognition_service" />
</service>
</application>
2. app/src/main/res/xml/recognition_service.xml を追加します:
<?xml version="1.0" encoding="utf-8"?>
<recognition-service xmlns:android="http://schemas.android.com/apk/res/android" />
3. サービスをシステムデフォルトに設定します(標準 Android では 設定 → システム → 言語と入力 → 音声入力ピッカー、または adb 経由):
adb shell settings put secure voice_recognition_service \
your.package/audio.soniqo.speech.service.SpeechRecognitionService
4. デモアプリの Recognizer test 画面を実行して確認します。これは SpeechRecognizer.createSpeechRecognizer(ctx)(コンポーネントなし)を呼び出し、すべてのフレームワークコールバックをログに記録します — logcat なしで binder のラウンドトリップを確認するのに便利です。
サービスは onCheckRecognitionSupport(API 33+)を実装し、Parakeet TDT v3 がカバーする 27 の BCP-47 言語を返します。モデルが存在する場合は installedOnDeviceLanguage、ダウンロード中は pendingOnDeviceLanguage でマークされます。セッション中は AUDIOFOCUS_GAIN_TRANSIENT でオーディオフォーカスを取得します。
Gboard、Samsung Keyboard、Google Assistant は独自の認識エンジンを同梱しており、システムデフォルトをスキップします。あなたのサービスを通過するのは、フレームワーク SpeechRecognizer API を明示的に呼び出すアプリ(またはその上に独自 UI を構築するアプリ)です。
モデル
すべてのモデルはNNAPIアクセラレーションを備えたONNX Runtime経由で実行されます。デフォルトでINT8量子化されます。
| モデル | タスク | サイズ |
|---|---|---|
| Parakeet TDT v3 (INT8) | 音声認識 (114言語) | 490 MB |
| Kokoro-82M (INT8) | 音声合成 (7言語) | 89 MB |
| Silero VAD v5 | 音声区間検出 | 1.2 MB |
| DeepFilterNet3 (FP16) | ノイズキャンセリング | 4.2 MB |
ソースコード: github.com/soniqo/speech-android
次のステップ
- Benchmarks — Android 推論パフォーマンス
- Linux C API — embedded Linux セットアップ