السبت، 5 يناير 2013

إنشاء تطبيق يحول الصوت إلي نص

إنشاء تطبيق يحول الصوت إلي نص Speech to text

في هذا الدرس سنتعلم خطوات تحويل الكلام إلي نص و وضعه في أداة TextView في نظام الاندرويد

يوجد في الاندرويد ميزة ممتازة لم يستخدمها المطورين بشكل جيد حتى ألان و هي قدرة الاندرويد علي تحويل الكلام إلي نص بمهارة فائقة  و تسمى SpeechToText ، و نحن نعلم جيدا أن الأوامر الصوتية هي التي ستسود مستقبلا و من حسن الحظ ان الاندرويد قد قدم لنا تلك الميزة الرائعة


شرح المشروع :
سنقوم بإنشاء تطبيق بسيط يحتوي علي زر من نوع  ImageButton باسم btnSpeak
 يحمل صورة ميكروفون، و عند اضغط علية يقوم بفتح نافذة التعرف علي الصوت و التي تاخذ الصوت كمدخل و تحوله إلي نص ووضع النص في الأداة TextView باسم txtText
الخطوة الأولي :
قم بفتح برنامج eclips و بدء مشروع جديد  من خلال الذهاب الي
New>Project>Android Project
أعطي المشروع اسم SpeechToText  
و الـ Package  أعطها القيمة  arabic.android.speechtotext
و اختر نظام التشغيل Android 2.1 أو الأعلى منه ثم اضغط التالي


-->



الخطوة الثانية : تعديل الـ Layout

بعد إنشاء المشروع سنقوم بتعديل محتويات النشاط Activity بكتابة الكود التالي :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/textView1"
    android:layout_toLeftOf="@+id/textView1"
    android:gravity="center"
    android:orientation="vertical" >
  
    <ImageButton
        android:id="@+id/btnSpeak"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        android:contentDescription="speak"
        android:src="@android:drawable/ic_btn_speak_now" />
  
    <TextView
        android:id="@+id/txtText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        android:textAppearance="?android:attr/textAppearanceLarge" />
  
</LinearLayout>

الخطوة الثالثة كتابة كود الجافا :
توجة الي ملف الجافا MainActivity.java في المسار

قم باستبدال الكود بالكود التالي ثم احفظ التغيرات

package Arabic.android.SpeechToText  ;
  
import java.util.ArrayList;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.view.Menu;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
 
public class MainActivity extends Activity {
 
    protected static final int RESULT_SPEECH = 1;
 
    private ImageButton btnSpeak;
    private TextView txtText;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        txtText = (TextView) findViewById(R.id.txtText);
 
        btnSpeak = (ImageButton) findViewById(R.id.btnSpeak);
 
        btnSpeak.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
 
                Intent intent = new Intent(
                        RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
 
      intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US");
 
                try {
                    startActivityForResult(intent, RESULT_SPEECH);
                    txtText.setText("");
                } catch (ActivityNotFoundException a) {
                    Toast t = Toast.makeText(getApplicationContext(),
                   "Opps! Your device doesn't support Speech to Text",
                            Toast.LENGTH_SHORT);
                    t.show();
                }
            }
        });
 
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
 
        switch (requestCode) {
        case RESULT_SPEECH: {
            if (resultCode == RESULT_OK && null != data) {
 
                ArrayList<String> text = data
              .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
 
                txtText.setText(text.get(0));
            }
            break;
        }
 
        }
    }
}




 التعرف علي الكلام موجود في حزمة الاندرويد API و تسمي android.speech و الكائن الفرعي المبثق منها و الذي يسمي android.speech.RecognizerIntent
و هذا الكائن هو المسئول عن إظهار مربع الحوار الذي سيستخدم لإدخال الصوت إلي التطبيق ثم إرسالها الي Speech  للتعرف عليها ثم إعادة النص الذي تم التعرف عليه الي نفس النشاط الحالي Calling activity
لهذا استخدما الدالة startActivityForResult() لنخبر الاندرويد اننا بحاجة الي الانصات و استرجاع النص المحول مرة اخري الا نفس النشاط ووضعة في الاداة txtText  

و كما تلاحظون في الكود قد استخدما الكائن Intent لاعلان عن الكائن android.speech.RecognizerIntent

قم بحفظ التغيرات و تشغيل التطبيق علي المحاكي 
سيظهر لك بالصورة التالية







هناك 3 تعليقات:

  1. هل يمكن تحويل الكلام العربي الى نصوص ام الانجليزي فقط

    ردحذف
  2. هل يمكن تحويل الكتابه الى صوت يعني عكس هذا البرنامج
    او انه يعمل ع تحويل الصوره الى صوت
    ارجوو الرد

    ردحذف
  3. أزال المؤلف هذا التعليق.

    ردحذف