Хороший синтез речи не требует GPU или облачной подписки. Естественный многоязычный голос может уместиться в чём-то, что вам было бы стыдно назвать сервером — в такой плате, которую вы держите в ящике «на всякий случай». В картошке.
phoonnx — это наш исследовательский фреймворк именно для этой цели: небольшие голоса на основе VITS, которые работают полностью офлайн, на CPU, на дешёвом оборудовании и которые мы также можем обучать сами с нуля.
Насколько маленький — это маленький?
Давайте поставим сюда реальное число вместо махания руками. Мы взяли продакшн-голос
phoonnx — баскский голос «Miro»
(OpenVoiceOS/phoonnx_eu-ES_miro_espeak) — прямо с Hugging Face и посчитали
веса в ONNX-графе:
import onnx, numpy as np
m = onnx.load("miro_eu-ES.onnx")
print(sum(int(np.prod(i.dims)) for i in m.graph.initializer))
# 15650459
~15,65 миллиона параметров. Это весь голос — энкодер, декодер, всё целиком — в файле 63 МБ. Женский голос «Dii» из того же релиза даёт точно такое же число, потому что они разделяют стандартную архитектуру phoonnx VITS; личность живёт в весах, а не в дополнительной ёмкости.
Для сравнения: один слой «маленькой» современной языковой модели может нести больше параметров, чем весь этот синтезатор речи, и он всё равно бегло говорит.
Почему VITS и почему ONNX
VITS — это основа каждого голоса phoonnx. Это сквозная архитектура — на входе текст (точнее, фонемы), на выходе форма волны — без отдельного вокодера, за которым нужно присматривать, и без авторегрессионного цикла, ползущего по одному сэмплу за раз. Именно этот сквозной дизайн и делает её посильной на картошке: один прямой проход, параллельный синтез, готово.
Мы не доставляем PyTorch на край сети. Обученные голоса экспортируются в ONNX и работают
через onnxruntime на CPU — без CUDA, без GPU, без
рулетки драйверов. onnxruntime — это компактный портируемый движок на C++, а граф на 15 миллионов
параметров вполне вписывается в то, что ядро класса Raspberry Pi пережёвывает быстрее
реального времени. Результат — голосовой ассистент, который продолжает говорить, когда ваш интернет
лежит, когда у облачного провайдера сбой или когда вы просто никогда и не хотели, чтобы ваше
домашнее аудио покидало дом.
Ум прячется в фонемах
Крошечная акустическая модель может позволить себе быть крошечной, потому что phoonnx выполняет тяжёлую лингвистическую работу заранее, в фонемизаторе. Фонемизатор (графема-в-фонему, или G2P) преобразует письменный текст в последовательность звуковых единиц, которые модель на самом деле произносит — так что сети VITS никогда не приходится учить орфографию, только звук.
Наша работа с фонемами опирается на графему-в-IPA для 350+ языков и классическую португальскую фонетику, которые позволяют обучать голоса для малоресурсных языков без недель экспертной разметки.
phoonnx намеренно не зависит от фонемизатора и поставляет с собой их небольшую армию:
espeak-ng, gruut,
epitran,
misaki,
transphone (который дотягивается до тысяч
языков, каталогизированных в Glottolog), плюс специалисты вроде
mantoq для арабского,
cotovia для галисийского, OpenJTalk для
японского и KoG2P для корейского. Они выдают IPA, ARPA, Pinyin, Hangul, Buckwalter —
что бы ни требовалось языку. Есть даже многоязычный G2P на основе модели, построенный на
ByT5, экспортированный в ONNX, как и всё остальное.
Перекладывание орфографии на фонемизатор — это тот трюк, который позволяет модели на 15 миллионов параметров хорошо звучать на малоресурсном языке, письменную форму которого она никогда не видела.
Фреймворк для создания голосов, а не только их запуска
phoonnx — не
только инструментарий инференса. Сопутствующий фреймворк
phoonnx_train — это то, как мы делаем
голоса в первую очередь.
phoonnx_train покрывает весь конвейер:
- Предобработка датасета в стиле LJSpeech в фонемизированные обучающие данные.
- Обучение генератора VITS (те самые ~15,65 млн параметров) на одной потребительской или среднего класса GPU — модель такого размера не требует обучающего кластера.
- Экспорт готового чекпоинта в ONNX одним скриптом, готовым к прямой встройке
в
onnxruntimeна устройстве.
Поскольку рецепт открыт, а модели маленькие, создание совершенно нового голоса для языка, у которого нет открытого офлайн-варианта, — это проект масштаба выходных, а не масштаба исследовательского гранта. Именно так мы и заполняем пробелы для недостаточно обслуживаемых языков — баскского, мирандского, европейского португальского и других — вместо того чтобы ждать, пока вендор решит, что язык коммерчески интересен.
Уже подключено к вашему ассистенту
Вам не нужно склеивать всё это вручную. phoonnx поставляет нативный
плагин OpenVoiceOS, ovos-tts-plugin-phoonnx, который получает и загружает голоса за вас:
"tts": {
"module": "ovos-tts-plugin-phoonnx",
"ovos-tts-plugin-phoonnx": {
"voice": "OpenVoiceOS/phoonnx_pt-PT_miro_tugaphone"
}
}
Оставьте voice пустым, и он выберет первую модель, совпадающую с вашим языком. Для
управления голосами вне ассистента есть CLI phoonnx-voices, чтобы перечислять
языки, просматривать голоса и предварительно скачивать модели:
phoonnx-voices list-voices --lang pt-PT
phoonnx-voices download OpenVoiceOS/phoonnx_pt-PT_miro_tugaphone
А поскольку phoonnx говорит на простом VITS-поверх-ONNX, его движок инференса также запускает голоса, обученные Piper, Mimic3, Coqui и MMS — более тысячи языков и голосов в общей сложности. Один небольшой рантайм, огромный каталог, и ничто из этого не звонит домой.
В чём суть
Голосовая технология, которая вас уважает, должна работать там, где вы есть — на вашем оборудовании, под вашим контролем, с выдернутым сетевым кабелем, если хотите. phoonnx — это наша ставка на то, что путь к этому — не в более крупных моделях, а в правильной архитектуре, сделанной маленькой: VITS для основы, умные фонемизаторы, чтобы нести лингвистическую нагрузку, ONNX для портируемости и открытый фреймворк обучения, чтобы каждый мог растить каталог.
Пятнадцать с половиной миллионов параметров, работающих на CPU, обученных на оборудовании, которое может позволить себе каждый: вот конвейер обучения, стоящий за каждым голосом phoonnx.