Сохранение больших файлов с помощью TTS Android

Недавно я использовал Android TTS - я сохраняю файл в формате MP3 и воспроизводю его с помощью MediaPlayer, чтобы пользователи могли приостанавливать / возобновлять работу и т. д.

Все работает нормально, кроме случаев, когда у меня большой текст, он просто не работает.

Читал, что у android TTS лимит в 4000 CH? Что мне делать, чтобы обработать большой объем текста?

Ниже приведен код, который я использую для сохранения MP3.

Android.Speech.Tts.TextToSpeech textToSpeech;
...
textToSpeech = new Android.Speech.Tts.TextToSpeech(this, this, "com.google.android.tts");
...
textToSpeech.SynthesizeToFile(ReadableText, null, new Java.IO.File(System.IO.Path.Combine(documentsPath, ID + "_audio.mp3")), ID);

Ниже приведен код, который я использую для воспроизведения звука.

MediaPlayer MP = new MediaPlayer();
...
MP.SetDataSource(System.IO.Path.Combine(documentsPath, ID + "_audio.mp3"));
MP.Prepare();
MP.Start();

Это работает для небольшого количества текста, но не для большого текста.

Файл сохраняется (скорее всего, это просто поврежденный файл), потому что, когда я играю в него, я получаю следующую ошибку

setDataSoruceFD failed: status=0x80000000

Java Solution is also acceptable

К вашему сведению - вопрос о максимальном размере текста, поскольку я могу сгенерировать файл для меньшего текста.

Ваше здоровье

Похоже, это асинхронный режим, но имеет ли это значение в моем случае?

Ali 19.04.2018 15:06

Возможный дубликат Файл Android TextToSpeech.synthesizeToFile () не создается

mjwills 19.04.2018 15:07

Протестировано еще раз, да, времени достаточно для обработки текста, я играю после сохранения файла.

Ali 19.04.2018 15:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
205
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В Android ASOP (по крайней мере, начиная с API-18) для TextToSpeech.MaxSpeechInputLength установлено значение 4000.

Примечание: OEM-производители могут изменить это значение в своем образе ОС, поэтому было бы разумно проверить это значение и не делать никаких предположений.

Примечание: вы назначаете выход с расширением .mp3, но по умолчанию созданные файлы будут отформатированы в формате .wav, некоторые речевые движки поддерживают другие форматы / битрейт / и т. д. но вы передаете значение null для параметров.

Если вы не хотите правильно объединить несколько волновых файлов, я бы рекомендовал вам разбить текст на более мелкие части и синтезировать несколько файлов.

Затем вы можете воспроизвести их последовательно (используя событие завершения MediaPlayer | прослушиватель).

Большое спасибо за ваш ответ, вы правы, мне придется разделить текст на файлы меньшего размера, что касается передачи type как null и сохранения wav как MP3, не могли бы вы пояснить, что вы имеете в виду? Также мне нравится идея проверки значения, поскольку вы сказали, что OEM-производители могут изменить значение, но, учитывая, что 4000 - это минимум, для согласованности, что вы думаете, если я просто буду придерживаться одного размера для всех устройств.

Ali 19.04.2018 17:20

@aliusman stick with one size over all the devices Возможно, у вас все в порядке, или нет ;-)MaxSpeechInputLength был добавлен в API-18, чтобы разработчик мог проверить макс. длина доступна, лично Я бы использовал его на API18 + и предположил бы 4000 для более низких API, но в конце концов, выбор за вами ...

SushiHangover 19.04.2018 17:26

Спасибо, хотел бы пролить свет на Note: You are naming the output with an .mp3 extension, but by default the files created will be .wav formatted, some speech engines do support other formats/bitrate/etc. but you are passing null for the parameters., пожалуйста

Ali 20.04.2018 02:23

@aliusman Различные движки TTS поддерживают разные параметры, некоторые из которых вы можете передать в params для сгенерированного типа голоса, высоты тона, скорости, формата и т. д., которые будут сгенерированы. Они зависят от движка TTS, поэтому в каком-то документе Google Android нет их основного списка, вам нужно посмотреть на сам движок, чтобы определить, какие дополнительные функции поддерживаются (если есть). В основном вы используете HashMap (или Bundle в версии SynthesizeToFile API-21 +), чтобы установить идентификатор высказывания для прослушивателя асинхронного обратного вызова, чтобы знать, когда файл будет создан.

SushiHangover 20.04.2018 03:47

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