问题
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.
回答1:
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>
回答2:
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
来源:https://stackoverflow.com/questions/39253721/android-arabic-speech-recognition-offline