Синтез речи для сайтов на Polylang: что реально работает

2 мин чтения 18 мин прослушивания
Синтез речи для сайтов на Polylang: что реально работает

Полноценный синтез речи для Polylang означает один аудиофайл на переведённый пост — на правильном языке и с правильным голосом. Так как Polylang хранит каждый перевод как отдельный пост WordPress со своим ID, генерация аудио на уровне поста работает нативно. Подводные камни — это выбор голоса, редиректы через куки и кеширование страниц, но не само аудио.

Это четвёртый материал в нашей серии о многоязычном синтезе речи. Ранее мы разбирали WPML, Weglot и релиз GTranslate 3.3.0. По архитектуре Polylang ближе всего к WPML, но со своими особенностями. Вот что мы проверили на практике и что реально работает на продакшн-сайтах с Синтез речи - TTSWP.

Почему Polylang важен для синтеза речи

Polylang работает на большем числе многоязычных сайтов WordPress, чем любой другой бесплатный плагин: более 800 000 активных установок. Первая версия вышла в 2011 году, и плагин до сих пор активно поддерживается. Количество языков не ограничено, языковые пакеты WordPress скачиваются автоматически. Большинство сайтов на Polylang — это блоги, небольшие издания и экономные агентства, которые выбрали его за бесплатное ядро и чистую архитектуру.

Именно эта популярность создаёт проблему для TTS-плагинов. Многие заявляют о поддержке Polylang, но тестируют только язык по умолчанию. Они прикрепляют один аудиофайл к посту, а потом отдают тот же файл для всех переводов. Испанская версия воспроизводит английское аудио. Немецкая версия молчит. Посетители уходят.

Решение структурное. Polylang не добавляет новых таблиц в базу данных и не использует шорткоды. Он строится на таксономиях WordPress — той же базовой функциональности, которая лежит в основе категорий и меток. Каждый перевод живёт как настоящий пост. Поэтому генерация аудио на уровне поста — именно так работает TTSWP — совпадает с тем, как Polylang хранит контент.

Чем Polylang отличается от Weglot и GTranslate

Polylang дублирует посты. Weglot и GTranslate переводят в момент отрисовки страницы. Это единственное отличие определяет всё в части поддержки синтеза речи.

На сайте с Polylang немецкий перевод страницы «О нас» — это отдельный пост WordPress с ID 412, языковым слагом «de» и собственным содержимым в базе данных. WordPress видит его, REST API видит его, и любой TTS-плагин, подключённый к save_post или wp_insert_post, тоже его видит. Аудио генерируется один раз на перевод, на языке этого перевода, и файл кешируется по ID поста.

Weglot и GTranslate работают иначе. Переведённый текст существует только в момент запроса страницы пользователем. Второго поста, к которому можно прикрепить аудио, нет. Мы разбирали обходные пути для Weglot и GTranslate в предыдущих материалах. WPML использует ту же модель дублирования, что и Polylang, поэтому наше руководство по WPML применимо здесь с небольшими поправками.

Для синтеза речи это хорошая новость. Polylang даёт именно то, что нужно: стабильный ID поста для каждого языка, известный языковой слаг и постоянный permalink, который не меняется в момент отрисовки.

Схема, сравнивающая дублирование постов в Polylang с переводом в момент отрисовки в Weglot
Polylang создаёт настоящий пост для каждого языка — именно это нужно для генерации TTS на уровне поста.

Четыре структуры URL в Polylang и что каждая означает для синтеза речи

Polylang предлагает четыре режима URL. Каждый меняет то, как кеши, CDN и код определения языка видят ваши страницы. Выберите неподходящий вариант — и правильный аудиофайл окажется за неправильным URL.

1. Язык только из контента (без кода языка в URL)

Самый сложный вариант. URL example.com/about отдаёт одному посетителю английскую версию, другому — немецкую: по куки или настройкам браузера. Кеш видит один URL и сохраняет один вариант. Побеждает тот язык, который кеш успел захватить первым.

Для синтеза речи сам аудиофайл в порядке — он привязан к ID поста, а не к URL. Проблема в странице, которая встраивает плеер. Если закешированная английская страница загружается с немецким embed аудио, плеер будет воспроизводить немецкое аудио, хотя посетитель ожидал английский текст. Мы не рекомендуем этот режим URL ни на одном кешированном сайте.

2. URL с директориями (/en/, /de/)

Это режим по умолчанию, и именно его мы рекомендуем. Каждый язык живёт по своему пути. Кеши обрабатывают /en/about и /de/about как разные ключи. Нужная страница загружается с нужным плеером и нужным аудиофайлом. Никаких трюков с куки не нужно.

Следите за опцией «скрыть языковую информацию из URL для языка по умолчанию». Когда она включена, у языка по умолчанию пропадает префикс: /about становится английским, а /de/about остаётся немецким. Определение языка по URL в сторонних скриптах тогда не срабатывает на путях языка по умолчанию — слаг отсутствует. Если вы используете эту опцию, опирайтесь на pll_current_language(), а не на разбор URL.

3. Поддомены (en.example.com, de.example.com)

Поддомены дают каждому языку свой хост и своё пространство имён в кеше. TTS-плееры загружаются чисто для каждого языка. Из минусов — DNS, отдельные SSL-сертификаты на каждый поддомен и чуть более сложная аналитика. Хорошо работает при масштабировании.

4. Отдельные домены для каждого языка

Полное разделение: example.com для английского, example.de для немецкого. Синтез речи по-прежнему привязывает аудио к ID поста внутри каждой установки WordPress, и плеер работает одинаково. Этот режим распространён среди брендов, у которых уже есть ccTLD.

Проблема редиректов через куки

Polylang может определять язык браузера посетителя при первом заходе на главную страницу. Затем он устанавливает куки pll_language и перенаправляет посетителя на соответствующую языковую версию. В связке с кешированием страниц именно здесь появляется аудио не на том языке.

Вот последовательность сбоя, которую мы воспроизвели. Французский посетитель заходит на главную. Polylang определяет французский, устанавливает куки pll_language и делает редирект на /fr/. Кеш сохраняет этот редирект-ответ под URL главной страницы. Следующий посетитель — англоговорящий — запрашивает главную и получает закешированный редирект на /fr/. Он попадает на французскую страницу, слышит французское аудио и уходит.

При URL с директориями ущерб ограничивается главной страницей, поскольку у каждой другой страницы есть свой ключ кеша для каждого языка. При режиме «язык только из контента» та же проблема распространяется на все URL сайта.

Работают три решения. Самое простое — отключить определение языка браузера на любом кешированном сайте и дать посетителям выбирать язык через переключатель. Второе — настроить плагин кеширования так, чтобы он учитывал или пропускал куки pll_language. Третье — исключить главную страницу из кеша, чтобы редирект для определения языка всегда выполнялся «живьём».

Если вы используете WP Rocket, W3 Total Cache или LiteSpeed, смотрите нашу документацию по интеграции с кешированием для настройки куки. Polylang работает рядом с этими плагинами, но «работать рядом» — не то же самое, что «понимать язык». Кеш всё равно придётся настраивать самостоятельно.

Поведение AJAX на фронтенде

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

В наших тестах Polylang справляется с этим без проблем. Мы не столкнулись с регрессиями языка в AJAX, которые задокументированы в материале про WPML. Если кастомная интеграция должна загружать пост на не текущем языке, передавайте lang явно и проверяйте наличие function_exists('pll_current_language') перед чтением результата.

Настройка Синтез речи - TTSWP на сайте с Polylang

Следующие шаги предполагают, что Polylang уже установлен и как минимум один перевод существует.

  1. Установите Синтез речи - TTSWP со страницы плагина на WordPress.org. Активируйте его. Если возникнет ошибка прав доступа, обратитесь к документации по установке.
  2. Подключите плагин к TTSWP, следуя руководству по подключению. Бесплатный план включает приветственные кредиты, так что можно протестировать до перехода на платный тариф.
  3. Откройте пост на исходном языке и сгенерируйте аудио. Убедитесь, что плеер появился на фронтенде.
  4. Переключитесь на переведённую версию через переключатель языков Polylang в редакторе постов. Сгенерируйте аудио снова. Polylang загружает другой ID поста, поэтому TTSWP воспринимает это как новую генерацию и сохраняет отдельный файл.
  5. Выберите голос для каждого перевода. Выбор голоса происходит на уровне поста. Смотрите документацию по выбору голоса для переопределения на уровне поста.
  6. Проверьте на фронтенде. Откройте /en/post-slug и /de/post-slug в разных вкладках. Воспроизведите каждый. Голоса и языки должны совпадать.

На данный момент автоматическое сопоставление голоса с языком в TTSWP в первую очередь охватывает WPML и Weglot. Для Polylang выбор голоса происходит на уровне поста, а сопоставление языка по умолчанию работает через определение языка поста, описанное ниже. Для большинства сайтов на Polylang этого достаточно, поскольку каждый перевод — это настоящий пост, и голос задаётся один раз для каждого поста. Текущее поведение описано в документации по интеграции с Polylang.

Редактор постов WordPress с переключателем языков Polylang и панелью аудио TTSWP рядом
Каждый перевод в Polylang — отдельный пост, поэтому генерация аудио и выбор голоса происходят для каждого перевода отдельно.

Как правильно определять язык поста для выбора голоса

Правильный способ получить язык поста в Polylang — функция pll_get_post_language(). Всегда проверяйте, что функция существует, прежде чем вызывать её — это рекомендует сам Polylang. Шаблон выглядит так:

if ( function_exists( 'pll_get_post_language' ) ) {
    $lang = pll_get_post_language( $post_id, 'slug' );
    // $lang теперь 'en', 'de', 'fr' и т. д.
}

Для контекста фронтенда pll_current_language() возвращает язык текущего запроса. Обе функции стабильны и входят в публичный API Polylang уже много лет. Логика сопоставления голосов должна всегда читать язык из поста, а не из настроек сайта — иначе переводы получат неправильный голос.

Polylang бесплатный против Polylang Pro для синтеза речи

Ничто в Polylang Pro не нужно для работы аудио. Бесплатная версия Polylang даёт TTSWP всё необходимое: дублирование постов по языкам, языковые слаги и публичные API-функции выше.

Polylang Pro добавляет машинный перевод через DeepL, поддержку REST API, переведённые URL-слаги и экспорт XLIFF для аутсорсинга перевода. Ни одна из этих функций не меняет ситуацию с синтезом речи для блогов и страниц. Polylang for WooCommerce — отдельное платное расширение, которое управляет страницами магазина, категориями товаров, атрибутами и транзакционными письмами. Если вы хотите озвучку на страницах товаров, смотрите наше руководство по синтезу речи для WooCommerce.

SEO и AEO с аудио для каждого языка

Polylang автоматически обрабатывает hreflang — это бо́льшая часть SEO-работы для многоязычных сайтов. Добавьте разметку AudioObject для каждой языковой версии, укажите в ней файл именно этого перевода — и вы дадите поисковым системам чёткий сигнал.

По нашим наблюдениям, статьи с аудио и разметкой AudioObject чаще цитируются ИИ-поисковиками. Мы задокументировали методику и результаты в материале про AEO и аудио. Коротко: один аудиофайл на перевод, разметка на перевод — и преимущество для AEO обеспечено.

Распространённые проблемы и их решения

СимптомВероятная причинаРешение
Перевод воспроизводится не тем голосомГолос задан глобально, а не для постаОткройте переведённый пост, задайте голос для него, перегенерируйте
У одного языка нет аудиоАудио никогда не генерировалось для этого переводаОткройте переведённый пост в редакторе и нажмите «Сгенерировать»
Закешированная страница показывает плеер не того языкаКеш сохранил редирект для определения языка или один вариант страницыОтключите определение языка браузера или настройте кеш на учёт куки pll_language
Плеер для арабского или иврита отображается некорректноCSS для RTL не применён к плееруДобавьте RTL-стили через кастомный CSS
Строки интерфейса плеера остаются на языке по умолчаниюСтроки плагина не зарегистрированы для переводаЗарегистрируйте строки плеера через pll_register_string, чтобы Polylang показывал их на экране перевода строк
Аудио генерируется на языке по умолчанию для всех постовЛогика сопоставления голоса читает локаль сайта вместо языка постаПроверьте язык поста через pll_get_post_language($post_id, 'slug')
Иллюстрация трёх языковых путей, каждый со своим ключом кеша и аудиофайлом, включая RTL-раскладку для арабского
URL с директориями дают каждому переводу свой ключ кеша, что исключает попадание неправильного аудио на неправильную страницу.

Об доступности

Озвучка для каждого языка — это ещё и улучшение доступности. Посетители, которые лучше читают на родном языке, но предпочитают слушать, получают сразу оба варианта. Если ваш сайт попадает под требования WCAG 2.2 или Европейского акта о доступности, смотрите наше руководство по соответствию аудио стандарту WCAG. Для общего знакомства с добавлением синтеза речи в WordPress в 2026 году в основном руководстве разобраны все ключевые моменты.

Часто задаваемые вопросы

Работает ли Polylang вместе с синтезом речи?

Да. Polylang хранит каждый перевод как отдельный пост WordPress со своим ID — точно такая же архитектура, которую TTSWP использует для генерации аудио на уровне поста. Сгенерируйте аудио для каждого перевода — и получите один файл на язык с выбранным голосом. Бесплатной версии Polylang достаточно. Никакой специальной настройки сверх стандартной установки TTSWP не требуется.

Нужен ли Polylang Pro для работы с аудио?

Нет. Бесплатная версия Polylang предоставляет всё, что нужно TTSWP: дублирование постов по языкам, языковые слаги и публичные API-функции pll_get_post_language() и pll_current_language(). Polylang Pro добавляет машинный перевод через DeepL, поддержку REST API и переведённые URL-слаги. Ни одна из них не влияет на генерацию или воспроизведение аудио.

Можно ли задать свой голос для каждого языка?

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

Почему аудио воспроизводится не на том языке?

Чаще всего причина — кеширование страниц в связке с определением языка браузера в Polylang. Кеш сохраняет редирект главной страницы или один языковой вариант и отдаёт его всем. Сам аудиофайл правильный для данного ID поста. Но страница, которая его загружает, — нет. Отключите определение языка браузера на кешированных сайтах или настройте плагин кеширования на учёт куки pll_language. URL с директориями (/en/, /de/) ограничивают проблему только главной страницей, потому что у всех остальных страниц есть свой ключ кеша.

Чем Polylang отличается от WPML для синтеза речи?

Оба дублируют посты для каждого языка, поэтому генерация аудио на уровне поста работает одинаково. Различия — в обработке AJAX, поведении куки и именах функций в API. Polylang использует функции с префиксом pll_ и в целом легче. У WPML больше встроенных функций для WooCommerce, но и сам плагин тяжелее. Подробнее об этом — в нашем материале про WPML.

Можно ли перевести подписи элементов аудиоплеера?

Да, но потребуется один дополнительный шаг. Polylang показывает экран перевода строк для плагинов, которые регистрируют свои UI-строки через pll_register_string(). Если вы хотите, чтобы кнопка воспроизведения, таймер или другие тексты плеера переключались вместе с языком, зарегистрируйте эти строки в дочерней теме или небольшом сайт-специфичном плагине. После этого они появятся в разделе «Языки» → «Перевод строк».

Что делать дальше

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

Если вы ещё не установили Синтез речи - TTSWP, скачайте его с WordPress.org и подключите к бесплатному аккаунту TTSWP. Протестируйте на одном переводе, послушайте и решите, разворачивать ли на все остальные.

Синтез речи для сайтов на WPML: что реально работает

Синтез речи для сайтов на WPML: что реально работает

Как добавить синтез речи на сайт с WPML так, чтобы плагин выбирал правильный голос для каждого языка, генерировал отдельный аудиофайл для каждого перевода и корректно определял язык при AJAX-запросах.

2 мин чтения