Tổng hợp Nhận dạng giọng nói - speech to text

Thảo luận trong 'Android cơ bản' bắt đầu bởi thanhlong90.it, 9/2/14.

  1. thanhlong90.it

    thanhlong90.it Admin Support

    Lượt xem: 26,006
    Đúng với tiêu đề trên, hôm nay Long sẽ giới thiệu các bạn một code ví dụ đơn giản về việc nhận dạng giọng nói trong lập trình ứng dụng trên android, biết đâu đây là một ứng dụng đơn giản có thể giúp các bạn phát triển các ứng dụng tiên tiến hơn với kỹ thuật điểu khiển ứng dụng bằng giọng nói ... tuy nhiên để làm được việc này thì ko dễ, các bạn hãy cùng phát triển ý tưởng này nhé!

    1) Source code demo lập trình android:
    - Click vào đây để download source code demo

    2) Giới thiệu thêm về Speech To Text:
    - Speech To Text là gì? Nó là một cách chuyển đổi 1 tập tin âm thanh thành một chuỗi ký tự hoặc một mảng gồm nhiều chuỗi ký tự ...
    - Cơ chế hoạt động của Speech To Text trên android là nó chuyển một tập tin âm thanh về một server nào đó của google và server này sẽ trả lại một mảng các chuỗi ký tự gần giống với âm thanh bạn phát ra trong tập tin đó.
    - Cho tới thời điểm này thì việc nhận dạng âm thanh chuyển đổi vẫn chưa thật chính xác lắm bởi vậy bạn phải phát âm thật chuẩn mới trả về đúng ký tự muon muốn (lưu ý có hỗ trợ tiếng Việt)

    3) Video hướng dẫn:


    4) Hướng dẫn code:
    - AndroidManifest.xml
    PHP:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="thanhlong90.it.demoandroidvoicerecognition"
        android:versionCode="1"
        android:versionName="1.0" >
     
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="19" />
       
        <uses-permission android:name="android.permission.INTERNET" />
     
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="thanhlong90.it.demoandroidvoicerecognition.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
     
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
     
    </manifest>
    - activity_main.xml
    PHP:
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        
    xmlns:tools="http://schemas.android.com/tools"
        
    android:layout_width="match_parent"
        
    android:layout_height="match_parent"
        
    android:orientation="vertical" >
       
        <
    TextView
            android
    :layout_width="match_parent"
            
    android:layout_height="wrap_content"
            
    android:layout_marginTop="5dp"
            
    android:gravity="center"
            
    android:text="@string/parsed_data"
            
    android:textAppearance="?android:attr/textAppearanceMedium"
            
    android:textStyle="bold" />
     
        <
    EditText
            android
    :id="@+id/etTextHint"
            
    android:layout_width="match_parent"
            
    android:layout_height="wrap_content"
            
    android:gravity="top"
            
    android:hint="@string/etSearchHint"
            
    android:inputType="textMultiLine"
            
    android:lines="1" />
     
        <
    Button
            android
    :id="@+id/btSpeak"
            
    android:layout_width="match_parent"
            
    android:layout_height="wrap_content"
            
    android:onClick="speak"
            
    android:padding="@dimen/padding_medium"
            
    android:text="@string/btSpeak"
            
    tools:context=".VoiceRecognitionActivity" />
     
        <
    Spinner
            android
    :id="@+id/sNoOfMatches"
            
    android:layout_width="match_parent"
            
    android:layout_height="wrap_content"
            
    android:entries="@array/saNoOfMatches"
            
    android:prompt="@string/sNoOfMatches" />
     
        <
    TextView
            android
    :layout_width="match_parent"
            
    android:layout_height="wrap_content"
            
    android:text="@string/tvTextMatches"
            
    android:textStyle="bold" />
     
        <
    ListView
            android
    :id="@+id/lvTextMatches"
            
    android:layout_width="match_parent"
            
    android:layout_height="wrap_content" />
     
    </
    LinearLayout>
    - MainActivity.java
    PHP:
    package thanhlong90.it.demoandroidvoicerecognition;
     
    import java.util.ArrayList;
    import java.util.List;
     
    import android.os.Bundle;
    import android.app.Activity;
    import android.app.SearchManager;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.speech.RecognizerIntent;
    import android.util.Log;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.widget.Spinner;
    import android.widget.Toast;
     
    public class 
    MainActivity extends Activity {
        private static final 
    int VOICE_RECOGNITION_REQUEST_CODE 1001;
     
        private 
    EditText metTextHint;
        private 
    ListView mlvTextMatches;
        private 
    Spinner msTextMatches;
        private 
    Button mbtSpeak;
     
        @
    Override
        
    public void onCreate(Bundle savedInstanceState) {
            
    super.onCreate(savedInstanceState);
            
    setContentView(R.layout.activity_main);
            
    metTextHint = (EditTextfindViewById(R.id.etTextHint);
            
    mlvTextMatches = (ListViewfindViewById(R.id.lvTextMatches);
            
    msTextMatches = (SpinnerfindViewById(R.id.sNoOfMatches);
            
    mbtSpeak = (ButtonfindViewById(R.id.btSpeak);
           
            
    checkVoiceRecognition();
        }
     
        public 
    void checkVoiceRecognition() {
            
    Log.v("""checkVoiceRecognition checkVoiceRecognition");
            
    // Kiem tra thiet bi cho phep nhan dang giong noi hay ko
            
    PackageManager pm getPackageManager();
            List<
    ResolveInfoactivities pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
            if (
    activities.size() == 0) {
                
    mbtSpeak.setEnabled(false);
                
    Toast.makeText(this"Voice recognizer not present"Toast.LENGTH_SHORT).show();
            }
        }
     
        
    // Gui tap tin am thanh
        
    public void speak(View view) {
            
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
            
    // xac nhan ung dung muon gui yeu cau
            
    intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGEgetClass().getPackage().getName());
     
            
    // goi y nhung dieu nguoi dung muon noi
            
    intent.putExtra(RecognizerIntent.EXTRA_PROMPTmetTextHint.getText().toString());
     
            
    // goi y nhan dang nhung gi nguoi dung se noi
            
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODELRecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
     
            
    // Kiem tra item muon hien thi da chon tron spinner
            
    if (msTextMatches.getSelectedItemPosition() == AdapterView.INVALID_POSITION) {
                
    Toast.makeText(this"Please select No. of Matches from spinner"Toast.LENGTH_SHORT).show();
                return;
            }
     
            
    int noOfMatches Integer.parseInt(msTextMatches.getSelectedItem().toString());
           
            
    // Xac dinh ban muon bao nhieu ket qua gan dung duoc tra ve
            
    intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTSnoOfMatches);
     
            
    // Gui yeu cau di
            
    startActivityForResult(intentVOICE_RECOGNITION_REQUEST_CODE);
        }
     
        
    // Su kien nhan lai ket qua
        
    @Override
        
    protected void onActivityResult(int requestCodeint resultCodeIntent data) {
            if (
    requestCode == VOICE_RECOGNITION_REQUEST_CODE)
     
                
    // Truong hop co gia tri tra ve
                
    if(resultCode == RESULT_OK) {
                    
    ArrayList<StringtextMatchList data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
     
                    if (!
    textMatchList.isEmpty()) {
                        
    // kiem tra neu co chua tu khoa 'search' thi se bat dau tim kiem tren web
                        
    if (textMatchList.get(0).contains("search")) {
                            
    String searchQuery textMatchList.get(0).replace("search"" ");
                            
    Intent search = new Intent(Intent.ACTION_WEB_SEARCH);
                            
    search.putExtra(SearchManager.QUERYsearchQuery);
                            
    startActivity(search);
                        } else {
                            
    // Hien thi ket qua
                            
    mlvTextMatches.setAdapter(new ArrayAdapter<String>(thisandroid.R.layout.simple_list_item_1textMatchList));
                        }
                    }
                
    // Cac truong hop loi
                
    } else if (resultCode == RecognizerIntent.RESULT_AUDIO_ERROR){
                    
    showToastMessage("Audio Error");
                } else if (
    resultCode == RecognizerIntent.RESULT_CLIENT_ERROR){
                    
    showToastMessage("Client Error");
                } else if (
    resultCode == RecognizerIntent.RESULT_NETWORK_ERROR){
                    
    showToastMessage("Network Error");
                } else if (
    resultCode == RecognizerIntent.RESULT_NO_MATCH){
                    
    showToastMessage("No Match");
                } else if (
    resultCode == RecognizerIntent.RESULT_SERVER_ERROR){
                    
    showToastMessage("Server Error");
                }
            
    super.onActivityResult(requestCoderesultCodedata);
        }
       
        
    void showToastMessage(String message){
            
    Toast.makeText(thismessageToast.LENGTH_SHORT).show();
        }
    }
    5) Hình ảnh kết quả demo:
    device-2014-02-09-194159

    Bài viết đăng lên diễn đàn khác vui lòng ghi rõ nguồn: Android.vn
    Pass giải nén: http://android.vn
    Support:
    - Skype: thanhlong90.it.support
    - Gmail: thanhlong90.it@gmail.com
    Chúc các bạn thành công!
    nhận dạng, giọng nói, speech to text, voice, recognizer, chuyển đổi, lời nói, văn bản, điều khiển, âm thanh
    emxtanh, QTrungadX_Dat thích bài này.
  2. manhdatbn93

    manhdatbn93 New Member

    :). Mình cũng đang làm về cái này. Của mình làm đơn giản. Cũng tham khảo trên mạng nhiều :). Chúc vui :D
    files activity.xml
    activity_main.xml
    <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="@string/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" />


    file MainActivity.java
    MainActivity.java
    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(),
    "Thiết bị của bạn không hỗ trợ nhận dạng giọng nói",
    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;
    }

    }
    }
    }

    Mình chưa biết chèn code :eek:.Là newbie :). Có gì anh Long ghé qua thì chèn giúp :oops:
  3. TranvanTai

    TranvanTai New Member

  4. TranvanTai

    TranvanTai New Member

    [​IMG]a ơ cho e hỏi lỗi này là lỗi j được k ah
  5. Huongque93

    Huongque93 New Member

    thank bài biết rất hữu ích...







    Phần mềm bán hàng miễn phí cho mọi cá nhân shop thời trang, cửa hàng siêu thị tiệm tạp hóa, hiệu thuốc… http://phan-mem-ban-hang.net/ Thiết kế web bán hàng trên mạng internet là phương tiện giới thiệu sản phẩm, dịch vụ đến khách hàng trên toàn thế giới dễ dàng mà chi phí lại thấp… http://web-giadinh.com/
    Chè Tân Nguyên là thương hiệu Chè truyền thống tại Tân Cương Thái Nguyên đã đi vào tiềm thức ẩm thực của người Việt Nam qua nhiều thế hệ…http://chetannguyen.com/

Chia sẻ trang này