Bắt đầu — Android

speech-android cung cấp xử lý giọng nói trên thiết bị cho Android dựa trên ONNX Runtime. Pipeline chạy VAD + STT + TTS có hỗ trợ ngắt lời (barge-in), hoàn toàn ngoại tuyến sau khi tải mô hình.

Yêu cầu

Tải ứng dụng demo đã dựng sẵn để thử ngay:

Phụ thuộc Gradle

Thêm SDK vào build.gradle.kts của bạn:

implementation("audio.soniqo:speech:0.0.20")

Khởi động nhanh

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
Quan trọng

Các mô hình mặc định tự tải từ HuggingFace ở lần dùng đầu tiên (tổng cộng khoảng 500 MB). Sau lần tải đầu, mọi suy luận đều chạy hoàn toàn ngoại tuyến.

Phát hiện kết thúc lượt nói

Bật Smart Turn v3.2 để coi khoảng dừng VAD là một quyết định thay vì kết thúc ngay lập tức. Sau mỗi khoảng dừng được xác nhận, mô hình đánh giá một lần tám giây cuối của lượt hiện tại; điểm thấp hơn ngưỡng giữ nguyên lượt nói, còn giới hạn im lặng tối đa bảo đảm lượt cuối cùng sẽ kết thúc.

val modelDir = ModelManager.ensureModels(context, enableSmartTurn = true)
val pipeline = SpeechPipeline(
    SpeechConfig(
        modelDir = modelDir,
        enableSmartTurn = true,
        turnCompletionThreshold = 0.5f,
        turnCompletionMaxSilenceSec = 2.0f,
    )
)

Tính năng tùy chọn này thêm một mô hình int8 11,1 MB được ghim phiên bản; suy luận vẫn hoàn toàn ngoại tuyến. Smart Turn do Pipecat/Daily tạo và được phân phối theo BSD-2-Clause.

Nhập giọng nói của hệ thống (RecognitionService)

SDK đi kèm SpeechRecognitionService dựng sẵn, cắm thẳng vào API SpeechRecognizer trong framework của Android — không phải viết thêm dòng mã nào. Khi ứng dụng của bạn được chọn làm trình nhận dạng giọng nói mặc định, mọi ứng dụng bên thứ ba gọi SpeechRecognizer.createSpeechRecognizer(context) (không truyền ComponentName) đều dùng STT hoàn toàn trên thiết bị thông qua pipeline của bạn.

1. Khai báo RECORD_AUDIO và service trong AndroidManifest.xml:

<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. Thêm 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. Đặt service làm mặc định của hệ thống (Cài đặt → Hệ thống → Ngôn ngữ và nhập → Trình chọn nhập giọng nói trên Android gốc, hoặc qua adb):

adb shell settings put secure voice_recognition_service \
  your.package/audio.soniqo.speech.service.SpeechRecognitionService

4. Kiểm tra bằng cách mở màn hình Recognizer test trong ứng dụng demo, nó gọi SpeechRecognizer.createSpeechRecognizer(ctx) (không kèm component) và ghi lại mọi callback của framework — tiện để xác nhận round-trip qua binder mà không cần logcat.

Service triển khai onCheckRecognitionSupport (API 33+), trả về 27 ngôn ngữ BCP-47 mà Parakeet TDT v3 hỗ trợ, được đánh dấu installedOnDeviceLanguage khi mô hình đã có sẵn (hoặc pendingOnDeviceLanguage khi đang tải). Audio focus được lấy với AUDIOFOCUS_GAIN_TRANSIENT trong suốt phiên làm việc.

Lưu ý

Gboard, Samsung Keyboard và Google Assistant đi kèm trình nhận dạng riêng và bỏ qua mặc định của hệ thống. Các ứng dụng gọi rõ ràng API SpeechRecognizer của framework (hoặc dựng UI riêng trên đó) mới đi qua service của bạn.

Mô hình

Tất cả mô hình chạy trên ONNX Runtime với gia tốc NNAPI. Mặc định lượng tử hóa INT8.

Mô hìnhTác vụKích thước
Parakeet TDT v3 (INT8)Giọng nói thành văn bản (114 ngôn ngữ)891 MB
Kokoro-82M (INT8)Văn bản thành giọng nói (8 ngôn ngữ)330 MB
Silero VAD v5Phát hiện hoạt động giọng nói2 MB
DeepFilterNet3Khử nhiễu8 MB

Mã nguồn: github.com/soniqo/speech-android

Bước tiếp theo