إنشاء تطبيق ذكي مع جوجل سحابة الكلام واللغة الطبيعية واجهات برمجة التطبيقات
Arabic (العربية/عربي) translation by Kaso Toluppa (you can also view the original English article)
تطبيق الذي يفهم لغة طبيعية حقاً هو شيء هواة الخيال العلمي والمبرمجين والباحثين منظمة العفو الدولية قد يحلم منذ عقود. اليوم، بفضل التقدم الكبير في تكنولوجيات التعلم آلة، هذا الحلم أقرب من أي وقت مضى إلى أن تصبح حقيقة واقعة. ما هو أكثر من ذلك، جعلت الخدمات المستندة إلى مجموعة النظراء، مثل "جوجل سحابة آلة التعلم" تلك التكنولوجيات متاحة بحرية للجميع لاستخدامه.
ستتعرف في هذا البرنامج التعليمي على كيفية استخدام اثنين من واجهات برمجة التطبيقات (APIs) اللتان تعتمدان على اللغة الطبيعية والتي توفرها و Cloud Natural Language API . من خلال استخدامها معًا ، منصة Google Cloud Machine Learning: Cloud Speech APIيمكنك إنشاء تطبيقات يمكنها التعامل مع الكلام في مجموعة متنوعة من اللغات المحكية على نطاق واسع.
المتطلبات الأساسية
للمتابعة ، ستحتاج إلى:
- استوديو الروبوت 2.2 أو أعلى
- حساب Google Cloud Platform
- جهاز يعمل بنظام التشغيل Android 4.4 أو إصدار أحدث
1-لماذا استخدام واجهات برمجة التطبيقات هذه؟
يجب أن يحتوي التطبيق الذي يمكنه معالجة الكلام على الإمكانيات التالية:
- يجب أن يكون قادراً على استخراج الكلمات الفردية من البيانات الأولية للصوت.
- يجب أن تكون قادرة على جعل المتعلمين التخمينات حول العلاقات النحوية بين الكلمات فقد انتزعت.
تمكّنك واجهات برمجة تطبيقات Cloud Speech و Cloud Natural Language من إضافة الإمكانيات المذكورة أعلاه إلى تطبيق Android في غضون دقائق.
تُستخدم واجهة برمجة تطبيقات Cloud Speech كأداة التعرف على الكلام الأكثر حداثة والتي يمكن أن تنقل بدقة الكلام بأكثر من 80 لغة. ويمكنه أيضًا التعامل بقوة مع اللهجات الإقليمية والظروف الصاخبة.
على مذكرة مماثلة، هو API اللغة الطبيعية سحابة معالجة النظام التي يمكن، بالقرب من الإنسان مستوى الدقة، تحديد اللعب الكلمات الأدوار في الجمل نظراً لأنها لغة. وهو يدعم حاليا عشر لغات، وكما يوفر تحليل الكيان والمشاعر.
2. تمكين واجهات برمجة التطبيقات
.قبل استخدام واجهات برمجة تطبيقات الكلام واللغة الطبيعية ، يجب عليك تمكينها في وحدة تحكم Google Cloud. لذا قم بتسجيل الدخول إلى وحدة التحكم وانتقل إلى API Manager> Library .



تمكين واجهة برمجة تطبيقات Speech ، انقر على رابط Speech API في قسم Google Cloud Machine Learning . في الصفحة التي تفتح بعد ذلك ، اضغط على الزر Enable (تمكين) .



اضغط على زر الخلف في المستعرض للعودة إلى الصفحة السابقة.
في هذه المرة ، قم بتمكين واجهة برمجة تطبيقات اللغة الطبيعية من خلال النقر على رابط واجهة برمجة التطبيقات للغة الطبيعية والضغط على الزتمكين في الصفحة التالية.



ستحتاج إلى مفتاح واجهة برمجة التطبيقات أثناء التفاعل مع واجهات برمجة التطبيقات. إذا لم يكن لديك واحد بالفعل ، فافتح علامة التبويب بيانات الاعتماد ، واضغط على الزر إنشاء بيانات اعتماد ، واختر مفتاح واجهة برمجة التطبيقات .
الآن سترى إطار منبثق عرض مفتاح API الخاص بك. علما بأنه انخفاض حتى يمكن استخدامه في وقت لاحق.



3-تكوين المشروع الخاص بك
كلا واجهات برمجة التطبيقات تستند إلى JSON وبقية نقاط النهاية يمكنك التفاعل مع مباشرة باستخدام أي مكتبة شبكة الاتصال. كل من واجهات برمجة التطبيقات تعتمد على JSON ولها نقاط نهاية REST يمكنك التفاعل معها مباشرةً باستخدام أي مكتبة شبكة. ومع ذلك ، يمكنك توفير الكثير من الوقت - وكتابة المزيد من الرموز القابلة للقراءة - باستخدام مكتبات عميل واجهة برمجة تطبيقات Google المتاحة لها. لذا افتح ملفbuild.gradle لوحدة برامج app
المشروع وأضف تبعيات compile
التالية إليه:
compile 'com.google.api-client:google-api-client-android:1.22.0' compile 'com.google.apis:google-api-services-speech:v1beta1-rev336-1.22.0' compile 'com.google.apis:google-api-services-language:v1beta2-rev6-1.22.0' compile 'com.google.code.findbugs:jsr305:2.0.1'
بالإضافة إلى ذلك ، سنقوم بتنفيذ بعض عمليات إدخال / إخراج الملف في هذا البرنامج التعليمي. لتبسيطها ، إضافة تبعية compile
لمكتبة عام IO .
compile 'commons-io:commons-io:2.5'
وأخيرًا ، لا تنس طلب إذن INTERNET
في ملف AndroidManifest.xml . وبدون ذلك ، لن يكون تطبيقك قادرًا على الاتصال بخوادم Google.
<uses-permission android:name="android.permission.INTERNET"/>
4-استخدام الكلام سحابة API
غنى عن القول أن API الكلام سحابة تتوقع البيانات الصوتية كواحدة من مدخلاته. ولذلك، ونحن سوف الآن تكون إنشاء تطبيق الروبوت التي يمكن نسخ ملفات الصوت.
للحفاظ على بساطة ، سنقوم فقط بنسخ ملفات FLAC ، الملفات التي تستخدم تنسيق ترميز Free Lossless Audio Codec. قد يكون لديك بالفعل هذه الملفات على جهازك. إذا لم تقم بذلك ، نقترح عليك تنزيل عدد قليل من ويكيميديا كومنز .
الخطوة 1: إنشاء تخطيط
سيكون تخطيط Button مزودًا بموزع Button
يمكن الضغط عليه لعرض منتقي الملفات ، وهي واجهة يمكن من خلالها تصفح وتحديد الملفات
سيحتوي التخطيط أيضًا على عنصر واجهة مستخدم TextView
لعرض نص ملف الصوت المحدد. وفقًا لذلك ، أضف الشفرة التالية إلى ملف XML لتنسيق نشاطك:
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="" android:id="@+id/speech_to_text_result" android:textSize="18sp" android:layout_alignParentTop="true"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:id="@+id/browse_button" android:text="Browse"/>
الخطوة 2: إنشاء من منتقي ملف
يجب أن يتم عرض واجهة منتقي الملفات عندما يقوم المستخدم بالضغط على الزر الذي OnClickListener في الخطوة السابقة ، لذا قمOnClickListener كائن OnClickListener
به. قبل القيام بذلك ، تأكد من تهيئة الزر باستخدام الأسلوب findViewById()
.
Button browseButton = (Button)findViewById(R.id.browse_button); browseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // More code here } });
باستخدام Android Access Storage Framework ، والذي يتوفر على الأجهزة التي تعمل على مستوى API 19 أو أعلى ، فإن إنشاء منتقي الملفات لا يتطلب سوى القليل من الجهد. كل ما عليك فعله هو إنشاء هدف ACTION_GET_CONTENT
الإجراء وتمريره إلى الأسلوبstartActivityForResult()
. بشكل اختياري ، يمكنك تقييد منتقي الملفات لعرض ملفات FLAC فقط عن طريق تمرير نوع MIME المناسب إلى أسلوب setType()
لكائن Intent
.
Intent filePicker = new Intent(Intent.ACTION_GET_CONTENT); filePicker.setType("audio/flac"); startActivityForResult(filePicker, 1);
سيكون ناتج منتقي الملفات عبارة عن كائن Intent
آخر يحتوي على URI للملف الذي حدده المستخدم. لتتمكن من الوصول إليه ، يجب تجاوز طريقةonActivityResult()
الخاصة بفئة Activity
الخاصة بك.
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode == RESULT_OK) { final Uri soundUri = data.getData(); // More code here } }
الخطوة 3: ترميز الملف
يتوقع Cloud Speech API أن تكون بيانات الصوت الخاصة به في شكل سلسلة Base64. لإنشاء مثل هذه السلسلة ، يمكنك قراءة محتويات الملف الذي encodeBase64String() المستخدم في صفيف byte
وتمريره إلى طريقة الأداة المساعدة encodeBase64String()
التي توفرها مكتبة Google API Client.
ومع ذلك، لديك حاليا فقط uri الخاص بالملف المحدد، لا على المسار المطلق. وهذا يعني أنه، ليتمكن من قراءة الملف، يجب عليك حل URI أولاً. يمكنك القيام بذلك عن طريق تمريره إلى أسلوب openInputStream ()
لمحلل المحتوى الخاص بنشاطك. بمجرد الوصول إلى دفق الإدخال الخاص بالملف ، يمكنك ببساطة تمريره إلى الأسلوب toByteArray ()
الخاص بفئة IOUtils
لتحويله إلى صفيف من البايتات. يوضح لك الكود التالي:
AsyncTask.execute(new Runnable() { @Override public void run() { InputStream stream = getContentResolver() .openInputStream(soundUri); byte[] audioData = IOUtils.toByteArray(stream); stream.close(); String base64EncodedData = Base64.encodeBase64String(audioData); // More code here } }
كما يمكنك أن ترى في التعليمات البرمجية أعلاه، نحن نستخدم مؤشر ترابط جديد لتشغيل كافة عمليات الإدخال/الإخراج. من المهم القيام بذلك بغية التأكد من أن واجهة المستخدم للتطبيق لا تجمد.
الخطوة 4: تشغيل الملف
في رأيي ، فإن تشغيل الملف الصوتي الذي يتم نسخه ، بينما يتم نسخه ، فكرة جيدة. لا يتطلب الأمر الكثير من الجهد ، ويحسن تجربة المستخدم
يمكنك استخدام فئة MediaPlayer
لتشغيل ملف الصوت. بمجرد الإشارة إلى URI الملف باستخدام أسلوب setDataSource ()
الخاص به ، يجب استدعاء الأسلوب prepare ()
الخاص به لإعداد المشغل بشكل متزامن. عندما يكون اللاعب جاهزًا ، يمكنك استدعاء طريقة start ()
لبدء تشغيل الملف.
بالإضافة إلى ذلك ، يجب عليك تذكر تحرير موارد اللاعب بمجرد اكتمال تشغيل الملف. للقيام بذلك ، قم بتعيين كائن OnCompletionListener
إليه واستدعاء أسلوب release ()
الخاص به. يوضح لك الكود التالي:
MediaPlayer player = new MediaPlayer(); player.setDataSource(MainActivity.this, soundUri); player.prepare(); player.start(); // Release the player player.setOnCompletionListener( new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { mediaPlayer.release(); } });
الخطوة 5: شكل متزامن نسخ الملف
في هذه المرحلة ، يمكننا إرسال البيانات الصوتية المشفرة باستخدام Base64 إلى واجهة برمجة تطبيقات Cloud Speech لنسخها. ولكن أولاً ، أقترح تخزين مفتاح واجهة برمجة التطبيقات الذي أنشأته سابقًا كمتغير عضو لفئةاActivity
.
private final String CLOUD_API_KEY = "ABCDEF1234567890";
لتتمكن من الاتصال بـ Cloud Speech API ، يجب إنشاء كائن Speech
باستخدام مثيل Speech.Builder
. كحجج ، يتوقع مُنشئه نقل HTTP ومصنع JSON بالإضافة إلى ذلك ، للتأكد من أن المفتاح API مضمن في كل طلب HTTP إلى API ، يجب إقران كائن SpeechRequestInitializer
مع منشئ وتمرير المفتاح إليه.
تعمل التعليمة البرمجية التالية على إنشاء كائن Speech
باستخدام فئة AndroidJsonFactory
كمصنّع JSON وفئة NetHttpTransport
كنقل HTTP:
Speech speechService = new Speech.Builder( AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null ).setSpeechRequestInitializer( new SpeechRequestInitializer(CLOUD_API_KEY)) .build();
يجب إخبار واجهة برمجة تطبيقات Cloud Speech بلغة الملف الصوتي. يمكنك القيام بذلك عن طريق إنشاء كائن RecognitionConfig
واستدعاء أسلوب setLanguageCode ()
الخاص به. في ما يلي كيفية تهيئتها لنسخ اللغة الإنجليزية الأمريكية فقط:
RecognitionConfig recognitionConfig = new RecognitionConfig(); recognitionConfig.setLanguageCode("en-US");
بالإضافة إلى ذلك ، يجب أن يتم التفاف السلسلة المشفرة Base64 في كائن RecognitionAudio
قبل أن يمكن استخدامه من قبل API.
RecognitionAudio recognitionAudio = new RecognitionAudio(); recognitionAudio.setContent(base64EncodedData);
بعد ذلك ، باستخدام كائنات RecognitionConfig
و RecognitionAudio
، يجب عليك إنشاء كائن SyncRecognizeRequest
. كما يوحي اسمها ، تسمح لك بإنشاء طلب HTTP لنقل بيانات الصوت بشكل متزامن. متى تم إنشاء الكائن، يمكنك تمرير كوسيطة إلى أسلوب syncrecognize()
واستدعاء الأسلوب execute()
للكائن Speech.SpeechOperations.Syncrecognize
الناجمة عن ذلك الفعل بتنفيذ طلب HTTP.
قيمة الإرجاع لأسلوب execute()
هو كائن SyncRecognizeResponse
، والذي قد يحتوي على عدة نسخ بديلة. في الوقت الحالي ، سنستخدم البديل الأول فقط.
// Create request SyncRecognizeRequest request = new SyncRecognizeRequest(); request.setConfig(recognitionConfig); request.setAudio(recognitionAudio); // Generate response SyncRecognizeResponse response = speechService.speech() .syncrecognize(request) .execute(); // Extract transcript SpeechRecognitionResult result = response.getResults().get(0); final String transcript = result.getAlternatives().get(0) .getTranscript();
وأخيراً، لعرض النسخة للمستخدم، يمكنك تمرير أنه للقطعة TextView
. وبطبيعة الحال، نظراً للتغييرات في واجهة المستخدم يجب أن يحدث دائماً في مؤشر ترابط UI، تأكد من القيام بذلك بعد استدعاء الأسلوب runOnUiThread()
النشاط الخاص بك.
runOnUiThread(new Runnable() { @Override public void run() { TextView speechToTextResult = (TextView)findViewById(R.id.speech_to_text_result); speechToTextResult.setText(transcript); } });
يمكنك الآن تشغيل التطبيق الخاص بك، حدد ملف فلك يحتوي على الكلام في اللغة الإنجليزية الأمريكية، وانظر API الكلام سحابة توليد نسخة لذلك.

تجدر الإشارة إلى أن واجهة برمجة تطبيقات Cloud Speech يمكنها حاليًا معالجة ملفات صوتية أحادية القناة فقط. إذا أرسلت ملفًا يحتوي على قنوات متعددة ، فستتلقى ردًا على الخطأ.
5-استخدام اللغة الطبيعية سحابة API
الآن أن لدينا نسخة، ونحن يمكن تمرير إلى API سحابة اللغة الطبيعية تحليلها. للحفاظ على هذا البرنامج التعليمي قصيرة، أننا سوف فقط تشغيل تحليل الكيان والمشاعر على النسخة. بعبارة أخرى ، سنحدد جميع الكيانات المذكورة في النص ، مثل الأشخاص والأماكن والمهن ، ونحدد أيضًا ما إذا كانت مشاعرها السلبية سلبية أو محايدة أو إيجابية.
الخطوة 1: تحديث التخطيط
للسماح للمستخدم ببدء التحليل ، يجب أن يحتوي تخطيطنا على عنصر Button
آخر. لذلك ، أضف الشفرة التالية إلى ملف XML لتنسيق نشاطك:
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/browse_button" android:id="@+id/analyze_button" android:text="Analyze"/>
الخطوة 2: إضافة تعليق توضيحي نسخة
تقدم واجهة برمجة تطبيقات Cloud Natural Language REST خيارًا ملائمًا يُسمى annotateText يسمح لك بتشغيل كل من تحليل المشاعر والكيان في مستند واحد فقط بطلب HTTP. سنستخدمه لتحليل النسخة الخاصة بنا.
ظرًا لأنه يجب أن يبدأ التحليل عندما يضغط المستخدم على الزر الذي أنشأناه في الخطوة السابقة ، أضف OnClickListene
r إليه.
Button analyzeButton = (Button)findViewById(R.id.analyze_button); analyzeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // More code here } });
للتفاعل مع واجهة برمجة التطبيقات باستخدام مكتبة عميل واجهة برمجة تطبيقات Google ، يجب إنشاء كائن CloudNaturalLanguage
باستخدام الفئة CloudNaturalLanguage.Builder
. يتوقع مُنشئه أيضًا نقل HTTP ومصنع JSON.
علاوة على ذلك ، عن طريق تعيين مثيل CloudNaturalLanguageRequestInitializer
إليه ، يمكنك إجباره على تضمين مفتاح API الخاص بك في جميع طلباته.
final CloudNaturalLanguage naturalLanguageService = new CloudNaturalLanguage.Builder( AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), null ).setCloudNaturalLanguageRequestInitializer( new CloudNaturalLanguageRequestInitializer(CLOUD_API_KEY) ).build();
يجب وضع كل النص الذي تريد تحليله باستخدام واجهة برمجة التطبيقات داخل كائن Document.
جب أن يحتوي كائن Document
أيضًا على معلومات التكوين ، مثل لغة النص وما إذا كان قد تمت تهيئته كنص عادي أو HTML. وفقا لذلك ، قم بإضافة التعليمة البرمجية التالية:
String transcript = ((TextView)findViewById(R.id.speech_to_text_result)) .getText().toString(); Document document = new Document(); document.setType("PLAIN_TEXT"); document.setLanguage("en-US"); document.setContent(transcript);
بعد ذلك ، يجب إنشاء عنصر Features
يحدد الميزات التي تهتم بتحليلها. يوضح لك التعليمة البرمجية التالية كيفية إنشاء كائن Features
التي تقول أنك تريد استخراج الكيانات وتشغيل تحليل المشاعر فقط.
Features features = new Features(); features.setExtractEntities(true); features.setExtractDocumentSentiment(true);
مكنك الآن استخدام كائنات Document
Features
لإنشاء كائن AnnotateTextRequest
، والتي يمكن تمريرها إلى الأسلوب annotateText ()
لإنشاء كائن AnnotateTextResponse
.
final AnnotateTextRequest request = new AnnotateTextRequest(); request.setDocument(document); request.setFeatures(features); AsyncTask.execute(new Runnable() { @Override public void run() { AnnotateTextResponse response = naturalLanguageService.documents() .annotateText(request).execute(); // More code here } }
علما أننا يتم توليد الاستجابة في مؤشر ترابط جديد لأنه لا يسمح لعمليات الشبكة في مؤشر ترابط UI.
يمكنك استخراج قائمة كيانات من كائن AnnotateTextResponse
عن طريق استدعاء الأسلوب getEntities ()
الخاص به. وبالمثل ، يمكنك استخراج الشعور الكلي للنسخة عن طريق استدعاء الأسلوب getDocumentSentiment ()
. حصول على الدرجة الفعلية من الشعور ، ومع ذلك ، يجب عليك أيضا استدعاء طريقة getScore ()
، والتي ترجع float
.
كما قد تتوقع، نقاط يساوي صفر يعني الشعور بمشاعر محايدة، على درجة أكبر من الصفر يعني المشاعر الإيجابية، وعلى درجة أقل من الصفر يعني المشاعر السلبية.
ما تفعله بقائمة الكيانات ونقطة الشعور هو بالطبع متروك لك. الآن ، دعنا فقط نعرضهما باستخدام مثيل AlertDialog
.
final List<Entity> entityList = response.getEntities(); final float sentiment = response.getDocumentSentiment().getScore(); runOnUiThread(new Runnable() { @Override public void run() { String entities = ""; for(Entity entity:entityList) { entities += "\n" + entity.getName().toUpperCase(); } AlertDialog dialog = new AlertDialog.Builder(MainActivity.this) .setTitle("Sentiment: " + sentiment) .setMessage("This audio file talks about :" + entities) .setNeutralButton("Okay", null) .create(); dialog.show(); } });
مع التعليمات البرمجية أعلاه، سيتم عرض النتيجة المشاعر في عنوان مربع الحوار، وسيتم عرض قائمة بالكيانات في الهيئة.
إذا قمت بتشغيل التطبيق الآن، يجب أن تكون قادرة على تحليل محتوى الملفات الصوتية، فضلا عن تدوين لهم.

استنتاج
تعرف الآن كيفية استخدام الكلام سحابة وسحابة اللغة الطبيعية واجهات برمجة التطبيقات معا لإنشاء تطبيق الروبوت التي يمكن نسخ ملف صوتي بل أيضا بتشغيل تحليل الكيان والمشاعر على ذلك. في هذا البرنامج التعليمي، تعلمت أيضا كيفية العمل مع "إطار Access تخزين" الروبوت ومكتبات جوجل عميل API.
تعمل Google بشكل منتظم على إضافة ميزات جديدة ومثيرة للاهتمام - إلى جانب الدعم لمزيد من اللغات - إلى واجهات برمجة التطبيقات. وللاطلاع على أحدث المعلومات عنها ، يرجى الرجوع إلى official documentation.
وفي حين كنت هنا، تحقق بعض لدينا الوظائف الأخرى في التطبيق المحمول سحابة الخدمات وآله التعلم!