본문 바로가기
C.W.K.
Stream
Lesson 01 of 04 · published

소리를 바꾸는 모든 것

~11 min · cache-key, content-addressed, hashing

Level 0침묵
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"cache 키는 약속이야. 같은 키면 같은 소리. 약속을 깨면 캐시가 거짓말해."

키가 게임 전부야

content-addressed 캐시는 키만큼만 좋아. 규칙은 명확해. 키엔 정규화한 텍스트랑 결과 오디오를 바꿀 수 있는 입력이 다 들어가야 해. 해석된 binding, 모델, 목소리 설정, 언어, 발음 사전 버전, seed, 그리고 주변 context. 이 목록을 빠짐없이 채우면 캐시는 보증이 돼. 틀리면 캐시는 자신 있는 거짓말쟁이가 되고.

틀리는 두 가지 방식

뭔가 빠뜨렸다고 쳐. 이를테면 모델 버전. 그러면 진짜로 다른 두 요청이 같은 키로 해시돼. 두 번째가 첫 번째의 오디오를 받는데, 미묘하게 틀렸는데 완전한 자신감으로 서빙돼. 그게 under-specified 키고, 위험한 실패야. 반대 실수는 over-specified 키야. 타임스탬프처럼 오디오에 영향 안 주는 걸 넣으면, 똑같은 요청이 절대 안 맞아떨어져. 그래서 매번 결제하고 캐시가 제값을 못 해.

정규화 먼저, 해시 나중

키가 날 텍스트가 아니라 정규화한 텍스트를 해시하는 걸 봐. 정규화가 지우는 방식으로만 다른 두 입력은 같은 오디오를 내야 하니까 같은 키를 내야 하거든. 그래서 정규화(트랙 7)가 identity보다 먼저 돌아. 캐시는 친 것의 우연한 차이가 아니라 실제로 말해질 것에 키를 매겨.

Code

합성 identity, 필드 하나하나·python
import hashlib, json

def synthesis_identity(norm_text: str, binding: VoiceBinding, s: Settings) -> str:
    # EVERYTHING that can change the audio goes in. Miss one -> silent collision.
    material = {
        "text":         norm_text,           # NORMALIZED, not raw
        "voice_id":     binding.voice_id,    # the resolved binding
        "model":        s.model,
        "stability":    s.stability,
        "style":        s.style,
        "language":     s.language,
        "dict_version": s.dictionary_version,
        "seed":         s.seed,
        "context":      s.context,           # e.g. surrounding chunk text
    }
    blob = json.dumps(material, sort_keys=True, ensure_ascii=False).encode()
    return hashlib.sha256(blob).hexdigest()

# Add a field the day it starts affecting the audio. Never add one that doesn't.

External links

Exercise

캐싱하고 싶은 비싼 연산을 골라봐. 이미지 렌더, 컴파일된 asset, LLM completion. 출력을 바꾸는 입력을 다 나열해. 그다음 사람들이 흔히 빼먹는 하나를 찾아. 버전, 로케일, config 플래그 같은 거. 그걸 키에서 빼면 뭐가 깨지는지, 실제로 상관없는 걸 넣으면 뭐가 드는지 판단해.
Hint
연산을 한 단계씩 밟으며 입력마다 물어. '이것만 바뀌면 출력이 바뀔까?' 그렇다면 키에 들어가. 아니면 빠져야 하고. 빼먹는 입력은 거의 늘 호출 지점에서 멀리 사는 버전이나 설정이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.