البدء — Android

توفّر speech-android معالجة كلام على الجهاز في Android باستخدام ONNX Runtime. يشغّل خطّ المعالجة VAD + STT + TTS مع دعم المقاطعة (barge-in)، ويعمل بالكامل بلا اتصال بالإنترنت بعد تنزيل النماذج.

المتطلّبات

نزِّل التطبيق التجريبي المُسبَق البناء لتجربته فورًا:

اعتمادية Gradle

أضِف الـ SDK إلى ملفّك build.gradle.kts:

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 بخدمة SpeechRecognitionService جاهزة تتكامل مع واجهة SpeechRecognizer في إطار عمل Android — دون حاجة لكتابة أيّ شيفرة. بمجرّد اختيار تطبيقك كمتعرِّف صوت افتراضي، يحصل أيّ تطبيق طرف ثالث يستدعي SpeechRecognizer.createSpeechRecognizer(context) (دون ComponentName) على تعرّف كامل على الكلام يعمل على الجهاز عبر خطّ معالجتك.

1. صرِّح عن RECORD_AUDIO والخدمة في 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. أضِف الملفّ 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) (دون مكوِّن) وتسجّل كلّ استدعاء يعود من الإطار — وهو مفيد لتأكيد رحلة الـ binder ذهابًا وإيابًا دون الحاجة إلى logcat.

تنفِّذ الخدمة onCheckRecognitionSupport (متاحة من API 33+) وتُعيد لغات BCP-47 الـ27 التي يدعمها Parakeet TDT v3، مع وسمها بـ installedOnDeviceLanguage عندما تكون النماذج موجودة (أو pendingOnDeviceLanguage أثناء تنزيلها). يُكتسب التركيز الصوتي بقيمة AUDIOFOCUS_GAIN_TRANSIENT طوال مدّة الجلسة.

تنبيه

تحوي Gboard وSamsung Keyboard وGoogle Assistant متعرِّفاتها الخاصّة وتتجاوز خدمة النظام الافتراضية. التطبيقات التي تستدعي صراحةً واجهة SpeechRecognizer الخاصّة بالإطار (أو تبني واجهة المستخدم الخاصّة بها فوقها) هي التي تمرّ عبر خدمتك.

النماذج

تعمل جميع النماذج عبر ONNX Runtime مع تسريع NNAPI. مُكمَّمة بدقّة 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

الخطوات التالية