Polylang 사이트의 텍스트 음성 변환: 실제로 작동하는 방법
Polylang에서 텍스트 음성 변환이 제대로 작동하려면 번역본마다 올바른 언어와 목소리로 별도의 오디오 파일이 생성되어야 합니다. Polylang은 모든 번역본을 고유한 ID를 가진 별도의 WordPress 게시물로 저장하기 때문에, 게시물별 오디오 생성이 자연스럽게 작동합니다. 오디오 자체보다는 목소리 선택, 쿠키 리다이렉트, 페이지 캐싱이 주의해야 할 부분입니다.
이 글은 다국어 TTS 시리즈의 네 번째 편입니다. 앞서 WPML, Weglot, 그리고 GTranslate 3.3.0 릴리스를 다뤘습니다. Polylang은 구조적으로 WPML과 가장 비슷하지만 고유한 특성이 있습니다. 실제 운영 사이트에서 텍스트 음성 변환 - TTSWP로 테스트한 결과와 실제로 작동하는 방법을 정리했습니다.
텍스트 음성 변환에서 Polylang이 중요한 이유
Polylang은 무료 플러그인 중 가장 많은 WordPress 다국어 사이트에서 사용됩니다. 활성 설치 수가 80만 개를 넘어, 범용 다국어 플러그인 중 무료 버전 기준으로 가장 큰 설치 기반을 보유하고 있습니다. 2011년에 첫 버전이 출시된 이후 지금도 활발히 유지·관리되고 있습니다. 추가할 수 있는 언어 수에 제한이 없고 WordPress 언어 팩은 자동으로 다운로드됩니다. 대부분의 Polylang 사이트는 블로그, 소규모 퍼블리셔, 예산을 중시하는 에이전시로, 무료 핵심 기능과 깔끔한 구조 때문에 선택합니다.
그 높은 인기가 TTS 플러그인에게는 문제입니다. 많은 플러그인이 Polylang 지원을 내세우지만 기본 언어만 테스트합니다. 하나의 오디오 파일을 게시물에 연결한 뒤 모든 번역본에 같은 파일을 제공합니다. 스페인어 페이지에서 영어 오디오가 재생됩니다. 독일어 페이지는 아무 소리도 나지 않습니다. 방문자는 떠납니다.
해결책은 구조에 있습니다. Polylang은 별도의 데이터베이스 테이블이나 쇼트코드를 추가하지 않습니다. 카테고리와 태그를 구동하는 것과 동일한 WordPress 핵심 기능인 분류 체계를 기반으로 합니다. 각 번역본은 실제 게시물로 존재합니다. 따라서 TTSWP가 작동하는 방식인 게시물별 오디오 생성이 Polylang의 콘텐츠 저장 방식과 정확히 맞아떨어집니다.
Polylang이 Weglot, GTranslate와 다른 점
Polylang은 게시물을 복제합니다. Weglot과 GTranslate는 렌더링 시점에 번역합니다. 이 한 가지 차이가 TTS 지원 방식을 완전히 결정합니다.
Polylang 사이트에서 "회사 소개" 페이지의 독일어 번역본은 게시물 ID 412, 언어 슬러그 "de"를 가진 별도의 WordPress 게시물로 데이터베이스에 저장됩니다. WordPress가 인식하고, REST API가 인식하며, save_post나 wp_insert_post에 연결된 모든 TTS 플러그인이 인식합니다. 오디오 생성은 각 번역본마다 해당 언어로 한 번 실행되고, 파일은 해당 게시물 ID로 캐시됩니다.
Weglot과 GTranslate는 다르게 작동합니다. 번역된 텍스트는 사용자가 페이지를 요청할 때만 존재합니다. 오디오를 연결할 두 번째 게시물이 없습니다. Weglot과 GTranslate의 해결 방법은 이전 글에서 다뤘습니다. WPML은 Polylang과 동일한 복제 방식을 사용하기 때문에 WPML 가이드를 약간 조정해서 적용할 수 있습니다.
TTS 관점에서 이는 좋은 소식입니다. Polylang은 필요한 것을 정확히 제공합니다. 언어별 안정적인 게시물 ID, 알려진 언어 슬러그, 렌더링 시점에 변경되지 않는 고유 URL입니다.

Polylang의 네 가지 URL 구조와 TTS에 미치는 영향
Polylang은 네 가지 URL 모드를 제공합니다. 각 모드는 캐시, CDN, 언어 감지 코드가 페이지를 인식하는 방식을 바꿉니다. 잘못된 모드를 선택하면 올바른 오디오 파일이 잘못된 URL 뒤에 놓이게 됩니다.
1. 콘텐츠에서만 언어 감지 (URL에 언어 코드 없음)
가장 까다로운 경우입니다. example.com/about URL이 쿠키나 브라우저 감지를 기반으로 한 방문자에게는 영어를, 다른 방문자에게는 독일어를 제공합니다. 페이지 캐시는 하나의 URL을 보고 하나의 변형만 저장합니다. 캐시가 먼저 가져간 언어가 모든 방문자에게 제공됩니다.
TTS 관점에서 오디오 파일 자체는 URL이 아닌 게시물 ID로 식별되므로 문제없습니다. 문제는 플레이어를 포함하는 페이지입니다. 캐시된 영어 페이지에 독일어 오디오 플레이어가 로드되면 오디오는 독일어로 재생되지만 방문자는 영어 텍스트를 기대합니다. 캐싱을 사용하는 사이트에서는 이 URL 모드를 권장하지 않습니다.
2. 디렉터리 URL (/en/, /de/)
기본값이자 권장 설정입니다. 각 언어가 자체 경로에 위치합니다. 캐시는 /en/about과 /de/about을 별개의 키로 처리합니다. 올바른 페이지가 올바른 플레이어와 올바른 오디오 파일과 함께 로드됩니다. 쿠키 처리가 필요하지 않습니다.
"기본 언어에서 URL 언어 정보 숨기기" 옵션을 주의하세요. 이 옵션이 활성화되면 기본 언어에서 접두사가 제거됩니다. /about은 영어가 되고 /de/about은 독일어를 유지합니다. 서드파티 코드의 URL 기반 언어 감지는 슬러그가 없는 기본 언어 경로에서 실패합니다. 이 옵션을 사용한다면 URL 파싱보다 pll_current_language()를 사용하세요.
3. 서브도메인 (en.example.com, de.example.com)
서브도메인은 각 언어에 고유한 호스트와 캐시 네임스페이스를 제공합니다. TTS 플레이어가 언어별로 깔끔하게 로드됩니다. DNS 설정, 서브도메인별 SSL 인증서, 약간 복잡해진 분석이 추가 비용입니다. 대규모 환경에서 잘 작동합니다.
4. 언어별 독립 도메인
완전한 분리입니다. 영어는 example.com, 독일어는 example.de. TTS는 여전히 각 WordPress 설치 내의 게시물 ID로 오디오를 식별하며 플레이어는 동일하게 작동합니다. 이 모드는 이미 국가 도메인을 보유한 브랜드에서 흔히 사용합니다.
쿠키 리다이렉트 문제
Polylang은 홈페이지 첫 방문 시 방문자의 브라우저 언어를 감지할 수 있습니다. 그런 다음 pll_language 쿠키를 설정하고 방문자를 해당 언어 버전으로 리다이렉트합니다. 페이지 캐싱과 결합되면 잘못된 언어의 오디오가 재생되는 문제가 발생합니다.
직접 재현한 오류 순서입니다. 프랑스어 방문자가 홈페이지에 접속합니다. Polylang이 프랑스어를 감지하고, pll_language 쿠키를 설정한 뒤 /fr/로 리다이렉트합니다. 캐시는 그 리다이렉트 응답을 홈페이지 URL로 저장합니다. 다음 방문자인 영어 사용자가 홈페이지를 요청하면 캐시된 /fr/ 리다이렉트를 받습니다. 프랑스어 페이지에 도착해 프랑스어 오디오를 듣고 떠납니다.
디렉터리 URL을 사용하면 다른 모든 페이지는 언어별로 별개의 캐시 키를 가지므로 피해가 홈페이지에만 국한됩니다. "콘텐츠에서 언어 감지" 모드를 사용하면 같은 문제가 사이트의 모든 URL로 퍼집니다.
세 가지 해결책이 있습니다. 가장 간단한 방법은 캐싱을 사용하는 사이트에서 브라우저 언어 감지를 끄고 방문자가 언어 선택기로 직접 선택하도록 하는 것입니다. 두 번째는 캐시 플러그인이 pll_language 쿠키를 기준으로 변형을 저장하거나 해당 쿠키가 있을 때 캐시를 우회하도록 설정하는 것입니다. 세 번째는 홈페이지를 페이지 캐시에서 제외해 감지 리다이렉트가 항상 실시간으로 실행되도록 하는 것입니다.
WP Rocket, W3 Total Cache, LiteSpeed를 사용한다면 쿠키 설정에 대한 캐싱 연동 문서를 참고하세요. Polylang은 이러한 캐시 플러그인과 함께 작동하지만, 함께 작동하는 것과 언어를 인식하는 것은 다릅니다. 캐시 설정은 직접 해야 합니다.
프론트엔드의 AJAX 동작
Polylang은 프론트엔드 AJAX 요청에서 현재 언어를 자동 감지하고 해당 언어의 문자열을 로드합니다. 요청에 명시적인 lang 변수를 전달해 특정 언어를 강제할 수도 있습니다. TTS에서 이는 오디오 플레이어나 관련 게시물 위젯이 다른 게시물을 가져오는 AJAX 요청을 실행할 때 중요합니다.
테스트 결과 Polylang은 이 부분을 깔끔하게 처리합니다. WPML 글에서 기록한 AJAX 언어 오류는 발생하지 않았습니다. 현재 언어가 아닌 다른 언어의 게시물을 가져와야 하는 커스텀 연동에서는 lang을 명시적으로 전달하고 결과를 읽기 전에 function_exists('pll_current_language')를 확인하세요.
Polylang 사이트에 텍스트 음성 변환 - TTSWP 설정하기
아래 단계는 Polylang이 이미 설치되어 있고 번역본이 하나 이상 존재한다고 가정합니다.
- 텍스트 음성 변환 - TTSWP 설치: WordPress.org 플러그인 페이지에서 설치하고 활성화하세요. 권한 오류가 발생하면 설치 문서를 확인하세요.
- TTSWP 연결: 연결 가이드를 따라 플러그인을 연결하세요. 무료 플랜에는 유료 플랜을 결정하기 전에 테스트할 수 있는 환영 크레딧이 포함되어 있습니다.
- 원본 언어 게시물을 열고 오디오를 생성하세요. 프론트엔드에 플레이어가 나타나는지 확인하세요.
- 게시물 편집기의 Polylang 언어 선택기에서 번역 버전으로 전환하세요. 오디오를 다시 생성하세요. Polylang이 다른 게시물 ID를 로드했으므로 TTSWP는 이를 새로운 생성으로 처리하고 별도의 파일을 저장합니다.
- 각 번역본의 목소리를 선택하세요. 목소리 선택은 게시물 수준에서 이루어집니다. 게시물별 재정의에 대한 자세한 내용은 목소리 선택 문서를 확인하세요.
- 프론트엔드에서 확인하세요. 서로 다른 탭에서
/en/post-slug와/de/post-slug를 열어 각각 재생해보세요. 목소리와 언어가 일치해야 합니다.
현재 TTSWP의 언어별 기본 목소리 매핑은 WPML과 Weglot을 우선 지원합니다. Polylang에서는 목소리 선택이 게시물 수준에서 이루어지며, 언어별 기본값은 아래에서 설명하는 게시물 언어 감지를 통해 작동합니다. 각 번역본이 실제 게시물이고 목소리가 게시물당 한 번 설정되므로 대부분의 Polylang 사이트에서는 이 방식으로 충분합니다. 현재 동작에 대한 자세한 내용은 Polylang 연동 문서를 참고하세요.

게시물 언어에서 목소리를 가져오는 방법
Polylang에서 게시물의 언어를 읽는 올바른 API는 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()가 현재 요청 언어를 반환합니다. 두 함수 모두 안정적이며 수년간 Polylang 공개 API의 일부였습니다. 목소리 매핑 로직은 항상 사이트 기본값이 아닌 게시물 언어에서 읽어야 합니다. 그렇지 않으면 번역본이 잘못된 목소리를 상속받습니다.
Polylang 무료 버전과 Pro 버전: TTS 관점에서의 차이
오디오를 위해 Polylang Pro가 필요한 기능은 없습니다. Polylang 무료 버전이 TTSWP에 필요한 모든 것을 제공합니다. 게시물별 복제, 언어 슬러그, 위에서 언급한 공개 API 함수가 모두 포함되어 있습니다.
Polylang Pro는 DeepL 기계 번역, REST API 지원, 번역된 URL 슬러그, 외주 번역 작업을 위한 XLIFF 내보내기를 추가합니다. 이 중 어느 것도 블로그 게시물과 페이지의 TTS에는 영향을 주지 않습니다. WooCommerce용 Polylang은 쇼핑 페이지, 상품 카테고리, 속성, 거래 이메일을 관리하는 별도의 유료 애드온입니다. 상품 설명에 오디오를 추가하고 싶다면 WooCommerce TTS 가이드를 참고하세요.
언어별 오디오의 SEO와 AEO
Polylang은 hreflang을 자동으로 처리하며, 이것이 다국어 사이트 SEO 작업의 대부분입니다. 각 언어 버전에 AudioObject 스키마를 추가하고 해당 번역본의 파일을 가리키면 검색 엔진에 명확한 신호를 제공합니다.
직접 테스트한 결과 오디오와 AudioObject 스키마가 있는 글이 AI 검색 엔진에서 더 자주 인용되었습니다. AEO 및 오디오 관련 글에서 방법과 결과를 자세히 정리했습니다. 요약하면 번역본마다 하나의 오디오 파일, 번역본마다 스키마를 적용하면 AEO 효과가 따라옵니다.
자주 발생하는 문제와 해결 방법
| 증상 | 원인 | 해결 방법 |
|---|---|---|
| 번역본에서 잘못된 목소리가 재생됨 | 게시물이 아닌 전역으로 목소리가 설정됨 | 번역된 게시물을 열고, 해당 게시물에서 목소리를 설정한 뒤 다시 생성 |
| 특정 언어에 오디오가 없음 | 해당 번역본에서 오디오를 생성하지 않음 | 편집기에서 번역된 게시물을 열고 생성 버튼 클릭 |
| 캐시된 페이지에 잘못된 언어의 플레이어가 표시됨 | 캐시가 감지 리다이렉트 또는 단일 언어 변형을 저장함 | 브라우저 언어 감지를 끄거나 pll_language 쿠키를 기준으로 캐시 변형 설정 |
| 아랍어 또는 히브리어 플레이어 레이아웃이 깨짐 | 플레이어에 RTL CSS가 적용되지 않음 | 커스텀 CSS로 RTL 스타일 추가 |
| 플레이어 UI 문자열이 기본 언어로 유지됨 | 플러그인 문자열이 번역용으로 등록되지 않음 | pll_register_string으로 플레이어 문자열을 등록해 Polylang 문자열 번역 화면에 표시 |
| 모든 게시물에서 기본 언어로 오디오가 생성됨 | 목소리 매핑이 게시물 언어 대신 사이트 로케일을 읽음 | pll_get_post_language($post_id, 'slug')로 게시물 언어 확인 |

접근성 참고 사항
언어별 오디오를 추가하는 것은 접근성 측면에서도 의미가 있습니다. 모국어로 읽는 것을 선호하지만 듣기를 원하는 방문자가 두 가지 모두 이용할 수 있습니다. 사이트가 WCAG 2.2 또는 유럽 접근성법의 적용을 받는다면 적용 기준에 대한 WCAG 오디오 준수 가이드를 참고하세요. WordPress에 TTS를 추가하는 전반적인 방법은 메인 튜토리얼에서 기본 사항을 다룹니다.
자주 묻는 질문
Polylang에서 텍스트 음성 변환이 작동하나요?
네. Polylang은 각 번역본을 고유한 ID를 가진 별도의 WordPress 게시물로 저장하며, 이는 TTSWP가 게시물별 오디오에 사용하는 구조와 동일합니다. 각 번역본에서 오디오를 생성하면 선택한 목소리로 언어별 파일이 생성됩니다. Polylang 무료 버전으로 충분하며 기본 TTSWP 설정 외에 별도의 설정이 필요하지 않습니다.
오디오를 위해 Polylang Pro가 필요한가요?
아니요. Polylang 무료 버전이 TTSWP에 필요한 모든 것을 제공합니다. 언어별 게시물 복제, 언어 슬러그, 그리고 pll_get_post_language()와 pll_current_language() 공개 API 함수가 모두 포함됩니다. Polylang Pro는 DeepL 기계 번역, REST API 지원, 번역된 URL 슬러그를 추가하지만 이 중 어느 것도 오디오 생성이나 재생 방식에 영향을 주지 않습니다.
각 언어에 다른 목소리를 사용할 수 있나요?
네. 각 번역본이 별도의 게시물이기 때문에 목소리 선택이 게시물 수준에서 이루어집니다. 독일어 번역본에는 독일어 목소리를, 스페인어 번역본에는 스페인어 목소리를 선택하는 방식입니다. TTSWP는 게시물별로 선택 내용을 저장하고 재생성할 때마다 적용합니다. 현재 동작에 대한 자세한 내용은 언어 및 목소리 매핑 문서를 참고하세요.
오디오가 잘못된 언어로 재생되는 이유는 무엇인가요?
일반적인 원인은 Polylang의 브라우저 언어 감지와 페이지 캐싱의 조합입니다. 캐시가 홈페이지 리다이렉트 또는 단일 언어 변형을 저장해 모든 방문자에게 제공합니다. 오디오 파일 자체는 게시물 ID 기준으로 올바릅니다. 해당 파일을 로드하는 페이지가 문제입니다. 캐싱 사이트에서는 브라우저 감지를 끄거나 캐시 플러그인이 pll_language 쿠키를 기준으로 변형을 저장하도록 설정하세요. 디렉터리 URL(/en/, /de/)을 사용하면 다른 모든 페이지는 별개의 캐시 키를 가지므로 피해가 홈페이지에만 국한됩니다.
TTS 관점에서 Polylang과 WPML의 차이는 무엇인가요?
두 플러그인 모두 언어별로 게시물을 복제하므로 게시물별 오디오 생성은 동일하게 작동합니다. 차이는 AJAX 처리 방식, 쿠키 동작, 개발자 API 이름에 있습니다. Polylang은 pll_ 접두사 함수를 사용하며 일반적으로 더 가볍습니다. WPML은 WooCommerce 기능이 더 많이 내장되어 있지만 플러그인 크기가 큽니다. WPML 글에서 해당 내용을 다룹니다.
오디오 플레이어 레이블을 번역할 수 있나요?
네, 단 한 가지 추가 단계가 필요합니다. Polylang은 pll_register_string()을 사용해 UI 문자열을 등록한 플러그인에 대한 문자열 번역 화면을 제공합니다. 재생 버튼, 진행 타이머 레이블 또는 기타 플레이어 텍스트가 언어에 따라 전환되길 원한다면 차일드 테마나 소규모 사이트 전용 플러그인에서 해당 문자열을 등록하세요. 그러면 언어 메뉴의 문자열 번역 화면에 나타납니다.
다음 단계
WordPress 편집기에서 번역된 게시물 중 하나를 열고 오디오 패널을 확인하세요. 기본적으로 올바른 언어가 표시된다면 설정이 완료된 것입니다. 그렇지 않다면 해당 번역본에서 목소리를 설정하고 다시 생성한 뒤 프론트엔드를 확인하세요. 하나의 번역본이 제대로 작동하면 나머지도 같은 방식으로 따라옵니다.
아직 텍스트 음성 변환 - TTSWP를 설치하지 않았다면 WordPress.org에서 설치하고 무료 TTSWP 계정에 연결하세요. 번역본 하나에서 테스트해보고 나머지 번역본 전체에 적용할지 결정하세요.
관련 기사
WPML 사이트에서 텍스트 음성 변환 제대로 사용하기
언어별로 올바른 목소리를 선택하고, 번역본마다 별도 오디오를 생성하며, AJAX 언어 감지 오류에도 안정적으로 작동하는 WPML 텍스트 음성 변환 설정 방법을 안내합니다.
워드프레스 텍스트 음성 변환 플러그인 추천 (2026)
2026년 최고의 워드프레스 텍스트 음성 변환 플러그인 7가지를 중립적으로 비교합니다. 각 플러그인의 강점과 단점, 전체 기능 비교표를 포함합니다.
Weglot 워드프레스 사이트에서 텍스트 음성 변환 사용하기
대부분의 TTS 플러그인은 Weglot 지원을 내세우지만 실제로는 번역된 텍스트가 아닌 데이터베이스에서 텍스트를 읽습니다. 진정한 Weglot 호환성이 무엇을 의미하는지 알아보세요.