التعرّف على النص وتحديده وترجمته باستخدام حزمة تعلّم الآلة والكاميراX: Android
لمحة عن هذا الدرس التطبيقي حول الترميز
1. مقدمة
حزمة ML Kit هي حزمة SDK للأجهزة الجوّالة توفِّر خبرة تعلّم الآلة لدى Google لتطبيقات Android وAndroid في حزمة قوية وسهلة الاستخدام. سواء كنت مبتدئًا أو متمرّسًا في مجال تعلُّم الآلة، يمكنك بسهولة تنفيذ الوظائف التي تحتاجها من خلال بضعة أسطر من الرموز البرمجية. ليست هناك حاجة إلى معرفة عميقة بالشبكات العصبونية أو تحسين النماذج للبدء.
كيف تعمل هذه الميزة؟
تُسهِّل عليك حزمة تعلّم الآلة تطبيق تقنيات تعلُّم الآلة في تطبيقاتك من خلال دمج تكنولوجيات تعلُّم الآلة من Google، مثل Mobile Vision وTensorFlow Lite، معًا في حزمة تطوير برامج واحدة. سواءً كنت بحاجة إلى الاستفادة من إمكانات الوقت الفعلي التي توفّرها طُرز Mobile Vision المتوفّرة على الجهاز، أو إلى المرونة في نماذج TensorFlow Lite المخصّصة، تتيح لك حزمة تعلّم الآلة استخدام بضعة أسطر من الرموز البرمجية.
سيرشدك هذا الدرس التطبيقي في خطوات بسيطة لإضافة ميزات "التعرّف على النص" و"تحديد اللغة والترجمة" من خلاصة الكاميرا في الوقت الفعلي إلى تطبيق Android الحالي. سيسلّط هذا الدرس التطبيقي أيضًا الضوء على أفضل الممارسات المتعلّقة باستخدام CameraX مع واجهات ML Kit.
ما ستقوم بإنشائه
في هذا الدرس التطبيقي حول الترميز، ستنشئ تطبيق Android باستخدام ML Kit. سيستخدم تطبيقك واجهة برمجة التطبيقات لميزة "التعرُّف على النص" في "مجموعة أدوات تعلّم الآلة" على الجهاز للتعرّف على النص من خلاصة الكاميرا في الوقت الفعلي. ستستخدم واجهة برمجة تطبيقات تعلّم لغة تعلّم الآلة لتحديد لغة النص الذي تم التعرّف عليه. أخيرًا، سيترجم تطبيقك هذا النص إلى أي لغة يتم اختيارها من بين 59 خيارًا باستخدام واجهة برمجة التطبيقات ML Kit Translation API.
في النهاية، من المفترض أن ترى شيئًا مشابهًا للصورة أدناه.
المعلومات التي ستطّلع عليها
- طريقة استخدام حزمة تطوير البرامج (SDK) لحزمة تعلّم الآلة لإضافة إمكانات تعلُّم الآلة بسهولة إلى أيّ تطبيق Android
- تقنية تعلُّم الآلة والتعرُّف على النص والتعرُّف على اللغة وواجهات برمجة تطبيقات الترجمة وإمكاناتها
- كيفية استخدام مكتبة CameraX مع واجهات برمجة تطبيقات ML Kit.
المتطلبات
- إصدار حديث من "استوديو Android" (الإصدار 4.0 أو الإصدارات الأحدث)
- جهاز Android فعلي
- نموذج الرمز
- معرفة أساسية بتطوير تطبيقات Android باستخدام لغة Kotlin
يركّز هذا الدرس التطبيقي حول الترميز على أدوات تعلُّم الآلة. وقد تم توفير مفاهيم غير ملائمة ومجموعات رموز وتنفيذها لك.
2. بدء الإعداد
تنزيل الرمز
انقر على الرابط التالي لتنزيل جميع الرموز الخاصة بهذا الدرس التطبيقي حول الترميز:
فك ضغط ملف ZIP الذي تم تنزيله. سيؤدي هذا الإجراء إلى فك ضغط المجلد الجذر (mlkit-android
) الذي يتضمّن كل الموارد اللازمة. بالنسبة إلى هذا الدرس التطبيقي، ستحتاج فقط إلى الموارد المتوفّرة في الدليل الفرعي translate
.
يحتوي الدليل الفرعي translate
في مستودع mlkit-android
على الدليل التالي:
إجراء التفعيل: بدء الرمز البرمجي الذي اعتمدته في هذا الدرس التطبيقي حول الترميز
3. استيراد المشروع والتحقّق من اعتماديات ML Kit و CameraX
استيراد مشروع إجراء التفعيل إلى "استوديو Android" في ملف app/build.gradle
، تأكَّد من تضمين ملحقات ML Kit والكاميراX:
// CameraX dependencies
def camerax_version = "1.0.0-beta05"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-view:1.0.0-alpha12"
// ML Kit dependencies
implementation 'com.google.android.gms:play-services-mlkit-text-recognition:16.0.0'
implementation 'com.google.mlkit:language-id:16.0.0'
implementation 'com.google.mlkit:translate:16.0.0'
4. تشغيل تطبيق إجراء التفعيل
الآن بعد أن استوردت المشروع إلى "استوديو Android" وتحقَّقت من اعتماديات ML Kit، يمكنك تشغيل التطبيق للمرة الأولى. انقر على تشغيل ( ) في شريط أدوات "استوديو Android".
من المفترض أن يتم تشغيل التطبيق على جهازك ويمكنك توجيه الكاميرا إلى نصوص مختلفة للاطّلاع على خلاصة مباشرة، ولكن لم يتم تنفيذ وظيفة التعرّف على النص بعد.
5. إضافة ميزة التعرّف على النص
في هذه الخطوة، سنضيف وظيفة إلى تطبيقك للتعرّف على النص من كاميرا الفيديو.
إنشاء نسخة فورية من أداة كشف النص في مجموعة أدوات تعلُّم الآلة
استبدِل TODO
أعلى TextAnalyzer.kt
لإنشاء مثيل TextRecognition
. هذه هي الطريقة التي تحصل من خلالها على اسم أداة التعرف على النص لاستخدامه في الخطوات اللاحقة. ونحتاج أيضًا إلى إضافة أداة الكشف كمراقب لمراحل النشاط من أجل إغلاق جهاز الكشف بشكل صحيح عندما لا تكون هناك حاجة إليه.
TextAnalyzer.kt
private val detector = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
init {
lifecycle.addObserver(detector)
}
تشغيل التعرّف على النص في صورة إدخال (تم إنشاؤها باستخدام المخزن المؤقت من الكاميرا)
توفر مكتبة CameraX تدفقًا للصور من الكاميرا الجاهزة لتحليل الصور. استبدِل طريقة recognizeText()
في فئة TextAnalyzer لاستخدام ميزة التعرّف على النص في "مجموعة أدوات تعلُّم الآلة" في كل إطار صورة.
TextAnalyzer.kt
private fun recognizeText(
image: InputImage
): Task<Text> {
// Pass image to an ML Kit Vision API
return detector.process(image)
.addOnSuccessListener { text ->
// Task completed successfully
result.value = text.text
}
.addOnFailureListener { exception ->
// Task failed with an exception
Log.e(TAG, "Text recognition error", exception)
val message = getErrorMessage(exception)
message?.let {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
}
}
يوضح السطر التالي كيفية استدعاء الطريقة أعلاه لبدء إجراء التعرف على النص. أضِف السطر التالي في نهاية طريقة analyze()
. ملاحظة: يجب طلب الرقم imageProxy.close
بعد اكتمال تحليل الصورة، وإلّا فلن تتمكن خلاصة الكاميرا المباشرة من معالجة المزيد من الصور لتحليلها.
TextAnalyzer.kt
recognizeText(InputImage.fromBitmap(croppedBitmap, 0)).addOnCompleteListener {
imageProxy.close()
}
تشغيل التطبيق على جهازك
انقر الآن على تشغيل ( ) في شريط أدوات "استوديو Android". بعد تحميل التطبيق، من المفترض أن يبدأ في التعرّف على النص من الكاميرا في الوقت الفعلي. وجِّه الكاميرا إلى أي نص لتأكيده. إذا كان تطبيقك لا يتعرّف على أي نص، جرِّب "إعادة الضبط" الاكتشاف من خلال توجيه الكاميرا إلى مساحة فارغة قبل توجيه الكاميرا إلى النص.
6. إضافة ميزة التعرّف على اللغة
إنشاء مثيل للّغة في حزمة تعلّم الآلة
يقع "MainViewModel.kt
" في المجلد الرئيسي. انتقِل إلى الملف وأضِف الحقل التالي إلى MainViewModel.kt
. بهذه الطريقة، يمكنك الحصول على اسم معرِّف لمعرّف اللغة بهدف استخدامه في الخطوة التالية.
MainViewModel.kt
private val languageIdentifier = LanguageIdentification.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
بالإضافة إلى ذلك، تريد أيضًا التأكد من إيقاف تشغيل العملاء بشكل صحيح عندما لا تعد هناك حاجة إليها. ولإجراء ذلك، عليك إلغاء طريقة onCleared()
من ViewModel
.
MainViewModel.kt
override fun onCleared() {
languageIdentifier.close()
translators.evictAll()
}
تشغيل ميزة التعرُّف على اللغة على الجهاز فقط في النص الذي تم رصده
استخدِم معرّف اللغة لمجموعة أدوات تعلُّم الآلة للحصول على لغة النص الذي تم رصده من الصورة.
استبدل TODO
في تعريف الحقل sourceLang
في MainViewModel.kt
بالرمز التالي. يستدعي هذا المقتطف طريقة تعريف اللغة ويعيّن النتيجة إذا لم تكن غير محددة ("und"). تعني اللغة غير المعروفة أنّ واجهة برمجة التطبيقات لم تتمكّن من التعرّف على اللغة استنادًا إلى قائمة اللغات المتاحة.
MainViewModel.kt
val sourceLang = Transformations.switchMap(sourceText) { text ->
val result = MutableLiveData<Language>()
languageIdentifier.identifyLanguage(text)
.addOnSuccessListener { languageCode ->
if (languageCode != "und")
result.value = Language(languageCode)
}
result
}
تشغيل التطبيق على جهازك
انقر الآن على تشغيل ( ) في شريط أدوات "استوديو Android". بعد تحميل التطبيق، من المفترض أن يبدأ التطبيق في التعرّف على النص من الكاميرا والتعرّف على لغة النص في الوقت الفعلي. وجِّه الكاميرا إلى أي نص لتأكيده.
7. إضافة ترجمة
استبدل الدالة translate()
في MainViewModel.kt
بالرمز التالي. تأخذ هذه الدالة قيمة اللغة المصدر وقيمة اللغة الهدف والنص المصدر وتُجري الترجمة. يُرجى العلم أنّه إذا لم يتم بعد تنزيل نموذج اللغة الهدف الذي تم اختياره على الجهاز، نطلب من downloadModelIfNeeded()
إجراء ذلك، ثم نواصل عملية الترجمة.
MainViewModel.kt
private fun translate(): Task<String> {
val text = sourceText.value
val source = sourceLang.value
val target = targetLang.value
if (modelDownloading.value != false || translating.value != false) {
return Tasks.forCanceled()
}
if (source == null || target == null || text == null || text.isEmpty()) {
return Tasks.forResult("")
}
val sourceLangCode = TranslateLanguage.fromLanguageTag(source.code)
val targetLangCode = TranslateLanguage.fromLanguageTag(target.code)
if (sourceLangCode == null || targetLangCode == null) {
return Tasks.forCanceled()
}
val options = TranslatorOptions.Builder()
.setSourceLanguage(sourceLangCode)
.setTargetLanguage(targetLangCode)
.build()
val translator = translators[options]
modelDownloading.setValue(true)
// Register watchdog to unblock long running downloads
Handler().postDelayed({ modelDownloading.setValue(false) }, 15000)
modelDownloadTask = translator.downloadModelIfNeeded().addOnCompleteListener {
modelDownloading.setValue(false)
}
translating.value = true
return modelDownloadTask.onSuccessTask {
translator.translate(text)
}.addOnCompleteListener {
translating.value = false
}
}
تشغيل التطبيق على المحاكي
انقر الآن على تشغيل ( ) في شريط أدوات "استوديو Android". بعد تحميل التطبيق، من المفترض أن يظهر الآن كالصورة المتحركة أدناه، حيث تعرض التعرّف على النص ونتائج اللغة التي تم التعرّف عليها والنص المترجم في اللغة المختارة. يمكنك الاختيار من بين 59 لغة.
8. تهانينا
تهانينا، لقد أضفت للتو ميزات التعرّف على النص والتعرُّف على اللغة وترجمتها على الجهاز فقط إلى تطبيقك باستخدام حزمة تعلُّم الآلة. يمكنك الآن التعرّف على النص ولغته من خلاصة الكاميرا المباشرة وترجمة هذا النص إلى لغة تختارها، كل ذلك في الوقت الفعلي.
النقاط التي تناولناها
- كيفية إضافة حزمة تعلُّم الآلة إلى تطبيق Android
- طريقة استخدام ميزة التعرّف على النص على الجهاز فقط في أدوات تعلُّم الآلة للتعرّف على النص في الصور
- طريقة استخدام ميزة تحديد اللغة على الجهاز فقط في أدوات تعلُّم الآلة لتحديد لغة النص
- كيفية استخدام الترجمة على الجهاز فقط في أدوات تعلّم الآلة لترجمة النص ديناميكيًا إلى 59 لغة
- كيفية استخدام CameraX مع واجهات برمجة تطبيقات ML Kit
الخطوات التالية
- استخدام ML Kit والكاميراX في تطبيقك على Android