কম্পিউটার টিউটোরিয়াল

এন্ড্রয়েডে গুগল API ছাড়া স্পিচ রিকগনিশনার ডেভেলপ করার পদ্ধতি

এন্ড্রয়েডে গুগল 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 আইকনে ক্লিক করুন। আপনার মোবাইল ডিভাইস নির্বাচন করুন এবং আপনার ডিভাইসে ডিফল্ট স্ক্রিন দেখুন।

  1. Google Play Store ছাড়া অ্যান্ড্রয়েডে অ্যাপ ইনস্টল করার পদ্ধতি

  2. গুগল প্লে সার্ভিস ছাড়া অ্যান্ড্রয়েড ব্যবহার করার পদ্ধতি

  3. অ্যান্ড্রয়েডের টেক্সট-টু-স্পিচ ফিচার ব্যবহার করুন: ধাপে ধাপে গাইড

  4. অ্যান্ড্রয়েডে গুগল টেক্স্ট-টু-স্পিচ ভয়েস সহজে পরিবর্তন করুন – ধাপে ধাপে টিউটোরিয়াল