Pull to refresh

Comments 62

PinnedPinned comments

Добавили в v5_1_ru микрофикс, когда вокруг \n нет нужных пробелов.

Длинную паузу делать не стали, это решается через SSML (и тут всем не угодить по её длине), сделали просто, чтобы слова не слипались.

но тут пока создадим иллюзию тайны

уже заждался ))

А с числами в тексте что-то планируете делать? Сейчас приходится свои обёртки писать для преобразования в текст

Оно вечно на будущее откладывается в пользу прикладных проектов, а у заказчиков как правило свои костыли. Как это сделать в принципе понятно, но чтобы нормально работало, там совсем какие-то огромные оценки по человеко-часам на это всё.

Число в текст, с учетом спряжений и склонений, количественной и порядковой формы, дело нескольких чел*часов. Правда я использовал PyMorphy.

Осталось выбрать из корпуса числа с контекстом (±1-2 слова), сгруппировать, разметить форму и обучить сетку. Которая потом и будет эту форму указывать дискретному конвертеру. Тут пока даже предварительных оценок нет. Но таки думаю, что не огромные, а просто большие.

Это всего лишь один из сотен юзкейсов.

Это вы про время, дату, температуру, координаты и римские цифры? Ну да, есть такая буква. И все они сводятся к уже описанному, согласовать слово с числом и число со словом. Остальные юзкейсы либо исчезающие, либо не детектируемые.

Если бы задача была такой тривиальной, то давно были бы многочисленные публичные качественные решения с качеством 99%.

День добрый. Есть ли в планах выкатить возможность обучения стороннего голосового профиля?

Если под профилем имеется в виду создание своего голоса, то таких планов пока нет.

понял, благодарю.

А какие вы используете инструменты для русской нормализации?

На данный момент почти не используем, но были простейшие самописные когда-то, когда надо было

Не понятно как Silero использовать через Speech API как RHVoice.
Поэтому сделал себе сервер http с Silero на Python для использования из других языков,
например Delphi и для преобразования текста из файла в wav.
Если интересует могу записать куда-нибудь. Там 10 кб.

Да, пожалуйста, было бы интересно.

Покрутил "ручки", послушал демки — проект достойный. В первую очередь оцениваю с точки зрения приватного озвучивания книг, не особо напрягаясь вопросом лицензионной чистоты. Больше всего радует стабильность и (автоматизируемая) управляемость. Этой пары больше никто не предоставляет. А вот качество... еще один проект среди достойных, плюс-минус. Во главу угла была поставлена скорость и этот результат был достигнут. На CPU cопоставима с классическими SAPI синтезаторами старой школы. Было бы интересно глянуть, если бы не "стали в 3-4 раза быстрее", а разменяли скорость на качество, сохранив её как у v3 или лучше v4.

Из наиболее бросающегося в глаза. Предложения не выделены соответствующими паузами. Речь сливается. Более того, паузы часто меньше чем от запятой, а иногда и вовсе отсутствуют. Это в принципе исправляется вручную, вставкой тегов или генерацией тишины в коде. Но для режима "сделай хорошо" нужна встроенная поддержка. Которая заодно поможет решить проблему "при генерации сразу сильно длинного аудио скорость немного проседает". Разбивать внутри текст на предложения, например razdel из проекта Natasha (очень быстрый и качественный), озвучивать порциями, вставляя пустые межблоки в выходное аудио. Ну и заодно подумать о расширении интерфейса библиотеки потоковым методом. Уменьшит задержку между запросом и ответом. Не нужно будет ждать синтеза всего запроса.

Этой пары больше никто не предоставляет.

Ещё никто не предоставляет такую поддержку ударений и омографов. И самое главное, мы даже ручные словари правил ещё не трогали.

Было бы интересно глянуть, если бы не "стали в 3-4 раза быстрее", а разменяли скорость на качество, сохранив её как у v3 или лучше v4.

Качество тут выше, чем у v3 и значительно выше, чем уv4.

Обычно, когда люди кричат про качество, там либо требуется на порядки больше ресурсов, GPU, работает даже на GPU медленно и банально синтез работает как лотерея и не проведена банальная продуктовая работа. То есть надо генерить много раз, чтобы было что-то вменяемое.

Ну и заодно подумать о расширении интерфейса библиотеки потоковым методом.

Для фришной библиотеки с такой скоростью это имхо трата ресурсов / времени. Побить на абзацы / предложения и вперёд.

Предложения не выделены соответствующими паузами. Речь сливается. Более того, паузы часто меньше чем от запятой, а иногда и вовсе отсутствуют.

Это уже слабо похоже на правду, нужны примеры.

Качество тут выше, чем у v3 и значительно выше, чем уv4

Бесспорно. Скорость в 3-4 раза быстрее v3 и качество на X пунктов выше. А если бы скорость была равна, на сколько бы пунктов было выше качество? Вот это и хотелось бы глянуть. Любопытство, не более. Если что, к фонетике вообще непритязателен. Больше обращаю внимания на просодию. И тут вы прилично подтянулись. Надо еще послушать непрерывно пару-тройку книг, чтобы окончательно в этом убедиться (или опровергнуть).

Это уже слабо похоже на правду, нужны примеры.

Если не возражаете, можете прогуляться на 4pda. Откройте Айдара в аудиоредакторе. В лучшем случае, паузы 200 и менее миллисекунд. Если память не изменяет, рядовым является 400-750 мс. Особое внимание отрывку 30-48 секунд. Да, пунктуация там может непростая, но она есть. Можете убедиться по другим озвучкам.

При озвучке абзацев или не дай создатель, еще больших фрагментов — структура текста теряется. Не считаю это значимой проблемой — "Побить на предложения и вперёд". Но многие, если не большинство, будут использовать библиотеку именно так и впечатление будет соответствующее. Решение за вами.

 А если бы скорость была равна, на сколько бы пунктов было выше качество?

Качество понятие очень растяжимое. Если его измерять как оценку по 5-балльной шкале или оценку предпочтений, то уже на этапе v2 синтеза ОБЫЧНЫЕ люди в телефоне не могли отличить по 1 фразе синтез от не-синтеза.

Копать имхо надо в сторону интонаций / контроля эмоций / интонаций.

Если не возражаете, можете прогуляться на 4pda. Откройте Айдара в аудиоредакторе. В лучшем случае, паузы 200 и менее миллисекунд. Если память не изменяет, рядовым является 400-750 мс. Особое внимание отрывку 30-48 секунд. Да, пунктуация там может непростая, но она есть. Можете убедиться по другим озвучкам.

Нет времени читать все 56 страниц форума. Вы можете прислать конкретные проблемные участки с минимальным кодом для их репликации? Иначе разговор получается не очень предметным.

При озвучке абзацев или не дай создатель, еще больших фрагментов — структура текста теряется. Не считаю это значимой проблемой — "Побить на предложения и вперёд". Но многие, если не большинство, будут использовать библиотеку именно так и впечатление будет соответствующее. Решение за вами.

Если вам нужен контроль длины пауз или более длинные паузы между абзацами - то в SSML это всё есть. О какой структуре текста вообще может идти речь в синтезе, который в принципе не понимает смысла прочитанного?

...не могли отличить по 1 фразе синтез от не-синтеза. Копать имхо надо в сторону интонаций / контроля эмоций / интонаций.

О какой структуре текста вообще может идти речь в синтезе, который в принципе не понимает смысла прочитанного?

Именно, что по фразе. В книге — заметнее. На счет интонаций, в обсуждении "ударятора" я писал, как по моему мнению, происходит окраска текста читателем при чтении книги. Поэтому копать надо в первую очередь в эту сторону. Дать слушателю крепкую основу для личной окраски — озвучить просодией структуру предложения, включая финальный знак.

Не надо понимать смысл прочитанного, надо понимать смысл структуры текста выраженный знаками препинания. Помните пример "выдры в гетрах", где 5 предложений с одинаковым текстом, по разному размечено пунктуацией. Вот именно ее и надо "прочитать" просодией. И только после уверенного преодоления этого этапа, начать окрашивать самому, выступая в роли декламатора, подчеркивающего смыслы.

Нет времени читать все 56 страниц форума.

Ссылка ведет на конкретный пост, а не ветку.

Если вам нужен контроль длины пауз или более длинные паузы между абзацами - то в SSML это всё есть.

Прекрасно понимаю и неоднократно писал об этом. Вопрос в другом. Должно ли продуктовое решение уметь читать абзацы, речью давая понять слушателю, что текст содержит последовательность отдельных утверждений, восклицаний и вопросов? Это один из элементов оценки похожести на человека — монотонность дикции. Только если в предыдущем абзаце речь шла о монотонности в рамках предложения, тут монотонность в рамках более крупной структурной единицы.

Прекрасно понимаю и неоднократно писал об этом. Вопрос в другом. Должно ли продуктовое решение уметь читать абзацы, речью давая понять слушателю, что текст содержит последовательность отдельных утверждений, восклицаний и вопросов? Это один из элементов оценки похожести на человека — монотонность дикции. Только если в предыдущем абзаце речь шла о монотонности в рамках предложения, тут монотонность в рамках более крупной структурной единицы.

Тут намешано 3 разных понятия:

  • Чтение вопросов;

  • Чтение восклицаний;

  • Интонация в рамках уже не предложения, а в рамках абзаца / страницы текста.

Если первое и второе решаемо в принципе для компактных локальных моделей, то третье скорее всего решаемо в рамках гигантских моделей.

Ссылка ведет на конкретный пост, а не ветку.

При попытке открыть аудио выдает 404. Если есть конкретные предложения или баги по чтению конкретных фраз - то прошу приложить минимальный код для репликации ошибки (в посте этого нет) или проблемы - мы поправим.

Интонация в рамках уже не предложения, а в рамках абзаца / страницы текста.

Да нет же. Монотонность создается отсутствием пауз. Должна ли пауза повествовательного отличаться от его длительности? Или длительности последнего "блока", от запятой до финала? Какая пауза должна быть на многоточии, тире? А у восклицательного и вопросительного?

Здесь не только гигантских моделей не надо, здесь вообще моделей не надо. Если предварительно разбить на предложения и озвучивать по ним. Достаточно отобрать несколько типов предложений, в зависимости какая гипотеза проверяется, проанализировать человеческую дикцию и вывести обобщенную закономерность. Не надо многих часов, пяток предложений тремя-четырмя обычными людьми, на гипотезу.

Слишком все бросились в нейросети. Решают квадратное уравнение через интегралы :)

При попытке открыть аудио выдает 404.

Нужна регистрация для доступа к вложениям, вроде бы.

Ошибка не в конкретном месте. Мол везде хорошо, а тут. Ошибка в отсутствии. Системном. Лучше покажу в волновой форме. Основное внимание на диапазон 50-80% трека, но и остальное показательно.

Скрытый текст

Я не понимаю, что конкретно от нас требуется. Можете сформулировать мысль в таком ключе:

  • Вот аудио;

  • Вот сниппет кода, которым его сгенерировали;

  • Вот как должно быть / что не так с этим аудио;

В таком нет. Но попробую близко.

Обратите внимание на структуру, чередование сигнал-тишина. Как для внутренней пунктуации предложения, так и между ними. В качестве образца можете взять абсолютно любой текст на ~1 минуту звучания, а в качестве эталона озвучку любым другим синтезатором, а лучше живую речь.

По данному примеру... например, в двух других голосах видна 1 запятая в первом предложении и 2 в третьем. У вас сплошной поток. И так далее по всему треку.

По описанию выглядит как баги вызова модели, если честно. Не понимаю, почему вы не можете просто код скинуть.

Вот я взял вашу же фразу, погонял на разных спикерах в колабе на готовой демке. Звучит близко к идеальному.

sample_rate = 48000
speaker = 'xenia'
put_accent=True
put_yo=True
put_stress_homo=True
put_yo_homo=True

example_text = 'Обратите внимание на структуру, чередование сигнал-тишина. Как для внутренней пунктуации предложения, так и между ними. В качестве образца можете взять абсолютно любой текст на одну минуту звучания, а в качестве эталона озвучку любым другим синтезатором, а лучше живую речь.'

audio = model.apply_tts(text=example_text,
                        speaker=speaker,
                        sample_rate=sample_rate,
                        put_accent=put_accent,
                        put_yo=put_yo,
                        put_stress_homo=put_stress_homo,
                        put_yo_homo=put_yo_homo)

На картинке прекрасно видно паузы, выделил для 1 голоса, на остальных тоже видно.

Потому что не я делал демку.

По вашему примеру... текст должен быть чуть больше, либо уменьшить масштаб. И тут нет эталона. Нет сравнения. Сравнения не между вашими голосами, а с вашими голосами. Я же не сказал, что у вас совсем нет "артикуляции", лишь что она слабовыразительна, до полной потери.

Попросите в понедельник прочесть этот фрагмент кого-то из коллег, не особо привлекая к этому внимания, чтобы получилась речь в естественной среде. Ну либо просто забейте, если считаете это не важным, а мои реплики придирками. Так тоже может быть. До следующей встречи, коллега.

Исходя из базовых тестов я не увидел "слабовыразительности" и "до полной потери".

Вы ссылаетесь на тесты другого человека, но по ссылке выше непонятно как повторить результат.

Если задача стоит в том, чтобы помочь сделать синтез лучше, нужен какой-то минимальный пример для репликации.

Есть подозрение, что возможно что иначе дело с пре-процессингом текста. Но если честно я даже не знаю, как тут можно что-то сломать.

Помню тут какие-то школьники аж целую хейтерскую статью на Хабре накатали из-за того, что движок синтеза не обрабатывает символ переноса строки.

Но это же движок, в его задачи не входит нормализация текста. То есть при полноценной поддержке SSML, можно конечно ввести какое-то правило, что при наличии знака переноса строки мы считаем его параграфом, но это немного влазит на чужую территорию.

Здравствуйте. Перечитав на свежую голову нашу беседу, действительно нашел два пробела в аргументации.

  1. Вопросы только к одному голосу — Айдар. А я почему-то обобщил их на весь проект. Прошу прощения. Однако, посмотрите на свой предыдущий скрин. Найдите во втором и третьем предложении позиции запятых. А если не зная текста, есть они там или нет, и не имея в подсказке других голосов? В отношении пауз между предложениям, может быть из-за малых внутренних пауз, может они действительно меньше, но складывается ощущение избыточной "компактности" голоса. Слышны слова, не слышно речи.

  2. Нормально ли такое чередование, как утверждаете вы, или ненормально, как считаю я, без эталона не определить. Мой "эталон" других синтезаторов вы разумно отклоняете, но иного не предоставлено. Подумывал приложить еще образцов, но отказался. Сторонние данные психологически проще дезавуировать. Поэтому запишите запишите живую речь сами и посмотрите глазами на ее тайминги. Именно живую, обычного рассказчика "как я провел выходные", а не озвучивающего декламатора. Хотя может и на него стоит глянуть, не знаю.

Интересно, как вы тестируете? Предложу озвучить и прослушать рассказ на десяток-другой страниц. Обращая внимание не на голос, а на содержание. Насколько легко это будет. Насколько удерживается внимание. Насколько слышен сам текст. Ведь тестируя на коротких демо-фрагментах, некоторые моменты не привлекают внимания. А на длинных — становятся значимыми. Тайминги пауз, кмк из их числа.

Взял ваш абзац из текста выше:

sample_rate = 48000
speaker = 'aidar'
put_accent=True
put_yo=True
put_stress_homo=True
put_yo_homo=True

example_text = 'Нормально ли такое чередование, как утверждаете вы, или ненормально, как считаю я, без эталона не определить. Мой "эталон" других синтезаторов вы разумно отклоняете, но иного не предоставлено. Подумывал приложить еще образцов, но отказался. Сторонние данные психологически проще дезавуировать. Поэтому запишите запишите живую речь сами и посмотрите глазами на ее тайминги. Именно живую, обычного рассказчика "как я провел выходные", а не озвучивающего декламатора. Хотя может и на него стоит глянуть, не знаю.'

audio = model.apply_tts(text=example_text,
                        speaker=speaker,
                        sample_rate=sample_rate,
                        put_accent=put_accent,
                        put_yo=put_yo,
                        put_stress_homo=put_stress_homo,
                        put_yo_homo=put_yo_homo)
print(example_text)
display(Audio(audio, rate=sample_rate))

Айдар пропускает какие-то запятые в очень длинных предложениях. В целом это особенность его как диктора, он как бы сам так говорит. Бу-бу-бу, потом в конце предложения смена интонации. Он как бы говорит как диктор на радио.

Интересно, как вы тестируете? Предложу озвучить и прослушать рассказ на десяток-другой страниц. Обращая внимание не на голос, а на содержание. Насколько легко это будет. Насколько удерживается внимание.

Мы пока не разрабатывали продукт озвучки аудиокниг. Очевидно, что чтобы сделать автоматизированную озвучку аудио-книги на уровне "плохого" чтеца, нужно чуть больше, чем просто скормить строку в синтез. Может когда-нибудь руки дойдут до этого, но это будет естественно коммерческий продукт.

Для прямо точного контроля над всеми паузами есть SSML. Ну например самое тупое что можно делать, что по вашим критериям существенно повысит качество, это абзацы текста делать на абзацы с помощью SSML-тега <p>.

Не совсем то. О продукте речь не идет. Лишь личная возможность оценить. Посмотрите какие "метрики" дикции становятся заметны, выходят на первый план. Прослушивание предложениЯ и прослушивание предложениЙ, текста, вызывают разный отклик в сознании.

Кстати, возник еще вопрос — финальные "паддинги". Если они "продуктовые", не надо обращать внимания, само получится нормально после склейки, это одно. Помогают. Но если нужна коррекция, а паддинг плавающий, уже другое. Вредит. Он у вас постоянный? Не зависит от голоса и/или последнего предложения в задании? То есть надо или 0, или константа.

UFO landed and left these words here

Часто путает е и э в словах типа "модЭли",

Э-фикация в принципе не поддаётся правилам русского языка. Мы пока её не касались. По сути это набор слов-исключений типа панель, шинель, нинель, и т.д.

и вообще ударения

Если есть конкретные слова, где есть ошибки - можете прикрепить список / файл сюда, или создать тикет, мы поправим. Если ошибка в омографах, то модель естественно не всегда ставит омографы правильно, но это пока буквально первая версия модель омографов.

Текст для озвучки приходится готовить в больших ллм, транслитерировать, разворачивать сокращения итп. После этого уже непонятно зачем локально генерировать если можно через тот же edge-tts озвучить.

Скоро люди, чтобы за покупками сходить будут что-то в больших ЛЛМ готовить. Без меня уже тома написаны на эту тему, что компании, которые хостят такие АПИ работают в безумный убыток и в продакшене очень странно стучаться в американский сервис с конским ценником.

Кейсы бывают разные - и полностью решить задачу нормализации на русском языке, чтобы это работало условно за 10ms на 1 потоке процессора - задача мягко говоря нетривиальная.

После этого уже непонятно зачем локально генерировать если можно через тот же edge-tts озвучить.

Удивительно, что кто-то ещё задаёт такой вопрос в 2025 году. Тут могу посоветовать посмотреть на направление куда развивается Windows и сделать выводы. Также в коде библиотеки есть замечательный файлик drm.py, который намекает, что аттракцион неслыханной щедрости может в любом момент закончиться.

UFO landed and left these words here

Про продакшен вам конечно виднее.

Создавать виртуалов

А правила хабра неплохо бы не нарушать.

UFO landed and left these words here

Похоже, что это единственный open-source, локальный и еще вполне естественный TTS на русском.
Надеюсь, на этом не остановитесь. Желаю успехов проекту!

Это единственный, который сам ставит ударения, стабилен и локально / быстро при этом работает. В паблике есть модели, которые ставят ударения, но не работают без GPU, к примеру.

Есть много всяких разных моделей, но обычно они (часто более 1 проблемы) или не работают с ударениями, или медленные, или галлюцинируют, или нестабильны или ходят на сервера Microsoft.

Ещё тут есть поддержка SSML, что как правило есть только у enterprise АПИ.

осталось дать возможность обучать свои голоса. Понимаю что копировать спанчбоба условно это коммерческая история для вас, но я вынужден обучать его на piper, да хуже качество, но зато читает презентации моим голосом

Если вам нужно озвучить ограниченное количество аудио, вы можете создать свой голос из одной фразы в боте

Кстати, к .NET можно прикрутить через pythonnet. Немного костыльно, но работает в одном процессе

Синтез речи слишком правильный, наверное, возникает тот самый эффект "зловещей долины".

Может быть стоит вносить шумы и искажения? Чуть плавающая ритмика и паузы, понижение частоты к окончанию фразы (воздуха меньше) и прочие флуктуации.

Вдох-выдох сильно влияют на ощущение речи. Текст бьётся не столько по предложениям, сколько по фразам. Паузы не только для смысла, но и физиологические. После короткого предложения пауза будет меньше, чем после длинного. После восклицания — длиннее. После вопроса — длиннее, если ожидается ответ. Тут уже семантика пошла.

Человек-диктор не идеальный чтец, он лишь стремится к идеалу. Поэтому синтез-речь должна быть, имхо, идеально неидеальной! :)

P. S. Смотрели на работы по синтетической телефонии?

У Байи, есть вдохи-выдохи.

Паузы в конце предложений - более длинные, это видно на примерах в цепочке выше.

Если нужны супер длинные паузы или какие-то особенные на абзацах и / или после особенных предложений, то для этого есть SSML, вы можете просто накрутить эвристик как вам больше нравится.

Может быть стоит вносить шумы и искажения? Чуть плавающая ритмика и паузы, понижение частоты к окончанию фразы (воздуха меньше) и прочие флуктуации.

Хоть тут синтез и статический, интонация у дикторов довольно живая. Есть модели синтеза, которые вносят вариативность, но там она идёт ценой стабильности генерации. Мы работаем над тем, чтобы сделать интонации поинтереснее опционально, но это непросто.

Есть модели синтеза, которые вносят вариативность, но там она идёт ценой стабильности генерации.

Значит, что-то кривое в моделях.

Слишком много вызовов функции random с магическими параметрами. :)

Мы работаем над тем, чтобы сделать интонации поинтереснее опционально, но это непросто.

Успехов!
Синтетическую телефонию не просто так упомянул, там глубоко разбирались с механикой синтеза звука. Понятно, что тогдашние аналоговые решения никто сейчас делать не будет, все и всё в цифре, но, возможно, какие-то моменты будут полезны.

P.S. Чуть ниже написал про диагностику ритмики — тоже интересная задача, пусть и второстепенная с т. з. кол-ва пользователей.

Классная штука.

Попробовал озвучить вот это:

У лукоморья дуб зелёный;

Златая цепь на дубе том:

И днём и ночью кот учёный,

Всё ходит по цепи кругoм.

и чуть дальше, еще 8 строчек.

Получилось хорошо.

Только вместо "кругОм" - "крУгом".

Проблема в принципе есть с редкими или литературными омографами. Именно прямо в стихах (в литературных формах), к сожалению, они прямо вряд ли станут сильно лучше.

Но мы выпустили только первую версию нашего омографа. Руки рано или поздно дойдут до его обновления и до добавления правил поверх моделек.

Кстати я скормил это as-is из интернета, и кругОм нормально распарсило:

ssml_sample = """
              <speak>
              <p>
              У лукоморья дуб зелёный;
              Златая цепь на дубе том:
              И днём и ночью кот учёный
              Всё ходит по цепи кругом;
              Идёт направо — песнь заводит,
              Налево — сказку говорит.
              Там чудеса: там леший бродит,
              Русалка на ветвях сидит;
              Там на неведомых дорожках
              Следы невиданных зверей;
              Избушка там на курьих ножках
              Стоит без окон, без дверей;
              Там лес и дол видений полны;
              Там о заре прихлынут волны
              На брег песчаный и пустой,
              И тридцать витязей прекрасных
              Чредой из вод выходят ясных,
              И с ними дядька их морской;
              Там королевич мимоходом
              Пленяет грозного царя;
              Там в облаках перед народом
              Через леса, через моря
              Колдун несёт богатыря;
              В темнице там царевна тужит,
              А бурый волк ей верно служит;
              Там ступа с Бабою Ягой
              Идёт, бредёт сама собой,
              Там царь Кащей над златом чахнет;
              Там русский дух… там Русью пахнет!
              И там я был, и мёд я пил;
              У моря видел дуб зелёный;
              Под ним сидел, и кот учёный
              Свои мне сказки говорил.
              </p>
              </speak>
              """

sample_rate = 48000
speaker = 'xenia'              
audio = model.apply_tts(ssml_text=ssml_sample,
                        speaker=speaker,
                        sample_rate=sample_rate)
display(Audio(audio, rate=sample_rate))

Но тут кстати в первом четверостишии сразу видна литературная форма "по цепи". По идее по правилам русского языка читается как "пО цЕпи", а в стихотворении надо читать "пОцепи". В языке вообще много такого.

Да, в самом деле, в таком варианте правильно читает - кругОм. Я-то пробовал через первый пример, который в 3 строчки.

Видимо типичная багуля со слипанием, т.к. пробела не было. Видимо надо \n превращать в пробел. Хотя парой тредов выше был тред на несколько десятков сообщений, потому что мы так не делаем, и там судя по контексту надо \n менять на <p> в SSML.

🤷‍♂️ есть разница между движком и его применением, данными и их представлением.

Добавили в v5_1_ru микрофикс, когда вокруг \n нет нужных пробелов.

Длинную паузу делать не стали, это решается через SSML (и тут всем не угодить по её длине), сделали просто, чтобы слова не слипались.

в стихотворении надо читать

Древние песни и стихи используются для того, чтобы реконструировать ударения и произношение в целом. С известными оговорками про подчинение ударения ритму стиха.

Поэтому озвучка стихотворений должна предваряться определением размера по словарю ударений, а затем отключением словаря ударений. :)

С Маяковским отдельная история. Как и Тургенев с его "стихами в прозе".
Ритмическую и рифмованную прозу тоже неплохо бы диагностировать и обрабатывать.

Хотя сейчас основная масса текстов перечисленным выше не страдает.
Пробовал БЯМки заставить такое генерить – обломился.

Проект многообещающий, удалось со скрипом запустить его на телефоне

в Termux
Главное, что работает.
Главное, что работает.

Стоит ли ждать полноценной cli-утилиты, предназначенной непосредственно для домашнего пользователя?

Что-то вроде такого;

silero_cli --file in.txt --save out.wav

Написать такую утилитку в chatgpt несложно. Или даже гуй. Но у нее есть проблема - тексты надо подготавливать к озвучке, нельзя просто так взять и закинуть любой файл потому что она не сможет прочитать цифры-нерусские буквы-сокращения-неочевидные ударения.

То есть сделать готовый продукт из такого материала не получится.

---

Тут вот частично подготовленный к озвучке текст, всё кроме ударений. В первом абзаце сразу 2 тупейшие ошибки с ударениями, звучит это дико.

В первом абзаце сразу 2 тупейшие ошибки с ударениями, звучит это дико.

Запустил текст ниже. Никаких "тупейших" ошибок с ударениями не наблюдается:

sample_rate = 48000
speaker = 'xenia'
put_accent=True
put_yo=True
put_stress_homo=True
put_yo_homo=True

example_text = 'Доброе утро, уважаемые слушатели! Мы начинаем наш очередной выпуск подкаста наука и жизнь. '\
               'Сегодня одиннадцатое ноября две тысячи двадцать пятого года. ' \
               'С вами я, ваш ведущий, Владимир Петров.' 

audio = model.apply_tts(text=example_text,
                        speaker=speaker,
                        sample_rate=sample_rate,
                        put_accent=put_accent,
                        put_yo=put_yo,
                        put_stress_homo=put_stress_homo,
                        put_yo_homo=put_yo_homo)

Вот так тоже не наблюдается:

ssml_sample = """
              <speak>
              <p>
              'Доброе утро, уважаемые слушатели! Мы начинаем наш очередной выпуск подкаста "наука и жизнь".
              'Сегодня одиннадцатое ноября две тысячи двадцать пятого года.
              'С вами я, ваш ведущий, Владимир Петров.' 
              </p>
              </speak>
              """

sample_rate = 48000
speaker = 'xenia'              
audio = model.apply_tts(ssml_text=ssml_sample,
                        speaker=speaker,
                        sample_rate=sample_rate)
display(Audio(audio, rate=sample_rate))

PS

Если вы хоть сколько-то уважаете авторов, то ошибки для дебага надо прикладывать в виде минимально реплицируемого кода запуска, а не картинки, которая судя по ветке выше, вообще может иметь весьма отдалённое отношение к тому, как работает наш синтез и вносить свои баги.

Вот так комментарии тоже лучше не писать:

Скрытый текст

Могу предположить тупейшие ошибки вайбкодинга или банальный наброс ради наброса, звучит это дико.

Что-то вроде такого;

silero_cli --file in.txt --save out.wav

Такой интерфейс подразумевает полноценную задачу озвучки аудиокниг одной кнопкой. Ведь если сделать просто разбивку на абзацы, то явно сразу набегут с криками как из комментария выше. Потом окажется, что нужна поддержка ещё 10 форматов. Естественно, если когда-либо руки дойдут до такого продукта, он будет коммерческим.

Проект многообещающий, удалось со скрипом запустить его на телефоне

Интересно, что вы смогли поставить туда питон и питорч. То есть есть уже тупо готовые сборки торча на ARM? Это прикольно.

Не заметил что есть еще 2 параметра. Но с ними так же работает.

Вроде всё правильно вызывается

В эту функцию приходят все нужные параметры

    def process_ssml(self, ssml_text: str, speaker: str, sample_rate: int, **kwargs) -> torch.Tensor:
        """
        Синтезирует речь из SSML-текста.
        """
        if not self.model:
            raise RuntimeError("Модель не загружена. Вызовите метод .load() перед использованием.")
            
        logger.info(f"Processing SSML (len: {len(ssml_text)}): '{ssml_text[:90]}...' | speaker='{speaker}', sample_rate={sample_rate}, options={kwargs}")
        
        return self.model.apply_tts(ssml_text=ssml_text,
                                    speaker=speaker,
                                    sample_rate=sample_rate,
                                    **kwargs)
2025-11-08 16:19:02,620 - INFO - app.tts_model - Processing SSML (len: 213): '<speak><p>Доброе утро, уважаемые слушатели!Мы начинаем наш очередной выпуск подкаста "Наук...' | speaker=
'xenia', sample_rate=48000, options={'put_accent': True, 'put_yo': True, 'put_stress_homo': True, 'put_yo_homo': True}

Получается ошибка в ударении "слуш+атели" и "сегодн+я".

Аа возможно что парсер xml съел некоторые пробелы "слушатели!Мы"

Да точно. Ошибка из за которой в ssml между предложениями нет пробела давала такой эффект.

В первом абзаце сразу 2 тупейшие ошибки с ударениями, звучит это дико.

Аа возможно что парсер xml съел некоторые пробелы "слушатели!Мы"

Да точно. Ошибка из за которой в ssml между предложениями нет пробела давала такой эффект.

Тут у человека хотя бы хватило сознательности написать, в чём реально было дело. А то уже выросло целое поколение мамкиных разоблачителей, которые потом публикуют вот такие "продукты" своей жизнедеятельности. Но почему-то другие разоблачители на такое не слетаются, когда есть зияющие косяки.

Добавили в v5_1_ru микрофикс, когда вокруг \n нет нужных пробелов.

Длинную паузу делать не стали, это решается через SSML (и тут всем не угодить по её длине), сделали просто, чтобы слова не слипались.

Интересно, что вы смогли поставить туда питон и питорч. То есть есть уже тупо готовые сборки торча на ARM?

Python, как минимум, уже более 5 лет можно запускать на телефоне cli/jupyter, а torch специально перекомпилированный, как и numpy и scipy и pandas, да, они не пойдут через pip, а ставятся через tur-repo даже для armv7 и без красноглазия..

Добавили в v5_1_ru микрофикс, когда вокруг \n нет нужных пробелов.

Длинную паузу делать не стали, это решается через SSML (и тут всем не угодить по её длине), сделали просто, чтобы слова не слипались.

Sign up to leave a comment.

Articles