Android 谷歌语音到文本对话框卡住了

Android 谷歌语音到文本对话框卡住了,android,speech-to-text,speech,Android,Speech To Text,Speech,我正在开发一个应用程序,我想通过语音输入使用从印地语到英语的音译。为此,我使用谷歌STTAPI。当我的语音输入很短时,一切都能正常工作,但当我输入很长的语音时,对话框会陷入“试着说点什么…”的状态,结果也不理想 这是我的主要活动:- public class MainActivity extends AppCompatActivity implements View.OnClickListener { // Record Button AppCompatButton Reco

我正在开发一个应用程序,我想通过语音输入使用从印地语到英语的音译。为此,我使用谷歌STTAPI。当我的语音输入很短时,一切都能正常工作,但当我输入很长的语音时,对话框会陷入“试着说点什么…”的状态,结果也不理想

这是我的主要活动:-

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    //  Record Button
    AppCompatButton RecordBtn;

    //  TextView to show Original and recognized Text
    TextView Original,result;

    // Request Code for STT
    private final int SST_REQUEST_CODE = 101;

    //  Conversion Table Object...
    ConversionTable conversionTable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Original = findViewById(R.id.Original_Text);
        RecordBtn = findViewById(R.id.RecordBtn);
        result = findViewById(R.id.Recognized_Text);

        RecordBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.RecordBtn:
                Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

                //  For 30 Sec it will Record...
                intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 30);

                //  Use Off line Recognition Engine only...
                intent.putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, false);

                //  Use Hindi Speech Recognition Model...
                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "hi-IN");

                try {
                    startActivityForResult(intent, SST_REQUEST_CODE);
                } catch (ActivityNotFoundException a) {
                    Toast.makeText(getApplicationContext(),
                            getString(R.string.error),
                            Toast.LENGTH_SHORT).show();
                }

                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case SST_REQUEST_CODE:
                if (resultCode == RESULT_OK && null != data) {
                    ArrayList<String> getResult = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                    Original.setText(getResult.get(0));
                    conversionTable = new ConversionTable();
                    String Transformed_String = conversionTable.transform(getResult.get(0));
                    result.setText(Transformed_String);
                }
                break;
        }
    }
}
产出:-

对于简短的语音输入:-

对于长时间语音输入,它卡住了,无法获得结果:-
问题在于谷歌的实施。我面临着同样的困难,尝试了所有的事情,但什么都没做

因此,我采用了另一种方法来解决这个问题,解决方案是自己实现侦听器。这是我的代码,它从来不会弹出内置对话框(你可以实现你的自定义对话框),但它的工作方式很有魅力

以下是您如何做到这一点:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    //  Record Button
    AppCompatButton RecordBtn;

    //  TextView to show Original
    TextView Original;

    //  SpeechRecognizer Object...
    private SpeechRecognizer speechRecognizer;

    //  For TAG
    private String TAG = getClass().getName();

    //  RecognizerIntent
    private Intent recognizerIntent;

    //  Request Code for Permission
    private static final int REQUEST_CODE_RECORD_AUDIO = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Original = findViewById(R.id.Original_Text);
        RecordBtn = findViewById(R.id.RecordBtn);

        recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, R.string.record);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            recognizerIntent.putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, false);
        }

        //  For 30 Sec it will Record...
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 30);

        //  Use Hindi Speech Recognition Model...
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "hi-IN");

        speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);

        //  Permission Dialog
        Askpermission();

        RecordBtn.setOnClickListener(this);
    }

    private void Askpermission() {
        // No explanation needed; request the permission
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.RECORD_AUDIO},
                REQUEST_CODE_RECORD_AUDIO);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String permissions[], @NonNull int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_RECORD_AUDIO: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Operation();
                } else {
                    Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.RecordBtn:
                Log.d(TAG, "onClick: ");
                if (checkPermission()) {
                    if (IsAvailable(this)) {
                        Log.d(TAG, "Speech Recognition Service Available...");
                        speechRecognizer.startListening(recognizerIntent);
                    } else {
                        Toast.makeText(this, "Speech Recognition Service not Available on your device...",
                                Toast.LENGTH_SHORT)
                                .show();
                    }
                } else {
                    Askpermission();
                }
                break;
        }
    }

    //  Check if Speech recognition Service is Available on the Smartphone...
    private boolean IsAvailable(Context context) {
        return SpeechRecognizer.isRecognitionAvailable(context);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        speechRecognizer.destroy();
    }

    // Check Audio Permission
    private boolean checkPermission() {
        return ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) ==
                PackageManager.PERMISSION_GRANTED;
    }

    // Start Operation
    private void Operation() {
        speechRecognizer.setRecognitionListener(new RecognitionListener() {
            @Override
            public void onReadyForSpeech(Bundle params) {
                Log.d(TAG, "Audio Service is connected to Servers....");
                Log.d(TAG, "You can now start your speech...");
            }

            @Override
            public void onBeginningOfSpeech() {
                Log.d(TAG, "User has started speech...");
            }

            @Override
            public void onRmsChanged(float rmsdB) {

            }

            @Override
            public void onBufferReceived(byte[] buffer) {

            }

            @Override
            public void onEndOfSpeech() {
                Log.d(TAG, "User has Finished... speech...");
            }

            @Override
            public void onError(int error) {
                Log.d(TAG, "onError: " + error);
                switch (error){
                    case SpeechRecognizer.ERROR_AUDIO:
                        Toast.makeText(MainActivity.this, "Error Recording Audio...", Toast
                                .LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_CLIENT:
                        Toast.makeText(MainActivity.this, "Client Side Error...", Toast
                                .LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
                        Toast.makeText(MainActivity.this, "Insufficient permissions...", Toast
                                .LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_NETWORK:
                        Toast.makeText(MainActivity.this, "Network Related Error...", Toast
                                .LENGTH_SHORT).show();
                        break;

                    case SpeechRecognizer.ERROR_NO_MATCH:
                        Toast.makeText(MainActivity.this, "Please Installed Offline Hindi " +
                                "Language Data...", Toast.LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
                        Toast.makeText(MainActivity.this, "Recognition Busy...", Toast
                                .LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_SERVER:
                        Toast.makeText(MainActivity.this, "Please Installed Offline Hindi " +
                                "Language Data...", Toast
                                .LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
                        Toast.makeText(MainActivity.this, "Speech Timeout...", Toast
                                .LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
                        Toast.makeText(MainActivity.this, "Network Timeout Error...", Toast
                                .LENGTH_SHORT).show();
                }
            }

            @Override
            public void onResults(Bundle results) {
                ArrayList<String> Results = results.getStringArrayList(SpeechRecognizer
                        .RESULTS_RECOGNITION);

                if (Results != null) {
                    Original.setText(Results.get(0));
                }
            }

            @Override
            public void onPartialResults(Bundle partialResults) {

            }

            @Override
            public void onEvent(int eventType, Bundle params) {

            }
        });
    }

}
public类MainActivity扩展AppCompatActivity实现View.OnClickListener{
//录制按钮
AppCompatButton记录BTN;
//TextView以显示原始文件
文本视图原件;
//语音识别器对象。。。
私人语音识别器语音识别器;
//标签
私有字符串标记=getClass().getName();
//识别者意图
私人意图识别人意图;
//请求权限代码
专用静态最终整数请求\代码\记录\音频=100;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
原始=findViewById(R.id.原始文本);
RecordBtn=findviewbyd(R.id.RecordBtn);
recognizerIntent=新意图(recognizerIntent.ACTION\u recognizer\u SPEECH);
recognizerIntent.putExtra(recognizerIntent.EXTRA\u提示符,R.string.record);
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.M){
recognizerIntent.putExtra(recognizerIntent.EXTRA\u首选\u脱机,false);
}
//它将记录30秒。。。
recognizerIntent.putExtra(recognizerIntent.EXTRA_语音_输入_最小长度_毫秒,30);
//使用印地语语音识别模型。。。
recognizerIntent.putExtra(recognizerIntent.EXTRA_语言,“hi-IN”);
speechRecognizer=speechRecognizer.createSpeechRecognizer(this);
//权限对话框
Askpermission();
RecordBtn.setOnClickListener(此);
}
私有无效Askpermission(){
//无需解释;请求许可
ActivityCompat.requestPermissions(此,
新字符串[]{Manifest.permission.RECORD_AUDIO},
请求(代码、记录、音频);
}
@凌驾
公共无效onRequestPermissionsResult(int requestCode,
@非空字符串权限[],@NonNull int[]grantResults){
开关(请求代码){
案例请求\代码\记录\音频:{
//如果取消请求,则结果数组为空。
如果(grantResults.length>0
&&grantResults[0]==PackageManager.PERMISSION\u已授予){
操作();
}否则{
Toast.makeText(MainActivity.this,“读取外部存储器的权限被拒绝”,Toast.LENGTH_SHORT.show();
}
}
}
}
@凌驾
公共void onClick(视图v){
开关(v.getId()){
案例R.id.RecordBtn:
Log.d(标记“onClick:”);
if(checkPermission()){
如果(可获得(本)){
Log.d(标签“语音识别服务可用…”);
语音识别器。惊人聆听(识别器意图);
}否则{
Toast.makeText(此“语音识别服务在您的设备上不可用…”,
吐司,长度(短)
.show();
}
}否则{
Askpermission();
}
打破
}
}
//检查智能手机上是否提供语音识别服务。。。
私有布尔值不可用(上下文){
返回SpeechRecognition.isRecognitionAvailable(上下文);
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
speechRecognizer.destroy();
}
//检查音频权限
私有布尔检查权限(){
返回ContextCompat.checkSelfPermission(这个,Manifest.permission.RECORD\u音频)==
PackageManager.PERMISSION_授予的许可;
}
//启动操作
私人无效操作(){
setRecognitionListener(新的RecognitionListener(){
@凌驾
ReadyForSpeech上的公共void(Bundle参数){
Log.d(标签“音频服务连接到服务器…”);
Log.d(标记“您现在可以开始您的演讲了…”);
}
@凌驾
开始时的公共无效fSpeech(){
Log.d(标记“用户已开始讲话…”);
}
@凌驾
在RMSCHANGED上的公共无效(浮动rmsdB){
}
@凌驾
已接收公共无效onBufferReceived(字节[]缓冲区){
}
@凌驾
公共无效onEndOfSpeech(){
Log.d(标记“用户已完成…演讲…”);
}
@凌驾
公共无效onError(内部错误){
Log.d(标记“onError:+错误);
开关(错误){
case SpeechRecognizer.ERROR\u音频:
Toast.makeText(MainActivity.this,“录制音频时出错…”,Toast
.LENGTH_SHORT).show();
打破
案例SpeechRecognizer.ERROR\u客户端:
妈妈
package android.example.com.conversion;

public class VowelUtil {

    protected static boolean isVowel(String strVowel) {
        // Log.logInfo("came in is_Vowel: Checking whether string is a Vowel");
        return strVowel.equals("a") || strVowel.equals("aa") || strVowel.equals("i") || strVowel.equals("ee") ||
                strVowel.equals("u") || strVowel.equals("oo") || strVowel.equals("ri") || strVowel.equals("lri") || strVowel.equals("e")
                || strVowel.equals("ai") || strVowel.equals("o") || strVowel.equals("au") || strVowel.equals("om");
    }

    protected static boolean isConsonant(String strConsonant) {
        // Log.logInfo("came in is_consonant: Checking whether string is a
        // consonant");
        return strConsonant.equals("k") || strConsonant.equals("kh") || strConsonant.equals("g")
                || strConsonant.equals("gh") || strConsonant.equals("ng") || strConsonant.equals("ch") || strConsonant.equals("chh") || strConsonant.equals("j")
                || strConsonant.equals("jh") || strConsonant.equals("ny") || strConsonant.equals("t") || strConsonant.equals("th") ||
                strConsonant.equals("d") || strConsonant.equals("dh") || strConsonant.equals("n") || strConsonant.equals("nn") || strConsonant.equals("p") ||
                strConsonant.equals("ph") || strConsonant.equals("b") || strConsonant.equals("bh") || strConsonant.equals("m") || strConsonant.equals("y") ||
                strConsonant.equals("r") || strConsonant.equals("rr") || strConsonant.equals("l") || strConsonant.equals("ll") || strConsonant.equals("lll") ||
                strConsonant.equals("v") || strConsonant.equals("sh") || strConsonant.equals("ss") || strConsonant.equals("s") || strConsonant.equals("h") ||
                strConsonant.equals("3") || strConsonant.equals("z") || strConsonant.equals("v") || strConsonant.equals("Ω") ||
                strConsonant.equals("κ") || strConsonant.equals("K") || strConsonant.equals("γ") || strConsonant.equals("ζ") || strConsonant.equals("φ") ||
                strConsonant.equals("δ") || strConsonant.equals("Δ") || strConsonant.equals("τ") || strConsonant.equals("θ") || strConsonant.equals("σ");
    }
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    //  Record Button
    AppCompatButton RecordBtn;

    //  TextView to show Original
    TextView Original;

    //  SpeechRecognizer Object...
    private SpeechRecognizer speechRecognizer;

    //  For TAG
    private String TAG = getClass().getName();

    //  RecognizerIntent
    private Intent recognizerIntent;

    //  Request Code for Permission
    private static final int REQUEST_CODE_RECORD_AUDIO = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Original = findViewById(R.id.Original_Text);
        RecordBtn = findViewById(R.id.RecordBtn);

        recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, R.string.record);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            recognizerIntent.putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, false);
        }

        //  For 30 Sec it will Record...
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 30);

        //  Use Hindi Speech Recognition Model...
        recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "hi-IN");

        speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);

        //  Permission Dialog
        Askpermission();

        RecordBtn.setOnClickListener(this);
    }

    private void Askpermission() {
        // No explanation needed; request the permission
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.RECORD_AUDIO},
                REQUEST_CODE_RECORD_AUDIO);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String permissions[], @NonNull int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_RECORD_AUDIO: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Operation();
                } else {
                    Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.RecordBtn:
                Log.d(TAG, "onClick: ");
                if (checkPermission()) {
                    if (IsAvailable(this)) {
                        Log.d(TAG, "Speech Recognition Service Available...");
                        speechRecognizer.startListening(recognizerIntent);
                    } else {
                        Toast.makeText(this, "Speech Recognition Service not Available on your device...",
                                Toast.LENGTH_SHORT)
                                .show();
                    }
                } else {
                    Askpermission();
                }
                break;
        }
    }

    //  Check if Speech recognition Service is Available on the Smartphone...
    private boolean IsAvailable(Context context) {
        return SpeechRecognizer.isRecognitionAvailable(context);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        speechRecognizer.destroy();
    }

    // Check Audio Permission
    private boolean checkPermission() {
        return ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) ==
                PackageManager.PERMISSION_GRANTED;
    }

    // Start Operation
    private void Operation() {
        speechRecognizer.setRecognitionListener(new RecognitionListener() {
            @Override
            public void onReadyForSpeech(Bundle params) {
                Log.d(TAG, "Audio Service is connected to Servers....");
                Log.d(TAG, "You can now start your speech...");
            }

            @Override
            public void onBeginningOfSpeech() {
                Log.d(TAG, "User has started speech...");
            }

            @Override
            public void onRmsChanged(float rmsdB) {

            }

            @Override
            public void onBufferReceived(byte[] buffer) {

            }

            @Override
            public void onEndOfSpeech() {
                Log.d(TAG, "User has Finished... speech...");
            }

            @Override
            public void onError(int error) {
                Log.d(TAG, "onError: " + error);
                switch (error){
                    case SpeechRecognizer.ERROR_AUDIO:
                        Toast.makeText(MainActivity.this, "Error Recording Audio...", Toast
                                .LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_CLIENT:
                        Toast.makeText(MainActivity.this, "Client Side Error...", Toast
                                .LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
                        Toast.makeText(MainActivity.this, "Insufficient permissions...", Toast
                                .LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_NETWORK:
                        Toast.makeText(MainActivity.this, "Network Related Error...", Toast
                                .LENGTH_SHORT).show();
                        break;

                    case SpeechRecognizer.ERROR_NO_MATCH:
                        Toast.makeText(MainActivity.this, "Please Installed Offline Hindi " +
                                "Language Data...", Toast.LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
                        Toast.makeText(MainActivity.this, "Recognition Busy...", Toast
                                .LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_SERVER:
                        Toast.makeText(MainActivity.this, "Please Installed Offline Hindi " +
                                "Language Data...", Toast
                                .LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
                        Toast.makeText(MainActivity.this, "Speech Timeout...", Toast
                                .LENGTH_SHORT).show();
                        break;
                    case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
                        Toast.makeText(MainActivity.this, "Network Timeout Error...", Toast
                                .LENGTH_SHORT).show();
                }
            }

            @Override
            public void onResults(Bundle results) {
                ArrayList<String> Results = results.getStringArrayList(SpeechRecognizer
                        .RESULTS_RECOGNITION);

                if (Results != null) {
                    Original.setText(Results.get(0));
                }
            }

            @Override
            public void onPartialResults(Bundle partialResults) {

            }

            @Override
            public void onEvent(int eventType, Bundle params) {

            }
        });
    }

}