Android Преобразование текста в речь воспроизводится без ошибок, но не воспроизводится звук

У меня есть приложение, которое воспроизводит текст в речь. Это работает хорошо, но у меня есть человек, который жалуется, что ничего не слышит на «Android 10 на Samsung Galaxy Note 10+ 5G». Из проделанных мной тестов кажется, что код выполняется без каких-либо ошибок и даже есть пауза, когда текст должен быть слышен, но звук не выходит. Что было проверено:

  1. Движок TTS - это Google, но он не работает ни на Google, ни на Samsung.
  2. В настройках TTS, когда вы нажимаете кнопку воспроизведения, вы можете услышать образец воспроизведения.
  3. Язык установлен на английский США

Код инициализации TTS:

private void initTTS() {
    Log.d(TAG, "initTTS: Enter");
    //assume the worst
    mTTSInit = false;

    //create a TTS and do not use it until you get a confirmation that the init process went well
    mTTS = new TextToSpeech(this, status -> {

        //OnInit of TTS is run on the main thread and so is VERY slow
        new Thread(() -> {
            if (status == TextToSpeech.SUCCESS) {
                //use English - not sure about other languages at the moment.
                mTTS.setSpeechRate(0.7f);
                mTTS.setPitch(1.1f);
                int result = mTTS.setLanguage(Locale.US);

                if (result == TextToSpeech.LANG_MISSING_DATA
                        || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                    Log.e("TTS", "Language not supported");

                    //notify the user that TTS will not work on this device
                    showToastOnUIThread(getResources().getString(R.string.TTS_missing_lang_error));
                } else {
                    Log.d(TAG, "onInit: SUCCESS");
                    //Init went fine.
                    //Set a listener when the TTS message finish as we sometime want
                    //to chime if a tile with a gem was produced.
                    mTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                        @Override
                        public void onStart(String utteranceId) {
                            showToastOnUIThread("About to play message - raising volume");
                            AudioManager am = (AudioManager) getSystemService(getApplicationContext().AUDIO_SERVICE);
                            am.setStreamVolume(AudioManager.STREAM_MUSIC,
                                    am.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
                                    0);
                        }

                        @Override
                        public void onDone(String utteranceId) {
                            Log.d(TAG, "onDone: TTS: " + utteranceId);
                            showToastOnUIThread("Message was: " + utteranceId);
                            playChimeSound();
                        }

                        @Override
                        public void onError(String utteranceId) {
                            Log.d(TAG, "onError: TTS error while trying to say: " + utteranceId);
                        }
                    });
                    mTTSInit = true;
                    runOnUiThread(() -> mTTSStatusButton.setVisibility(View.GONE));
                }
            } else {
                Log.e("TTS", "Initialization failed");
                //notify the user that TTS will not work on this device
                showToastOnUIThread(getResources().getString(R.string.TTS_missing_lang_error));
            }
        }).start();
    });
}

Код воспроизведения TTS:

if (readOutLoud && mTTSInit) {
        String text = getString(R.string.tile) + " " + mViewModel.getLastSelectedTile();

        //to get a call back from TTS we mst supply a KEY_PARAM_UTTERANCE_ID
        HashMap<String, String> ttsHashMap = new HashMap<>();
        ttsHashMap.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_NOTIFICATION));
        ttsHashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, text);
        ttsHashMap.put(TextToSpeech.Engine.KEY_PARAM_VOLUME, "1");
        mTTS.speak(text, TextToSpeech.QUEUE_FLUSH, ttsHashMap);
    }

ttsHashMap.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_NOTIFICATION)); <----- эта строка может быть вашей проблемой... но я просто предполагаю. Этот вопрос действительно не хватает деталей. Вы не описали, что именно вы тестировали и почему, например... что произойдет, если вы просто создадите «обычный» код примера tts и запустите его на этом проблемном устройстве? это работает? (вероятно), и если да, то в чем разница между этим голым кодом и вашим кодом?

Nerdy Bunz 15.12.2020 02:33

@NerdyBunz Да, похоже, это была моя проблема. Я просто удалил эту строку и позволил ОС решить, в какой поток выводить звук. Спасибо...

Itamar Kerbel 17.12.2020 07:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
793
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте удалить:

ttsHashMap.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_NOTIFICATION)); 

Другие вопросы по теме