البدء السريع على Android

الـ SDK بلغة Kotlin لنظام Android: سطر التثبيت، ومكان المفتاح، والبدء السريع.

الـ SDK بلغة Kotlin مكتبة AAR لنظام Android (minSdk 26، و arm64-v8a و armeabi-v7a). الحزمة هي ai.quranlab:tajweedformer على Maven Central، والشيفرة المصدرية متاحة على github.com/Quran-Lab/tajweedformer-android.

التثبيت

// settings.gradle.kts: mavenCentral() in the repositories
// app/build.gradle.kts
dependencies {
    implementation("ai.quranlab:tajweedformer:3.1.5")
}

المفتاح

استخدم مفتاح تطبيقات. معرّف التطبيق هو applicationId الخاص به في Gradle. أبقِ المفتاح خارج مستودعك:

# local.properties (git-ignored)
QURANLAB_KEY=qlk_v1_...

اقرأ المفتاح في Gradle وضعه في حقل BuildConfig أو في عنصر نائب في ملف البيان (manifest placeholder)، ثم مرّره إلى الـ SDK عند تشغيل التطبيق.

Client, model, listen, read

suspend fun quickStart(context: Context, heard: TextView) {
    // your key; one Client per process
    val client = TajweedClient(context, "qlk_v1_...")
    // the first run downloads and verifies the model
    val model = client.model()
    // asks for the microphone itself; ends 1.5 s after the learner stops
    val session = model.listen(TajweedSessionOptions(endOnSilenceMs = 1500))
    // every chunk: what the model heard so far
    session.chunks.collect { chunk -> heard.text = chunk.decoded.text }
}

هذه هي الاستدعاءات الأربعة في كل حزمة SDK من Quran Lab.

  • الميكروفون. يطلب model.listen() إذن android.permission.RECORD_AUDIO عند الحاجة. وإذا رُفض الإذن، فالخطأ هو microphone_denied. ويلتقط الصوت بمعدّل أخذ العيّنات الخاص بالجهاز، فلا يظهر أي معدّل لأخذ العيّنات في شيفرتك.
  • نهاية المحاولة. إذا ضُبط endOnSilenceMs، تنتهي المحاولة من تلقاء نفسها حين يعقب الكلامَ صمتٌ بالمدة المحدّدة فيه: يحمل آخر مقطع decoded.isFinal، ويُرجع session.finish() رؤوس الإخراج (heads) لهذه المحاولة. ومن دون هذا الخيار تستمر المحاولة حتى استدعاء finish() أو cancel().
  • الخلفية. تنتهي محاولة listen حين يخرج التطبيق من الواجهة. ابدأ محاولة جديدة حين يعود التطبيق إليها.
  • صوتك الخاص. يحلّ model.session() و session.push(samples) محلّ listen()، وكل ما عدا ذلك يبقى كما هو.

ما يصلك

كل 320 مللي ثانية يصل مقطع فيه chunk.decoded (المحاولة حتى الآن: text، tokens، words، settled، isFinal) و chunk.heads (المخرجات الخام التي اخترتها). وتشرح صفحة ابنِ ملاحظاتك بنفسك ما يعنيه كلٌّ منها.

تجد الأسماء الدقيقة لإصدار الـ SDK لديك في README الحزمة.