Android: Arabic speech recognition - offline

2020-08-01 06:54发布

Can any one help me or give me a clue about Arabic speech recognition - offline for android??

I want to develop simple app that do speech recognition - offline as doing this online I know how... if any one have suggestion or link to an open source project or even library to buy that do this efficiently it will be amazing.

thanks in advance.

2条回答
倾城 Initia
2楼-- · 2020-08-01 07:22

use

intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,"ar-JO");

The below code worked fine with me:

package tk.oryx.voice;

import android.app.Activity;
import android.content.Intent;
import android.media.MediaRecorder;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.ArrayList;

public class MainActivity extends Activity implements View.OnClickListener {

    private TextView mText;
    private MediaRecorder recorder;
    private SpeechRecognizer sr;
    private static final String TAG = "MyStt3Activity";
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button speakButton = (Button) findViewById(R.id.btn_speak);
        mText = (TextView) findViewById(R.id.textView1);
        speakButton.setOnClickListener(this);
        sr = SpeechRecognizer.createSpeechRecognizer(this);
        sr.setRecognitionListener(new listener());
    }

    class listener implements RecognitionListener
    {
        public void onReadyForSpeech(Bundle params){ }
        public void onBeginningOfSpeech(){ }
        public void onRmsChanged(float rmsdB){ }
        public void onBufferReceived(byte[] buffer) { }
        public void onEndOfSpeech(){ }
        public void onError(int error)
        {
            mText.setText("error " + error);
        }
        public void onResults(Bundle results)
        {
            String str = new String();
            Log.d(TAG, "onResults " + results);
            ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
         /*   for (int i = 0; i < data.size(); i++)
            {
                Log.d(TAG, "result " + data.get(i));
                str += data.get(i);
            }
         */
          //  mText.setText("results: "+str+" "+String.valueOf(data.size()));
            mText.setText("results: "+data.get(0));
        }
        public void onPartialResults(Bundle partialResults)
        {
            Log.d(TAG, "onPartialResults");
        }
        public void onEvent(int eventType, Bundle params)
        {
            Log.d(TAG, "onEvent " + eventType);
        }
    }
    public void onClick(View v) {
        if (v.getId() == R.id.btn_speak)
        {
            Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,"ar-JO");
            intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,"tk.oryx.voice");
         //   intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 20000); // value to wait

            intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,1);  // 1 is the maximum number of results to be returned.
            sr.startListening(intent);
        }
    }
}

The layout is very simple:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="tk.oryx.voice.MainActivity">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignEnd="@+id/progressBar1"
        android:layout_alignLeft="@+id/progressBar1"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/progressBar1"
        android:layout_alignStart="@+id/progressBar1"
        android:layout_marginTop="220dp"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_speak"
        android:layout_width="wrap_content"
        android:layout_height="48dp"
        android:text="Button"
        tools:layout_editor_absoluteY="295dp"
        tools:layout_editor_absoluteX="148dp"
        android:layout_alignParentTop="true"
        android:layout_alignLeft="@+id/progressBar1"
        android:layout_alignStart="@+id/progressBar1"
        android:layout_marginTop="18dp" />

</RelativeLayout>

and the manifest is:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="tk.oryx.voice">

    <uses-permission android:name="android.permission.RECORD_AUDIO"/>

    <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>
查看更多
\"骚年 ilove
3楼-- · 2020-08-01 07:25

In this address there is a project with multi language speech to text

https://github.com/MaryamAzhdari/speechToTextMultiLanguage

by summery you should add this code:

imv_arabic.setOnClickListener{
        val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
        intent.putExtra(
            RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
        )
        //For some county you can use both of the below lines
        //intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.FRANCE)
        //intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "fr-FR")//French (France)

        //Some countries not define in Locale
        //You can use this page for finding your language
        //https://cloud.google.com/speech-to-text/docs/languages
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ar-AE")//Arabic (United Arab Emirates)
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Need to speak")

        try {
            startActivityForResult(intent, REQ_CODE)
        } catch (a: ActivityNotFoundException) {
            Toast.makeText(
                applicationContext,
                "Sorry! Your device not supported",
                Toast.LENGTH_SHORT
            ).show()
        }
    }


override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if(requestCode==REQ_CODE){
        if (resultCode == RESULT_OK && data!=null) {
            val result = data
                .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)
            tv_result?.text=result[0].toString()
        }
    }
}

also add this permission in manifest:

<uses-permission android:name="android.permission.RECORD_AUDIO" />

and this code for android above 6:

  private fun setupPermissions() {
    val permission = ContextCompat.checkSelfPermission(this,
        Manifest.permission.RECORD_AUDIO)

    if (permission != PackageManager.PERMISSION_GRANTED) {
        //Log.i(Tag, "Permission to record denied")
    }
}

for finding any language see this address:

https://cloud.google.com/speech-to-text/docs/languages

查看更多
登录 后发表回答