Итак, вы беспокоитесь о том, какой подпольно приобретенный механизм преобразования текста в речь пользователь может выбрать по умолчанию... предположительно потому, что вы не хотите, чтобы ваше приложение выглядело плохо из-за неизвестного/неизвестного механизма. плохое поведение. Понятно.
Однако (хороший) факт заключается в том, что поведение 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