এন্ড্রয়েডে গুগল API ছাড়া স্পিচ রিকগনিশনার তৈরি করার ধাপাবলী
এই উদাহরণটি দেখায় কীভাবে Android-এর বিল্ট-ইন SpeechRecognizer ক্লাস ব্যবহার করে গুগল ক্লাউড API ছাড়া স্পিচ টু টেক্সট ফিচার বাস্তবায়ন করা যায়। এটি ডিভাইসের অন-ডিভাইস স্পিচ রিকগনিশন エンজিন ব্যবহার করে।
ধাপ ১: নতুন প্রজেক্ট তৈরি করুন
Android Studio-তে File → New Project এ যান এবং প্রয়োজনীয় বিবরণ পূরণ করে একটি নতুন প্রজেক্ট তৈরি করুন।
ধাপ ২: লেআউট ফাইল সংশোধন করুন (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView1"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_centerInParent="true"
android:src="@drawable/ic_mic" />
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/toggleButton1"
android:layout_marginTop="28dp"
android:paddingLeft="10dp"
android:paddingRight="10dp" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/progressBar1"
android:layout_centerHorizontal="true"
android:layout_marginTop="47dp" />
<ToggleButton
android:id="@+id/toggleButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="26dp"
android:text="টগল বাটন" />
</RelativeLayout>
ধাপ ৩: মূল এক্টিভিটি লজিক (src/MainActivity.java)
package app.com.sample;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements RecognitionListener {
private static final int REQUEST_RECORD_PERMISSION = 100;
private TextView returnedText;
private ToggleButton toggleButton;
private ProgressBar progressBar;
private SpeechRecognizer speech = null;
private Intent recognizerIntent;
private String LOG_TAG = "VoiceRecognitionActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
returnedText = findViewById(R.id.textView1);
progressBar = findViewById(R.id.progressBar1);
toggleButton = findViewById(R.id.toggleButton1);
progressBar.setVisibility(View.INVISIBLE);
speech = SpeechRecognizer.createSpeechRecognizer(this);
Log.i(LOG_TAG, "isRecognitionAvailable: " + SpeechRecognizer.isRecognitionAvailable(this));
speech.setRecognitionListener(this);
recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "US-en");
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3);
toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
progressBar.setVisibility(View.VISIBLE);
progressBar.setIndeterminate(true);
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_RECORD_PERMISSION);
} else {
progressBar.setIndeterminate(false);
progressBar.setVisibility(View.INVISIBLE);
speech.stopListening();
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_RECORD_PERMISSION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
speech.startListening(recognizerIntent);
} else {
Toast.makeText(MainActivity.this, "অনুমতি অস্বীকৃত!", Toast.LENGTH_SHORT).show();
}
break;
}
}
@Override
protected void onResume() { super.onResume(); }
@Override
protected void onPause() { super.onPause(); }
@Override
protected void onStop() {
super.onStop();
if (speech != null) {
speech.destroy();
Log.i(LOG_TAG, "destroy");
}
}
// RecognitionListener মেথডগুলো
@Override public void onBeginningOfSpeech() {
Log.i(LOG_TAG, "onBeginningOfSpeech");
progressBar.setIndeterminate(false);
progressBar.setMax(10);
}
@Override public void onBufferReceived(byte[] buffer) { Log.i(LOG_TAG, "onBufferReceived: " + buffer); }
@Override public void onEndOfSpeech() {
Log.i(LOG_TAG, "onEndOfSpeech");
progressBar.setIndeterminate(true);
toggleButton.setChecked(false);
}
@Override public void onError(int errorCode) {
String errorMessage = getErrorText(errorCode);
Log.d(LOG_TAG, "FAILED " + errorMessage);
returnedText.setText(errorMessage);
toggleButton.setChecked(false);
}
@Override public void onEvent(int arg0, Bundle arg1) { Log.i(LOG_TAG, "onEvent"); }
@Override public void onPartialResults(Bundle arg0) { Log.i(LOG_TAG, "onPartialResults"); }
@Override public void onReadyForSpeech(Bundle arg0) { Log.i(LOG_TAG, "onReadyForSpeech"); }
@Override
public void onResults(Bundle results) {
Log.i(LOG_TAG, "onResults");
ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
String text = "";
for (String result : matches) text = result + "\n";
returnedText.setText(text);
}
@Override public void onRmsChanged(float rmsdB) {
Log.i(LOG_TAG, "onRmsChanged: " + rmsdB);
progressBar.setProgress((int) rmsdB);
}
public static String getErrorText(int errorCode) {
String message;
switch (errorCode) {
case SpeechRecognizer.ERROR_AUDIO: message = "অডিও রেকর্ডিং ত্রুটি"; break;
case SpeechRecognizer.ERROR_CLIENT: message = "ক্লায়েন্ট সাইড ত্রুটি"; break;
case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS: message = "অपर্যাপ্ত অনুমতি"; break;
case SpeechRecognizer.ERROR_NETWORK: message = "নেটওয়ার্ক ত্রুটি"; break;
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT: message = "নেটওয়ার্ক টাইমআউট"; break;
case SpeechRecognizer.ERROR_NO_MATCH: message = "মিলান পাওয়া যায়নি"; break;
case SpeechRecognizer.ERROR_RECOGNIZER_BUSY: message = "রিকগনিশন সার্ভিস ব্যস্ত"; break;
case SpeechRecognizer.ERROR_SERVER: message = "সার্ভার থেকে ত্রুটি"; break;
case SpeechRecognizer.ERROR_SPEECH_TIMEOUT: message = "কোনো স্পিচ ইনপুট নেই"; break;
default: message = "বুঝতে পারলাম না, আবার চেষ্টা করুন।"; break;
}
return message;
}
}
ধাপ ৪: ম্যানিফেস্টে অনুমতি যোগ করুন (AndroidManifest.xml)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
গুরুত্বपूर्ण নোট
- এই পদ্ধতিটি ডিভাইসের অন-ডিভাইস স্পিচ রিকগনিশন ব্যবহার করে, ইন্টারনেট ছাড়াও কাজ করতে পারে (ডিভাইস সাপোর্ট করলে)।
SpeechRecognizer.isRecognitionAvailable(context)চেক করুন ডিভাইস সাপোর্ট করে কিনা।- রানটাইম পারমিশন `RECORD_AUDIO` আবশ্যক।
অ্যাপ্লিকেশন চালান
আপনার আসল এন্ড্রয়েড ডিভাইস কম্পিউটারের সাথে সংযুক্ত আছে অনুমান করি। Android Studio-তে আপনার প্রজেক্টের এক্টিভিটি ফাইল খুলুন এবং টুলবারের Run আইকনে ক্লিক করুন। আপনার মোবাইল ডিভাইস নির্বাচন করুন এবং আপনার ডিভাইসে ডিফল্ট স্ক্রিন দেখুন।