합성 통화 음성 — Google Cloud TTS(Wavenet) 어댑터 + 무료 한도 리밋
무엇을
합성 통화 재생기(replay_persona_call.ts)의 소리를 이 맥 say 에서 Google Cloud Text-to-Speech(ko-KR Wavenet) 로도
낼 수 있게 한다. API 키 하나만 .env 에 넣으면 돈다 — GOOGLE_TTS_API_KEY. 키 발급은 정성윤 님(GCP 콘솔)에게 요청한다.
왜
- 대본이 STT 를 대신하므로(글자를 직접 흘린다) 소리 쪽만 있으면 「두 AI 가 통화하는」 시연이 된다
say는 이 맥에서만 나고 음성 종류가 적다. 페르소나별 목소리·톤(SSML prosody)을 갈라 들려주려면 Wavenet 이 필요하다- 비용은 무료 한도(Wavenet 100만 자/월) 안이어야 한다 — 2026-09-18 사용자 지시: 무료 티어 안에서만 쓰도록 리밋
완료 조건
--speak google·--prefetch— REST 직접 호출(의존성 추가 없음 → 콜 미디에이터 이미지 태그 불변)- 페르소나 → Wavenet 음성 배분표 +
tts_voice_hint성별 폴백, 톤 → SSML prosody (google_voices.ts) - 리밋 2단 — 1차 GCP 콘솔 할당량, 2차 앱 가드(
GOOGLE_TTS_MAX_CHARS_PER_MONTH, 기본 900,000, 장부data/processed/tts-usage.json) - 캐시 우선(
data/processed/synthetic-voice/google/) — 시연 때 API 호출 0 .env.example키 이름 ·scripts/persona_sim/TTS.md발급 절차(성윤님 전달용)- 단위 테스트(SSML·배분·예산·캐시 히트 시 호출 0·키 유출 없음)
- 실제 키로 1회 합성 확인 — 2026-09-21 키 받아
--prefetch SYN-001: 7턴 381자 합성, mp3 7개(2.2~9.8초,afinfo), 상담원ko-KR-Wavenet-B/고객ko-KR-Wavenet-C(pitch +2) 배분 확인, 장부tts-usage.json381/900,000. 재실행은 캐시 7·호출 0
한계 (절대 원칙 10)
TTS 톤은 연기 지시다. D-5 통화 온도의 성능 근거가 아니다(scripts/persona_sim/README.md 「말할 수 없는 것」).
2026-09-21 — 실제 키로 확인, 닫음
- 명령:
cd services/call-mediator && node --env-file-if-exists=../../.env scripts/replay_persona_call.ts --prefetch SYN-001 - 결과: 캐시 0 → 새로 합성 7(381자) → 재실행 캐시 7·합성 0. 무료 한도 앱 가드(월 900,000자) 장부가
2026-09: 381로 쌓였다. 키 값은 로그·기록 어디에도 남기지 않았다. - 못 확인한 것: WaveNet 이 SSML
prosody volume을 얼마나 반영하는지는 귀로 들어야 한다 —data/processed/synthetic-voice/google/SYN-001/의 mp3 를 사람이 들어 보고, 안 들리면google_tts.tsTONE_PROSODY값을 키운다(TTS.md 「남은 것」 그대로). 콘솔 문자 할당량을 낮출 수 있는지도 정성윤 님 콘솔에서 확인.
머지 주석 (2026-09-21, 정성윤) — 아래 「보드 최신화」는 위 닫음 기록(
ai11:06)과 거의 같은 시각(main976f42e, 11:14)에 서로 못 본 채 따로 쓴 것이다. 상태는 front matter(done)가 맞고, 아래 메모의 「상태는 그대로」·「류준 님이 정한다」는 위 닫음으로 이미 답이 났다. 지우지 않고 남긴다(절대 원칙 8).
보드 최신화 (2026-09-21, 정성윤 — 사용자 지시로 전체 보드를 한 번에 맞췄다). 상태는 그대로다. 키 발급에 착수했다(09-21) — GCP 프로젝트
callguard에 Cloud Text-to-Speech API 가 사용 설정됨인 것을 콘솔에서 확인했다. API 키는 그 API 의 「사용자 인증 정보」 탭이 아니라 왼쪽 메뉴의 「사용자 인증 정보」에서 만든다(탭에는 OAuth·서비스 계정만 나온다). 발급 뒤.env의GOOGLE_TTS_API_KEY로 전달 → 류준 님이--prefetch SYN-0011회 합성. 키는 TTS API 하나로 제한한다.
2026-09-21 — 톤 음량이 안 들리던 것을 고쳤다
--prefetch 한 mp3 를 재 보니 고함 톤이 평온과 음량이 같았다. 같은 문장으로 변형을 합성해 확인한 결과 WaveNet ko-KR 은 SSML volume 의 «올리기»(+dB)를 무시한다(내리기·속도·높이는 반영). 기준(평온)을 -8 dB 로 낮추는 배치로 TONE_PROSODY 를 바꿔 평온 대비 격앙 +3.8 · 고함 +7.1 · 지침 -5.0 dB 를 확인했다(측정표는 scripts/persona_sim/TTS.md §6). 테스트 3건 추가(「+dB 를 어떤 톤에도 쓰지 않는다」·「톤 사이 상대 음량」 포함) — 콜 미디에이터 134 통과 · tsc 통과. scripts/ 는 이미지에 안 들어가 태그 불변. 시연 대본 캐시를 새 음량으로 다시 채웠다(이달 11,256/900,000자).