Произнести правильно: разрешение португальских гетерофонов для TTS
Когда голос синтеза речи читает «Tenho sede», португальский слушатель ожидает услышать жажду. Но то же самое написание, sede, может также означать штаб-квартиру — и эти два слова произносятся с разными гласными. Скажите с неправильной гласной, и голос не просто звучит неверно; он вслух произносит другое слово. Для того, кто полагается на TTS, чтобы читать ему экран, это граница между внятным и запутанным.
Это проблема фронт-энда — стадии графема-в-фонему, которая решает, в какие звуки отображается слово, задолго до того, как какой-либо нейронный вокодер превратит эти звуки в аудио. Никакое качество вокодера этого не исправит. Если фронт-энд выбирает неправильное произношение, голос чётко артикулирует неправильное слово.
Гетерофонные омографы: одно написание, разный звук, разное значение
Европейский португальский полон слов, пишущихся идентично, но произносящихся с разным качеством гласной — открытой гласной против закрытой — где правильный выбор зависит от значения, а не только от грамматики. Несколько примеров:
sede— жажда (закрытая e,ˈsedɨ) против штаб-квартиры/резиденции (открытая e,ˈsɛdɨ). Оба — существительные.forma— форма для выпечки (закрытая o,ˈfoɾmɐ, пишется fôrma) против формы / способа (открытая o,ˈfɔɾmɐ).molho— соус (закрытая o) против связки (открытая o).corte— королевский двор (закрытая o) против разреза (открытая o).
Наивная система TTS фиксируется на одном произношении на написание. Так что она читает жажду с гласной штаб-квартиры — каждый раз — и слушатель слышит неправильное слово.
Почему «просто разметьте часть речи» не работает
Очевидное решение — прогнать теггер частей речи (POS) по предложению и выбрать произношение по POS. Это помогает для некоторых пар, но проваливается по построению всякий раз, когда два значения разделяют одну часть речи.
Возьмём снова sede. Жажда и штаб-квартира — оба существительные. POS-теггер размечает их идентично — нет грамматического сигнала, чтобы их различить — так что он может лишь угадывать более частое прочтение. Мы измерили именно это: на нашем тестовом наборе и spaCy, и Stanza дают 0% на значении жажда слова sede. Они всегда выбирают штаб-квартиру. Тот же структурный потолок проявляется на corte (разрез против двора), forma (форма против облика) и molho (соус против связки): когда значение расщепляется внутри одной части речи, грамматика этого не видит.
Датасет: разметка значения, а не грамматики
Поэтому мы построили открытый датасет, который размечает то, что действительно важно — значение. bifonia-pt-homographs — это 56 891 предложение европейского португальского, охватывающее 27 гетерофонных омографов. Каждое предложение размечено словом, его значением (смыслом), его частью речи, его произношением в IPA и формой с восстановленными диакритиками (например, sêde против séde), которая делает предполагаемое прочтение однозначным на странице.
Ключ корзины — значение, в этом весь смысл. Одна запись выглядит так:
{
"word": "sede",
"sense": "thirst",
"pos": "NOUN",
"ipa": "ˈsedɨ",
"sentence": "Depois da corrida tinha tanta sede que bebi um litro de água."
}
Произношения были сверены со словарём infopédia (Porto Editora), а не угаданы, и разбиения train/test стратифицированы по (word, meaning), так что нисходящая модель — скажем, BiLSTM — видит каждое значение в обеих половинах. Он опубликован на Hugging Face как TigreGotico/bifonia-pt-homographs.
Насколько хорошо это решается?
С данными, размеченными по значению, мы смогли измерить, насколько хорошо разные подходы выбирают правильное значение — а значит, и правильное произношение:
| Подход | Точность |
|---|---|
| Всегда угадывать самое частое значение | ≈53% |
| spaCy POS → значение | ≈66% |
| Stanza POS → значение | ≈75% |
bifonia резолвер правил + значений | ≈94% |
Подходы на основе POS застревают ровно там, где и ожидаешь: они могут маршрутизировать по грамматике, но никогда по значению, так что расщепления внутри существительных недостижимы. Наш резолвер — библиотека bifonia, лёгкая и полностью без зависимостей — достигает ≈94% и, что критически важно, попадает в 100% на случае sede/жажда, на котором POS-теггеры дают 0%.
Главное — не только число. А то, что маленький, быстрый, полностью открытый компонент побеждает тяжеловесные нейронные POS-теггеры в этой задаче — потому что он разрешает значение, а не только грамматику. Без GPU, без скачивания модели, без сетевого вызова.
Почему это важно
Правильное произношение — фундаментально, а не косметично. Программы чтения с экрана и голосовые ассистенты — это то, как слепые и работающие только на слух пользователи читают мир, а фронт-энд, неправильно произносящий распространённые слова, тихо ухудшает каждое предложение, которого касается. Исправление разрешения гетерофонов в источнике означает, что голос произносит то, что означает текст.
Поскольку датасет открыт, а резолвер крошечный и форкаемый, любой, кто строит португальский фронт-энд TTS, может сделать это правильно без гигантской модели — и тот же подход чисто переносится на родственный язык вроде галисийского, где различие открытых/закрытых гласных создаёт ту же ловушку. Размеченные данные также выполняют двойную функцию: это именно то, что нужно для обучения компактных статистических моделей, вроде пословного классификатора, для команд, у которых есть корпус и которые хотят обученный резолвер рядом с основанным на правилах.
Попробуйте
Датасет находится на Hugging Face по адресу TigreGotico/bifonia-pt-homographs, а резолвер живёт на bifonia. Он встраивается в более широкую работу по португальской фонетике, стоящую за классическим NLP для португальского и стеком графема-в-IPA для 350+ языков — маленькие детерминированные части, которые заставляют голос произносить язык так, как его действительно произносят носители.