第一次在RecognitionLIstener Android中调用onRmsChanged后未调用

第一次在RecognitionLIstener Android中调用onRmsChanged后未调用,android,speech-recognition,speech-to-text,Android,Speech Recognition,Speech To Text,我正在开发一个需要tts的应用程序。我已经实现了RecognitionListener,它第一次就工作得很好。之后,它仍然侦听并返回结果,但不再调用onRmsChanged 以下是我启动语音识别的方法: private void promptSpeechInput(String langCode) { Intent speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); speechIntent.p

我正在开发一个需要tts的应用程序。我已经实现了RecognitionListener,它第一次就工作得很好。之后,它仍然侦听并返回结果,但不再调用onRmsChanged

以下是我启动语音识别的方法:

private void promptSpeechInput(String langCode) {
    Intent speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    speechIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
            mContext.getPackageName());
    speechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,
            langCode);
    speechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

    mIsSpeechRecognitionOn = true;
    mSpeechRecognizer.startListening(speechIntent);
}
以及实现RecognitionListener的我的类:

public class ConversationFragment extends Fragment implements RecognitionListener {

private final String LOG_TAG = ConversationFragment.class.getSimpleName();
private static final int PERMISSION_REQUEST_RECORD_AUDIO = 1;

private Translator mTranslator;

private SpeechRecognizer mSpeechRecognizer;
private TextToSpeech mTextToSpeech;
private View mRootView;
private TranslationPanel mTranslationPanel;
private RecyclerView mConversationView;
private TextView mEmptyConversationView;

private ChatAdapter mConversationAdapter;
private Set<Locale> mLocales;

public ConversationFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                         Bundle savedInstanceState) {
    mRootView = inflater.inflate(R.layout.fragment_conversation, container, false);
    mTranslator = new Translator(getContext());
    setupSpeechRecognizer();
    mTranslationPanel = new TranslationPanel(getContext(), mRootView, mSpeechRecognizer);

    mTextToSpeech = new TextToSpeech(getContext(), new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                mLocales = mTextToSpeech.getAvailableLanguages();
            }

            mConversationAdapter.setTextToSpeech(mTextToSpeech);
        }
    });

    mEmptyConversationView = (TextView) mRootView.findViewById(R.id.empty_conversation_textview);
    mConversationView = (RecyclerView) mRootView.findViewById(R.id.conversation_container);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
    ((LinearLayoutManager) layoutManager).setStackFromEnd(true);

    mConversationView.setLayoutManager(layoutManager);

    List<Translation> translations = Translation.listAll(Translation.class);
    mConversationAdapter = new ChatAdapter(getContext(), translations);
    mConversationView.setAdapter(mConversationAdapter);
    mConversationView.scrollToPosition(mConversationAdapter.getItemCount() - 1);

    if (translations == null || translations.size() == 0) {
        mConversationView.setVisibility(View.GONE);
        mEmptyConversationView.setVisibility(View.VISIBLE);
    }

    checkMicrophonePermission();

    return mRootView;
}

public void checkMicrophonePermission() {
    int microphonePermission =
            ContextCompat.checkSelfPermission(getContext(), android.Manifest.permission.RECORD_AUDIO);
    if (microphonePermission != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(getActivity(),
                new String[]{android.Manifest.permission.RECORD_AUDIO},
                PERMISSION_REQUEST_RECORD_AUDIO);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_RECORD_AUDIO:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                mTranslationPanel.getLeftTranslator().setEnabled(true);
                mTranslationPanel.getRightTranslator().setEnabled(true);
            } else {
                mTranslationPanel.getLeftTranslator().setEnabled(false);
                mTranslationPanel.getRightTranslator().setEnabled(false);
            }
    }
}


private void setupSpeechRecognizer() {
    mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(getContext());
    mSpeechRecognizer.setRecognitionListener(this);
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mTextToSpeech != null) {
        mTextToSpeech.shutdown();
    }
    if (mSpeechRecognizer != null) {
        mSpeechRecognizer.destroy();
    }
}

private void translate(final String text) {
    String leftLanguageCode = Utility.getCodeFromLanguage(getContext(),
            Utility.getTranslatorLanguage(getContext(), Utility.LEFT_TRANSLATOR_LANGUAGE));
    String rightLanguageCode = Utility.getCodeFromLanguage(getContext(),
            Utility.getTranslatorLanguage(getContext(), Utility.RIGHT_TRANSLATOR_LANGUAGE));

    Callback<TranslationResult> callback = new Callback<TranslationResult>() {
        @Override
        public void onResponse(Call<TranslationResult> call, Response<TranslationResult> response) {
            final TranslationResult translation = response.body();
            final String lang = translation.getLang();

            String translatedText = translation.getText()[0];

            Translation chatTranslation = mTranslationPanel.hasJustUsedLeftTranslator() ?
                    new Translation(translatedText, text, true, lang) :
                    new Translation(translatedText, text, false, lang);

            if (mConversationView.getVisibility() == View.GONE) {
                mConversationView.setVisibility(View.VISIBLE);
                mEmptyConversationView.setVisibility(View.GONE);
            }

            mConversationAdapter.addTranslation(chatTranslation);

            chatTranslation.save();

            if (mConversationAdapter.getItemCount() > 0) {
                mConversationView.scrollToPosition(mConversationAdapter.getItemCount() - 1);
            }

            speakText(translatedText, lang);

        }

        @Override
        public void onFailure(Call<TranslationResult> call, Throwable t) {
            Log.e(LOG_TAG, "Something went wrong.");
        }
    };

    if (mTranslationPanel.hasJustUsedLeftTranslator()) {
        mTranslator.translate(text, leftLanguageCode + "-" + rightLanguageCode, callback);
    } else {
        mTranslator.translate(text, rightLanguageCode + "-" + leftLanguageCode, callback);
    }
}

private void speakText(String text, String language) {
    if (mTextToSpeech == null || mTextToSpeech.isSpeaking() || mLocales == null) {
        return;
    }

    String langCode = Utility.getTranslatedLanguage(language);

    if (langCode.equals(getString(R.string.lang_code_bg))) {
        langCode = getString(R.string.lang_code_ru);
        text = Utility.editBulgarianTextForRussianReading(text);
    }

    Locale locale = Utility.getLocaleFromLangCode(langCode, mLocales);
    if (locale == null) {
        Log.d(LOG_TAG, "Language not supported by TextToSpeech.");
        return;
    }

    mTextToSpeech.setLanguage(locale);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        mTextToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null, null);
    } else {
        mTextToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null);
    }
}

@Override
public void onReadyForSpeech(Bundle params) {
    Log.d(LOG_TAG, "onReadyforSpeach");
}

@Override
public void onBeginningOfSpeech() {
    mTranslationPanel.setAnimationOn(true);
    Log.d(LOG_TAG, "onBeginningOfSpeach");
}

@Override
public void onRmsChanged(float rmsdB) {
    mTranslationPanel.onRmsChanged(rmsdB);
    Log.d(LOG_TAG, "onRmsChanged");
}

@Override
public void onBufferReceived(byte[] buffer) {
    Log.d(LOG_TAG, "onBufferReceived");
}

@Override
public void onEndOfSpeech() {
    mTranslationPanel.setAnimationOn(false);
    Log.d(LOG_TAG, "onEndOfSpeach");
}

@Override
public void onError(int error) {
    String errorMessage = getErrorText(error);
    Log.d(LOG_TAG, "FAILED " + errorMessage);
    mTranslationPanel.setAnimationOn(false);
}

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

    String text = null;
    if (matches != null) {
        text = matches.get(0);
    }
    Log.d(LOG_TAG, text);

    translate(text);
}

@Override
public void onPartialResults(Bundle partialResults) {
    Log.d(LOG_TAG, "onPartialResults");
}

@Override
public void onEvent(int eventType, Bundle params) {
    Log.d(LOG_TAG, "onEvent");
}

public static String getErrorText(int errorCode) {
    String message;
    switch (errorCode) {
        case SpeechRecognizer.ERROR_AUDIO:
            message = "Audio recording error";
            break;
        case SpeechRecognizer.ERROR_CLIENT:
            message = "Client side error";
            break;
        case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
            message = "Insufficient permissions";
            break;
        case SpeechRecognizer.ERROR_NETWORK:
            message = "Network error";
            break;
        case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
            message = "Network timeout";
            break;
        case SpeechRecognizer.ERROR_NO_MATCH:
            message = "No match";
            break;
        case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
            message = "RecognitionService busy";
            break;
        case SpeechRecognizer.ERROR_SERVER:
            message = "error from server";
            break;
        case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
            message = "No speech input";
            break;
        default:
            message = "Didn't understand, please try again.";
            break;
    }
    return message;
}
公共类ConversationFragment扩展了片段实现了RecognitionListener{
私有最终字符串LOG_TAG=ConversationFragment.class.getSimpleName();
私有静态最终整数权限\请求\记录\音频=1;
私人翻译人员;
私人语音识别器;
私有TextToSpeech mTextToSpeech;
私人视图mRootView;
私人翻译小组MTTranslationPanel;
private RecyclerView McConversationView;
私有文本视图mEmptyConversationView;
专用聊天适配器mConversationAdapter;
私人设置多址;
公共会话片段(){
}
@凌驾
创建视图上的公共视图(布局、充气机、最终视图组容器、,
Bundle savedInstanceState){
mRootView=充气机。充气(R.layout.fragment\u对话,容器,false);
mTranslator=新转换器(getContext());
setupSpeechRecognizer();
MTTranslationPanel=新的TranslationPanel(getContext(),mRootView,mSpeechRecognizer);
mTextToSpeech=new TextToSpeech(getContext(),new TextToSpeech.OnInitListener()){
@凌驾
公共无效onInit(int状态){
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.LOLLIPOP){
mLocales=mTextToSpeech.getAvailableLanguages();
}
mConversationAdapter.setTextToSpeech(mTextToSpeech);
}
});
mEmptyConversationView=(TextView)mRootView.findViewById(R.id.empty\u conversation\u TextView);
mConversationView=(RecyclerView)mRootView.findViewById(R.id.conversation_容器);
RecyclerView.LayoutManager LayoutManager=新的LinearLayoutManager(getContext());
((LinearLayoutManager)layoutManager)。setStackFromEnd(true);
mConversationView.setLayoutManager(layoutManager);
列表翻译=Translation.listAll(Translation.class);
mConversationAdapter=newchatadapter(getContext(),translations);
setAdapter(mConversationAdapter);
mConversationView.scrollToPosition(mConversationAdapter.getItemCount()-1);
if(translations==null | | translations.size()==0){
mConversationView.setVisibility(View.GONE);
mEmptyConversationView.setVisibility(View.VISIBLE);
}
检查麦克风权限();
返回mRootView;
}
公共无效检查麦克风权限(){
int麦克风许可=
ContextCompat.checkSelfPermission(getContext(),android.Manifest.permission.RECORD_AUDIO);
if(麦克风权限!=已授予PackageManager.PERMISSION){
ActivityCompat.requestPermissions(getActivity(),
新字符串[]{android.Manifest.permission.RECORD_AUDIO},
许可、请求、记录、音频);
}
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,@NonNull字符串[]权限,
@非空int[]grantResults){
开关(请求代码){
案例许可\请求\记录\音频:
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION\u已授予){
MTTranslationPanel.getLeftTranslator().setEnabled(true);
MTTranslationPanel.getRightTranslator().setEnabled(true);
}否则{
MTTranslationPanel.getLeftTranslator().setEnabled(false);
MTTranslationPanel.getRightTranslator().setEnabled(false);
}
}
}
专用void setupSpeechRecognizer(){
mSpeechRecognizer=SpeechRecognizer.createSpeechRecognizer(getContext());
mSpeechRecognizer.setRecognitionListener(此);
}
@凌驾
公共空间{
super.ondestory();
if(mTextToSpeech!=null){
mTextToSpeech.shutdown();
}
if(mSpeechRecognizer!=null){
mSpeechRecognizer.destroy();
}
}
专用void translate(最终字符串文本){
String leftLanguageCode=Utility.getCodeFromLanguage(getContext(),
getTranslatorLanguage(getContext(),Utility.LEFT_TRANSLATOR_LANGUAGE));
String rightLanguageCode=Utility.getCodeFromLanguage(getContext(),
getTranslatorLanguage(getContext(),Utility.RIGHT_TRANSLATOR_LANGUAGE));
Callback Callback=new Callback(){
@凌驾
公共void onResponse(调用、响应){
最终翻译结果翻译=response.body();
最后一个字符串lang=translation.getLang();
字符串translatedText=translation.getText()[0];
Translation chatTranslation=MTTranslationPanel.hasJustUsedLeftTranslator()?
新翻译(translatedText、text、true、lang):
新翻译(翻译文本、文本、假、朗);
if(mConversationView.getVisibility()==View.GONE){
mConversationView.setVisibility(View.VISIBLE);
mEmptyConversationView.setVisibility(View.GONE);
}
mConversationAdapter.addTranslation(chatTranslation);
save();
如果(mConversationAdapter.getItemCount()>0){
mConversationView.scrollToPosition(mConversationAdapter.getItemCount()-1);
}
speakText(translatedText,lang);
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Log.e(Log_标签,“出错了”);
}
};
if(mtTranslationPanel.hasJustUsedLeftTranslator()){
translate(文本,leftLanguageCode+“-”+rightLanguageCode,回调);
}否则{
mTranslator.translate(文本,右语言代码+“-”+左语言代码,回调)
public void onResults(Bundle results)
    {
        ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
        mText.setText("results: "+data.get(0));
        sr.startListening(intent);
        sr.cancel();
    }