본문으로 바로 가기
SubtitleMatrix

자막 음성 합성

미디어자막에서 음성으로

처음 실행하면 음성 모델과 음소 변환기를 내려받습니다. 합쳐서 약 98 MB이고 이 사이트가 제공하며 이후에는 브라우저가 캐시합니다. 넣어 둔 자막이나 텍스트는 이 탭을 떠나지 않습니다. MP3나 M4A를 고르면 인코더 31 MB를 더 내려받으며, WAV가 기본값인 이유가 바로 이것입니다.

옵션

목소리는 억양과 음색을, 덜 뚜렷하게는 텍스트를 어떤 음운 체계로 읽을지도 정합니다. 스페인어 목소리에 영어 문장을 붙인다고 실패하지는 않습니다. 영어 단어를 스페인어 소리로 읽을 뿐이고, 그건 오류 메시지보다 나쁩니다. 열두 개가 아니라 일곱 개 언어를 제공하는 이유는, 이 페이지에 딸린 음소 변환기에 일본어와 중국어 목소리가 없기 때문입니다. 긴 파일에 마음을 정하기 전에 짧은 파일로 들어 보세요. 모든 목소리가 같은 모델을 쓰므로 바꾸는 비용은 합성 한 번이지 다운로드 한 번이 아닙니다.

모델이 자연스럽다고 보는 속도 위에 얹히는 읽기 속도입니다. 느림은 0.8배, 빠름은 1.2배입니다. 일부러 온건하게 잡았습니다. 대략 1.5배를 넘으면 모델이 음절을 삼키기 시작해 빨리 말하는 사람이 아니라 쫓기는 사람처럼 들립니다. 자막 블록이 대사에 비해 너무 짧으면 이 페이지가 스스로 최대 1.4배까지 속도를 올린 뒤 자릅니다. 그 상승 폭은 여기서 고른 설정과 곱해집니다.

WAV는 비압축 24 kHz 모노이며 여기서 인코더 없이 씁니다. 그래서 기본값이고 별도로 내려받을 것도 없습니다. MP3와 M4A는 31 MB짜리 영상 엔진으로 압축해야 하지만 크기가 대략 열 배 줄어듭니다. 10분짜리 말이 WAV로 약 28 MB, MP3로 약 2.8 MB입니다. 목소리를 들어 보려면 WAV를, 파일을 누군가에게 보내려면 MP3를 고르세요.

이 페이지는 자막 파일을 자막을 따라가는 음성 트랙으로 바꿉니다. 자막 블록마다 소리 내어 읽고, 그 블록이 시작하는 순간에 배치하므로 결과는 하나의 오디오 파일, 예를 들어 film.wav가 되고 단어는 서로 겹치는 대신 자막 아래에 앉습니다. 블록 사이의 빈 구간은 무음으로 채우고 전체 길이는 마지막 블록의 끝과 맞습니다. 자막이 만들어진 같은 화면에 이 음성을 얹을 수 있다는 뜻입니다.

이 페이지가 단순 낭독 페이지와 따로 있는 이유는 타이밍이 어려운 부분이기 때문입니다. 말하는 데 4초 걸리는 문장에 2초짜리 블록이 붙어 있으면 그냥 넣을 수 없습니다. 다음 블록 아래로 흘러 들어가고, 동시에 나는 두 목소리는 낭독이 아니라 소음입니다. 그래서 각 줄을 고른 속도로 합성하고 길이를 재며, 들어가지 않으면 최대 1.4배까지 더 빠른 속도로 한 번 더 합성합니다. 그래도 넘치면 다음 블록이 시작하는 곳에서 자르고, 그렇게 된 블록의 개수를 삼키지 않고 손실로 보고합니다.

목소리는 일곱 언어에 열 가지입니다. 미국과 영국의 영어, 스페인어, 프랑스어, 이탈리아어, 힌디어, 브라질 포르투갈어입니다. 목소리는 음색만이 아니라 텍스트를 어느 언어의 소리로 읽을지도 정합니다. 그래서 스페인어 목소리에 영어 텍스트를 붙이면 둘 중 어느 쪽도 아닌 소리가 납니다. 일본어와 중국어가 일부러 빠져 있는 이유도 같습니다. 이 페이지에 실린 음소 변환기에 두 언어의 목소리가 없고, 목록에 올리면 오류 메시지 대신 자신만만한 헛소리를 내놓기 때문입니다.

작업은 로컬에서 합니다. 모델과 음소 변환기 약 98MB를 이 사이트에서 한 번 내려받고 이후 브라우저가 캐시하며, 자막 파일 자체는 탭을 떠나지 않습니다. 기본 출력은 WAV입니다. 인코더가 전혀 필요 없기 때문입니다. MP3나 M4A를 고르면 결과를 압축하려고 31MB짜리 ffmpeg 코어를 추가로 불러오는데, 누군가에게 보낼 생각이라면 그만한 값이 있습니다.

자주 묻는 질문

SRT 파일은 멀쩡한데 이 페이지의 WAV가 문장을 중간에 자르는 이유는 무엇인가요?

자르는 원인이 파일이 아니라 자막 블록에 있기 때문입니다. 화면에 1.8초 머무는 블록은 말하는 데 3초 걸리는 대사를 목소리를 1.4배 이상으로 밀지 않고는 담을 수 없고, 그 지점을 넘으면 말이 더 이상 알아들을 수 없게 됩니다. 페이지는 고른 속도로 먼저 시도하고, 들어가게 만드는 속도로 한 번 더 합성하되 1.4배에서 멈춥니다. 그래도 넘치면 다음 블록이 시작하는 곳에서 오디오를 잘라 두 대사가 동시에 들리지 않게 하고, 영향을 받은 블록 수를 대기열 아래 손실 보고서에 적습니다.

낭독을 위해 읽을 때 ASS 스타일과 색과 화면 위치는 어떻게 되나요?

버려지고, 여기서는 그것이 맞습니다. 오디오 파일에는 색도 화면 위치도 없습니다. 살아남는 것은 각 블록의 텍스트와 시작·끝 시각이고, 배치에 필요한 것은 정확히 그것입니다. 굵게, 기울임, 노래방 타이밍, {\anN} 위치 오버라이드는 합성 전에 형식 계층이 파싱해 걷어 내므로 ASS에서 기울임으로 표시된 줄도 나머지와 같은 목소리로 읽힙니다. 스타일을 보존해야 한다면 자막을 먼저 변환하세요. 이 페이지의 산물은 소리입니다.

두 줄짜리 SRT 블록을 한 문장처럼 이어 읽을 수 있나요?

네, 그리고 항상 그렇게 읽습니다. 블록 안의 강제 줄바꿈은 조판 결정입니다. 자막 작성자가 화면에서 줄이 길어졌다고 판단한 자리이고, 화자가 멈춘 자리가 아닙니다. 그래서 두 줄을 공백으로 이어 하나의 발화로 합성하며, 줄로 나뉜 블록도 두 사람이 번갈아 말하는 대신 한 번의 숨처럼 들리는 이유입니다. 출력에 쉼을 만드는 것은 오직 블록 경계입니다.

이 음성 트랙은 어떤 언어를 실제로 말할 수 있고, 일본어 자막은 어떻게 되나요?

일곱입니다. en-US, en-GB, es, fr, hi, it, pt-BR입니다. 일본어와 중국어는 없습니다. 이 페이지에 들어 있는 음소 변환기인 espeak-ng가 두 언어의 목소리를 제공하지 않기 때문이고, 음성 모델 자체는 두 언어로 학습되었더라도 마찬가지입니다. 일본어 .srt를 영어 목소리에 넣으면 크게 실패하지 않습니다. 로마자는 영어로 읽히고 한자는 건너뛰어지거나 망가집니다. 그 언어의 정직한 작업 방식은 그럴듯하게 들리지만 틀린 트랙을 받아들이는 대신 일본어나 중국어 음소 변환기를 갖춘 빌드를 기다리는 것입니다.

기본 출력인 WAV와 비교해 MP3에 31MB를 더 쓸 값이 있나요?

몇 분이 넘는 결과라면 있습니다. WAV는 압축하지 않은 24kHz 모노 PCM이라 10분 낭독이 약 28MB이고, 같은 오디오를 128kbps MP3로 부호화하면 약 2.8MB입니다. 대신 MP3와 M4A는 ffmpeg 코어를 한 번 내려받아야 하고, 그래서 WAV가 기본입니다. 목소리가 어떤지 확인만 하고 싶다면 추가로 받는 것이 없습니다. 인코더가 캐시된 뒤에는 같은 자막을 같은 설정으로 다시 변환하는 일이 빠릅니다.

관련 도구