Использование TTS на Android: пунктуация читается вслух

КОНТЕКСТ: Мое приложение отправляет предложения в любой механизм TTS, который есть у пользователя. Предложения создаются пользователями и могут содержать знаки препинания.

ПРОБЛЕМА: некоторые пользователи сообщают, что пунктуация читается вслух (TTS говорит «запятая» и т. д.) на SVOX, Loquendo и, возможно, других.

ВОПРОС:

  1. Должен ли я убрать все знаки препинания?
  2. Должен ли я преобразовывать пунктуацию с помощью этого типа API?
  3. Должен ли я позволить механизму TTS обрабатывать пунктуацию?

Тот же пользователь, который видит проблему с Loquendo, не имеет этой проблемы с другим Android-приложением под названием FBReader. Так что я думаю, что 3-й вариант не подходит.


person Nicolas Raoul    schedule 20.12.2011    source источник


Ответы (2)


У меня была такая же проблема с одним из моих приложений.

Входная строка была:

Next alarm in 10 minutes,it will be 2:45 pm

и двигатель TTS сказал бы:

Next alarm in 10 minutes comma it will be 2:45 pm.

Проблема решилась просто добавлением пробела после запятой вот так:

Next alarm in 10 minutes, it will be 2:45 pm

Это глупая ошибка, и, возможно, ваша проблема сложнее, но у меня это сработало. :)

person Timothée Jeannin    schedule 12.10.2012
comment
Это может работать для запятых, но у меня все еще проблема с восклицательными знаками. Что еще хуже, TTS в некоторых версиях Android читает знаки препинания, а TTS в более новых версиях не читает их. - person Tin Man; 15.09.2018
comment
О, и проблема с заменой знаков препинания пробелом заключается в том, что отдельные предложения или части предложения читаются как одно длинное предложение. - person Tin Man; 23.09.2018

Итак, вы беспокоитесь о том, какой подпольно приобретенный механизм преобразования текста в речь пользователь может выбрать по умолчанию... предположительно потому, что вы не хотите, чтобы ваше приложение выглядело плохо из-за неизвестного/неизвестного механизма. плохое поведение. Понятно.

Однако (хороший) факт заключается в том, что поведение TTS на самом деле не является вашей ответственностью, если только вы не решите встроить движок в само приложение (Сложность: Сложно, Рекомендуется? Нет).

Предполагается, что движки должны придерживаться правил и поведения Android, описанных здесь... и предполагается, что они предоставляют собственный достаточный набор параметров конфигурации в системных настройках Android (home\settings\language&locale\TTS), которые могут включать или не включать параметры произношения. Пользователь также должен считаться достаточно умным, чтобы установить двигатель, который его устраивает.

Это скользкий путь — браться за работу по прогнозированию и «исправлению» неизвестного и нежелательного поведения движка (по крайней мере, в движках, которые вы не тестировали сами).

ПРОСТОЙ И ХОРОШИЙ ВАРИАНТ (Сложность: Легко):

  • Сделайте настройку в своем приложении: «игнорировать знаки препинания».

ЛУЧШИЙ ВАРИАНТ (Сложность: Средняя):

  • Выполните описанное выше, но покажите параметр настройки «игнорировать знаки препинания» только в том случае, если механизм, который вы обнаружили на устройстве пользователя, подвержен этой проблеме.

Кроме того, следует отметить, что существует множество различий между движками (используют ли они встроенные голоса или онлайн, время отклика, время инициализации, надежность/приверженность спецификациям Android, поведение на разных уровнях Android API, поведение в собственной истории версий). , качество голоса, не говоря уже о языковых возможностях)... различия, которые могут быть даже более важными для пользователей, чем наличие знаков препинания.

Вы говорите: «Мое приложение отправляет предложения в любой механизм TTS, который есть у пользователя». Ну... "Это твоя проблема". Почему бы не дать пользователю выбор, какой движок использовать?

И приводит нас к...

ЕЩЕ ЛУЧШИЙ ВАРИАНТ (Сложность: Трудно и хорошо! [по моему скромному мнению]):

  • Определитесь с некоторыми «заведомо хорошими» движками, которые будет «поддерживать» ваше приложение, начиная с Google и Samsung. Я предполагаю, что в наши дни менее 5% устройств не имеют ни одного из этих движков.
  • Изучите и протестируйте эти движки как можно больше на всех уровнях Android API, которые вы планируете поддерживать... по крайней мере, в отношении того, произносят ли они знаки препинания или нет.
  • Со временем тестируйте больше движков, если хотите, и добавляйте их к поддерживаемым движкам в последующих обновлениях приложения.
  • Запустите алгоритм при запуске вашего приложения, который определяет, какие движки установлены, а затем используйте эту информацию для своего собственного списка поддерживаемых движков:

private ArrayList<String> whatEnginesAreInstalled(Context context) {
    final Intent ttsIntent = new Intent();
    ttsIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    final PackageManager pm = context.getPackageManager();
    final List<ResolveInfo> list = pm.queryIntentActivities(ttsIntent, PackageManager.GET_META_DATA);
    ArrayList<String> installedEngineNames = new ArrayList<>();
    for (ResolveInfo r : list) {
        String engineName = r.activityInfo.applicationInfo.packageName;
        installedEngineNames.add(engineName);

        // just logging the version number out of interest
        String version = "null";
        try {
            version = pm.getPackageInfo(engineName,
            PackageManager.GET_META_DATA).versionName;
            } catch (Exception e) {
                Log.i("XXX", "try catch error");
            }
        Log.i("XXX", "we found an engine: " + engineName);
        Log.i("XXX", "version: " + version);
    }
    return installedEngineNames;
}

  • В настройках вашего приложения укажите все движки, которые вы решили поддерживать, как опции (даже если они в данный момент не установлены). Это может быть простая группа RadioButtons с заголовками, соответствующими названиям разных движков. Если пользователь выбирает тот, который не установлен, уведомите его об этом и дайте ему возможность установить его с намерением.
  • Сохраните выбранное пользователем имя механизма (String) в SharedPreferences и используйте его выбор в качестве последнего аргумента конструктора TextToSpeech каждый раз, когда вам понадобится TTS в вашем приложении.
  • Если у пользователя установлен какой-то странный движок, представьте его также как выбор, даже если он неизвестен/не поддерживается, но сообщите им, что они выбрали неизвестный/непроверенный движок.
  • Если пользователь выбирает движок, который поддерживается, но, как известно, произносит знаки препинания (плохо), то при выборе этого движка появляется всплывающее диалоговое окно с предупреждением пользователя об этом, объясняя, что они могут отключить это плохое поведение с помощью « игнорировать пунктуацию», о которой уже упоминалось.

ПРИМЕЧАНИЯ:

  • Не позволяйте движку SVOX/PICO (эмулятор) слишком вас беспокоить — у него много недостатков, и он даже не предназначен и не гарантируется для работы на Android выше API ~20, но все еще включен в образы эмуляторов до API ~24. , что приводит к «непредсказуемым результатам», которые на самом деле не отражают реальность. Я еще не видел этот движок ни на одном реальном аппаратном устройстве, сделанном в течение последних семи лет или около того.

  • Поскольку вы говорите, что «предложения генерируются пользователями», меня больше беспокоит решение проблемы того, на каком языке они будут печатать! Я поищу вопрос по этому поводу! :)

person Nerdy Bunz    schedule 16.09.2018
comment
Большое спасибо за ваш ответ! К сожалению, возникла путаница в отношении льготного периода, который у меня был для предоставления награды, и я пропустил его - мне жаль из-за этого, так как я полагаю, что на написание вашего ответа ушло довольно много времени: / В любом случае, большое спасибо много за помощь - person Tin Man; 29.09.2018