Lập trình Android — August 12, 2016 at 3:54 am

Hướng dẫn demo code nhận diện giọng nói

by

Trong một số ứng dụng Android đôi khi bạn thấy có chức năng nhận dạng giọng nói rất tiện lợi cho người dùng. Hôm nay chúng tôi cũng chia sẻ với các bạn demo về code nhận diện giọng nói. Cùng theo dõi nhé các bạn!

Speech To Text là gì?

Đó là một cách chuyển đổi một file âm thanh thành một chuỗi các ký tự hoặc một mảng gồm rất nhiều chuỗi ký tự …
– Cơ chế hoạt động của Speech To Text trên thiết bị android là nó chuyển một file âm thanh về server nào đó của google và sau đó server này sẽ trả lại một mảng chuỗi ký tự gần giống như âm thanh mà bạn phát ra trong file đó.
– Cho tới lúc này thì việc nhận dạng âm thanh chuyển đổi vẫn còn chưa thật sự chính xác lắm bởi vậy bạn nên phát âm thật chuẩn rồi mới trả về đúng ký tự mong muốn (lưu ý có hỗ trợ tiếng Việt)

Hướng dẫn code:
– AndroidManifest.xml

<?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

<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

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 = (EditText) findViewById(R.id.etTextHint);
mlvTextMatches = (ListView) findViewById(R.id.lvTextMatches);
msTextMatches = (Spinner) findViewById(R.id.sNoOfMatches);
mbtSpeak = (Button) findViewById(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<ResolveInfo> activities = 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_PACKAGE, getClass().getPackage().getName());

// goi y nhung dieu nguoi dung muon noi
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, metTextHint.getText().toString());

// goi y nhan dang nhung gi nguoi dung se noi
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.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_RESULTS, noOfMatches);

// Gui yeu cau di
startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
}

// Su kien nhan lai ket qua
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == VOICE_RECOGNITION_REQUEST_CODE)

// Truong hop co gia tri tra ve
if(resultCode == RESULT_OK) {
ArrayList<String> textMatchList = 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.QUERY, searchQuery);
startActivity(search);
} else {
// Hien thi ket qua
mlvTextMatches.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, textMatchList));
}
}
// 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(requestCode, resultCode, data);
}

void showToastMessage(String message){
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}

Trên đây chúng tôi đã chia sẻ với các bạn demo code nhận diện giọng nói. Các bạn có thể dựa vào đó để phát triển các ứng dụng của các bạn. Chúc các bạn thành công.

Nguồn: laptrinhandroid

Leave a Comment

Your email address will not be published. Required fields are marked *