기술

음성합성 후처리 효과를 둘 넣었는데, 둘 다 아무 값도 바꾸지 않았습니다

2026.10.068분 읽기

자사 영상 콘텐츠 프로젝트에서 낭독 목소리를 만드는 창구를 바꾸고 있었습니다. 목소리 자체는 이미 정해 뒀고, 남은 일은 말투를 조금 다듬는 것이었습니다. 문장 끝이 툭 끊기는 느낌을 줄이려고 두 군데에 손을 댔습니다. 하나는 합성을 요청하는 쪽, 하나는 만들어진 소리를 다듬는 후처리 쪽입니다.

두 장치를 넣은 다음 바로 본편 제작으로 넘어갔습니다. 소리는 계속 나왔고 배치는 계속 돌았습니다. 그래서 들어갔다고 믿었습니다. 둘 다 아무 일도 하지 않고 있었다는 것은 세 배치를 만든 뒤에 알았습니다.


에러도 경고도 없었고, 그래서 아무도 의심하지 않았습니다

그 상태로 돌린 배치는 세 번입니다. 매번 음성 파일이 정상적으로 나왔고 길이도 자막과 맞았습니다. 멈춘 것이 하나도 없었기 때문에 확인할 이유가 생기지 않았습니다.

알게 된 경위는 측정이 아니라 사람입니다. 결과물 두 개를 들은 사람이 '둘이 같아 보인다'고 말했습니다. 그 말을 듣고 그제야 효과를 켠 출력과 끈 출력을 같은 문장으로 한 번씩 만들어 나란히 대 봤습니다.


장치 둘이 각각 무엇을 하고 있었나

대 보니 두 장치가 서로 다른 방식으로 실패해 있었습니다. 하나는 의도와 반대 방향으로 소리를 바꾸고 있었고, 하나는 어떤 값도 바꾸지 않고 있었습니다.

장치

하려던 것

실제로 일어난 것

요청 쪽 표기 (SSML — 합성 요청에 말투를 적어 보내는 표기 규격)

문장 끝을 길게 끄는 말투

그 창구가 지원하는 방식이 같은 파형을 통째로 늦추는 것이라, 끄는 대신 소리가 갈라졌습니다

후처리 쪽 감쇠 (문장 끝 음량을 서서히 줄이는 처리)

끝을 부드럽게 닫기

감쇠를 건 구간이 이미 무음인 꼬리였습니다. 값이 0인 구간에 어떤 비율을 곱해도 0입니다

뒤쪽이 더 오래 살아남는 종류입니다. 앞쪽은 소리가 갈라지니 귀에 걸릴 가능성이 있습니다. 뒤쪽은 출력이 효과를 끈 것과 바이트 단위로 같으므로 어떤 신호도 내지 않습니다. **조용히 아무 일도 안 하는 것이 가장 오래 삽니다.**

넣었다는 코드의 사실이고 작동한다는 출력의 사실이라는 대비를 보여주는 비교 도표


같은 작업의 앞 단계에서는 제대로 쟀습니다

이 글이 자기 정정인 이유가 여기 있습니다. 같은 작업의 앞 단계에서는 꽤 공들여 쟀습니다. 참고 음성에서 음높이·기복·쉼·음량을 뽑아 기준값을 만들고(참고값 188Hz · 172~205 범위 · 문장 사이 쉼 1.0초), 후보 목소리를 같은 문장으로 전부 합성해 기준값과의 차이 순으로 줄 세웠습니다. 한 창구의 여성 목소리 52종, 다른 창구의 한국어 41종 전부, 또 다른 창구 14종입니다.

재현성도 같은 단계에서 쟀습니다. 같은 글을 세 번 합성해 보니 한 계열은 7.1 / 6.5 / 6.7초로 매번 갈렸고, 다른 계열은 바이트 단위까지 같았습니다. 자막 한 줄씩 만들어 이어 붙이는 구조라 길이가 흔들리면 타이밍이 어긋납니다. 그래서 갈리지 않는 쪽을 골랐습니다.

고르는 단계에서 세 번 돌려 흔들림까지 확인한 사람이, 다듬는 단계로 넘어가서는 한 번도 대 보지 않았습니다. 요청 쪽 표기를 고치고, 후처리 한 줄을 붙이고, 바로 다음 작업으로 갔습니다.


측정 습관은 작업 단위로 붙지 않고 단계 단위로 끊깁니다

이번 일의 교훈은 '측정을 안 하는 사람'이 아닙니다. **같은 사람이 같은 작업 안에서 앞 단계는 재고 뒤 단계는 안 잰 것**입니다. 왜 그렇게 갈렸는지는 두 단계의 성격 차이로 설명됩니다.

고르는 단계는 선택지가 여럿입니다. 비교할 상대가 저절로 있으므로 측정이 작업의 일부로 끌려 들어옵니다

다듬는 단계는 선택지가 하나입니다. 비교할 상대가 없으니 그냥 넣고 넘어갑니다. 비교 대상을 만들려면 효과를 끈 출력을 일부러 한 번 더 만들어야 하는데, 그 한 번이 추가 작업으로 느껴집니다

그런데 재는 비용은 대개 쌉니다. 이번 것은 출력을 만들어 보기 전에 계산만 해 봐도 나왔습니다 — 값이 0인 구간에 어떤 비율을 곱해도 0입니다

'바뀌었나'와 '좋아졌나'를 갈라 두는 것이 이 문제의 실제 처방입니다. 뒤쪽은 사람이 들어야 합니다. 앞쪽은 기계가 재면 되고, 재야 합니다. 앞쪽을 건너뛴 채 뒤쪽만 사람에게 물으면 이번처럼 세 배치가 지난 뒤에야 답이 옵니다.

같은 작업 안에서 고르는 단계는 측정했고 다듬는 단계는 측정이 빠졌음을 보여주는 단계별 흐름도


고친 비용보다 다시 만든 비용이 컸습니다

장치 둘의 처리는 간단했습니다. 요청 쪽 표기는 그 창구에서 하려던 일을 할 수 없다는 것이 드러나 접었습니다. 속도를 늦추는 일은 창구 자체의 설정으로 이미 하고 있었으므로, 후처리에서 한 번 더 늦추던 값도 원래대로 되돌렸습니다. 두 곳에서 같은 일을 하면 두 번 늦어집니다.

후처리 쪽은 거는 위치가 틀렸다는 것으로 정리됐습니다. 소리가 있는 구간이 어디까지인지를 먼저 잡지 않으면, 꼬리에 건 어떤 처리도 무음을 다듬는 일이 됩니다.

남은 것은 그 상태로 만들어 둔 세 배치였습니다. 본편 66장면을 새 설정으로 전부 다시 만드는 데 16분, 장면당 평균 14초가 들었습니다. **고치는 비용보다 그 상태로 쌓아 둔 것을 다시 만드는 비용이 컸습니다.** 이번에 세 배치로 끝난 것은 만드는 비용이 쌌기 때문입니다. 거꾸로 말하면 만드는 비용이 쌀수록 재지 않고 넘어가기 쉽습니다.

아무 신호도 내지 않는 장치라는 점에서, 전에 쓴 두 편과 같은 자리의 이야기입니다. 통과하는 테스트가 실제로는 아무것도 보고 있지 않았던 건이 그 하나입니다.

확인 행위 자체가 아무것도 확인하지 않는 쪽도 같은 모양입니다.


그렇다고 전부 재지는 않습니다

모든 변경에 켠 것과 끈 것 비교를 붙이면 그 자체가 부담이 됩니다. 손대는 즉시 눈이나 귀로 확인되는 변경은 따로 비교를 만들 필요가 없습니다. 자막 줄 간격, 화면 폭, 색 같은 것이 그렇습니다.

이번에 걸린 것은 **변화가 작아서 사람 감각으로는 있는지 없는지 구별이 안 되는 종류**였습니다. 거기가 측정이 필요한 자리입니다. 최소선은 검사 코드가 아니라 만들기 전에 한 번 대 보는 것이고, 반복되는 것만 그다음에 검사로 굳힙니다.


효과를 넣고 나서 확인하는 네 가지

그 효과를 끈 출력을 한 번 만들었나 — 비교 대상이 없으면 작동 여부를 말할 근거가 없습니다

두 출력이 실제로 다른가 — 사람 감각이 아니라 값으로 봅니다. 바이트 단위로 같으면 아무 일도 안 한 것입니다

그 효과가 작용할 구간이 존재하는가 — 값이 0인 구간, 비어 있는 목록, 조건에 안 걸리는 행을 대상으로 잡고 있지 않은지 봅니다

같은 일을 두 곳에서 하고 있지 않은가 — 창구 설정과 후처리가 같은 조정을 하면 효과가 두 번 적용됩니다

변화가 작아 감각으로 구별이 안 되는 변경이면 네 항목을 전부 봅니다. 눈과 귀로 바로 확인되는 변경이면 건너뜁니다. 판단 기준은 효과의 크기가 아니라 **사람이 있는지 없는지를 구별할 수 있는지**입니다.

무음 구간에 감쇠를 걸면 어떤 비율을 곱해도 값이 0으로 남는다는 인과 설명 도표


마무리

'넣었다'는 코드의 사실이고 '작동한다'는 출력의 사실입니다. 코드가 그 자리에 있는 것은 앞의 증거일 뿐 뒤의 증거가 아닙니다. 그 사이를 한 번도 재지 않으면, 아무 일도 안 하는 효과 위에 중간 산출물이 계속 쌓입니다.

에러가 나면 즉시 고치고 이상하게 들리면 금방 알아챕니다. 아무 변화도 만들지 않는 효과만 신호를 내지 않습니다. 효과를 넣었으면 만들기 전에 한 번, 켠 출력과 끈 출력을 같은 입력으로 대 보는 편이 쌉니다. 세 배치를 다시 만드는 것보다는 확실히 쌉니다.

#음성후처리#검증#측정#음성합성#중간산출물