Все статьи

· Casimiro Ferreira· 4 мин чтения

Произнести правильно: разрешение португальских гетерофонов для TTS

  • Datasets
  • Portuguese
  • TTS
  • Grapheme-to-Phoneme
  • NLP
  • Accessibility
  • FOSS

Произнести правильно: разрешение португальских гетерофонов для 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+ языков — маленькие детерминированные части, которые заставляют голос произносить язык так, как его действительно произносят носители.