Какие языки поддерживаются для распознавания речи
Что проверяют
Понимаете ли вы, что список языков задаёт не Android, а конкретный движок распознавания на устройстве или в облаке, и умеете ли узнать его в рантайме, а не зашить в код. Следом обычно спрашивают, как распознавать без интернета и что делать на устройстве, где системного сервиса нет.
Как отвечать
Стандартный путь это SpeechRecognizer из android.speech. Сам он ничего не распознаёт, а обращается к установленному RecognitionService. Язык передаётся через RecognizerIntent.EXTRA_LANGUAGE тегом BCP 47, например "ru-RU". Онлайн сервис обычно знает десятки языков и диалектов, офлайн только те, для которых скачаны модели.
- проверка наличия:
SpeechRecognizer.isRecognitionAvailable(context). С Android 11 нужен блок<queries>с интентомandroid.speech.RecognitionServiceв манифесте, иначе из-за видимости пакетов метод вернётfalse; - список языков: с Android 13 есть
checkRecognitionSupport(), он отдаётRecognitionSupportсо списками установленных, доступных для скачивания и онлайновых языков, аtriggerModelDownload()запускает загрузку модели. На старых версиях остаётся широковещательный запросACTION_GET_LANGUAGE_DETAILS, и его поддерживает не каждый сервис; - офлайн:
createOnDeviceSpeechRecognizer()с Android 12 и флагEXTRA_PREFER_OFFLINE; - разрешение и поток:
RECORD_AUDIOзапрашивается в рантайме, методыSpeechRecognizerвызываются с главного потока, объект освобождается черезdestroy().
Если сервиса нет или нужен предсказуемый набор языков, берут встроенные модели: Vosk поддерживает больше двадцати языков, включая русский, whisper.cpp работает с многоязычными моделями Whisper. Цена: вес приложения и нагрузка на процессор. Облачные API точнее, но требуют сети и стоят денег.
Где спотыкаются
Перечисляют языки из документации облачного сервиса. На телефоне набор другой, и ответ «зависит от движка, проверяю так» сильнее списка.
Не учитывают прошивки без GMS и без сервиса распознавания. Там isRecognitionAvailable возвращает false, и без запасного варианта функция пропадает.
Забывают про <queries> при таргете на Android 11 и выше и видят «распознавание недоступно» там, где оно есть.