2주 전, 저희는 사용자의 자체 장치에서 실행되는 소형 텍스트-음성 변환(text-to-speech) 모델인 Phonon을 공개했습니다. 서버나 네트워크가 필요 없으며, 입력한 내용은 사용자에게만 남아있습니다.
지금까지의 반응에 매우 만족하고 있습니다. 그래서 이번 출시 스토리를 전해드립니다: 저희가 Phonon을 구축한 이유, 이 모델이 무엇을 할 수 있는지, 함께 제공된 데모들, 그리고 Hugging Face의 Open TTS 리더보드에서 어떤 성과를 거두었는지입니다.
대부분의 음성 AI는 클라우드에 존재합니다. 모든 문장이 서버로 왕복하는 과정을 거치죠. 하지만 Phonon은 사용자의 자체 장치에서 실행됩니다. 텍스트가 그곳에 머물고 네트워크 없이도 음성이 작동합니다. 또한, 저희는 모델 가중치(weights)를 공개했습니다. Phonon 31m은 Apache 2.0 라이선스로 배포되어 상업용 제품에서도 무료로 사용할 수 있습니다. 다른 모델들은 CC BY-NC이므로 비상업적 프로젝트에서는 무료입니다. 만약 이 모델들을 사용하여 상업적인 무언가를 구축한다면, 생성하는 음성 양이 아니라 사용자 수에 따라 가격이 책정됩니다.
작은 장치에서 좋은 음성을 구동시키는 것은 항상 어려웠습니다. 모델을 작게 만들 수는 있었지만, 그때는 소리가 좋지 않았습니다. 또는 소리를 매우 좋게 만들 수는 있었지만, 그럴 경우 크기 제한을 맞추기 어려웠습니다. 저희는 이 두 가지 문제를 모두 해결했습니다.
저희는 지난 4월에 Phonon을 발표했고, 이후 6개월 동안 파트너 및 초기 사용자들과 함께 발전시켜 왔습니다. 그들의 피드백은 이번 출시를 구체화하는 데 도움을 주었습니다. 모델들은 더 작아졌고, 음성 복제(voice cloning)와 음성 디자인(voice design)을 통해 더 많은 언어 지원과 맞춤형 목소리 기능을 추가했습니다.
Phonon은 Pocket TTS 계보를 기반으로 하며, 이 때문에 오디오 생성을 위해 흐름 매칭(flow matching)을 사용하는데, 이는 다른 TTS 시스템에서 사용되는 모델링 기술과는 매우 다릅니다. 이것이 저희가 이렇게 작은 모델에 높은 수준의 품질을 가져올 수 있게 했지만, 동시에 모델 훈련 과정에서 새로운 어려움을 만들었습니다. 초기 훈련은 수치적으로 불안정(numerically unstable)하여 다섯 개 언어 모두에서 고품질 결과를 얻기 위해 여러 가지 트릭이 필요했습니다.
Phonon은 약 65MB와 75MB 두 가지 크기로 제공됩니다. 이 둘을 합치면 영어, 프랑스어, 독일어, 스페인어, 포르투갈어를 구사합니다. 100개가 넘는 내장 음성(built-in voices)이 있으며, Gradium Studio에서 직접 만들 수도 있습니다. Phonon은 또한 대부분의 다른 TTS 시스템들이 어려움을 겪는 전화번호, 날짜, 코드와 같은 중요한 요소들을 처리합니다.
이 시스템은 휴대폰, 노트북, 싱글 보드 컴퓨터(single-board computers), 그리고 브라우저 탭에서 실행되므로 지금 바로 들을 수 있습니다. Phonon 31m은 영어를 구사하며 Apache 2.0 라이선스이므로 상업용 제품을 포함하여 자유롭게 구축할 수 있습니다. Phonon 40m은 모든 다섯 개 언어를 비상업적(non-commercial) 라이선스로 다룹니다.
이번 출시는 친구들과 자체 팀의 데모와 함께 공개되었습니다. Wi-Fi가 꺼진 Apple Watch에서 Phonon은 커피 추출 과정을 단계별로 안내합니다. 신호가 없는 iPhone에서는 운동 횟수를 세어주고 동기를 부여합니다. Autonomous사에서 만든 Lamp라는 로봇은 분류 모자(sorting hat)를 쓰고 캐릭터 연기로 이야기합니다. 브라우저에서는 오프라인 공룡 러너(dino runner)가 Rex가 진행하는 라디오 쇼로 변신합니다. 또한 플레이어 자신의 기기에서 음성 처리된 SF 게임과, 페이지별로 소리 내어 읽는 프루스트 작품도 있습니다.
Hugging Face 팀은 트랜스포머(Transformers) 통합을 구축하여 개발자들이 처음부터 Phonon을 Transformers에서 사용할 수 있게 했습니다.
개발자들도 이를 기반으로 구축하기 시작했습니다. ExecuTorch 변환을 통해 방문자의 브라우저 내 GPU에서 Phonon이 실행되며, Micdrop은 이를 Node.js 앱으로 가져왔고, smallest-s2s와 같은 Spaces도 이를 활용하고 있습니다.
Phonon은 출시 후 첫 2주 동안 20만 회 이상 다운로드되었으며, 현재도 Hugging Face에서 트렌드를 유지하고 있습니다.
Open TTS Leaderboard는 Hugging Face에서 만든 매우 새로운 프로젝트이며, 저희는 이 리더보드를 좋아합니다. Hugging Face Hub에는 9,000개 이상의 TTS 모델이 있어, 이 리더보드는 개발자들이 오픈 모델들을 비교하고 나란히 들어볼 수 있는 한 곳을 제공합니다. 23개 언어에 걸쳐 모델들은 명료도(intelligibility) (출력의 단어 오류율), 속도(speed) (역 실시간 계수 및 최초 오디오까지의 시간), 그리고 자연스러움(naturalness) (영어는 UTMOS, 한국어는 KOMOS)을 기준으로 평가됩니다. 고정 음성(Fixed-voice)과 음성 복제(Voice cloning)가 평가되며, 후자의 경우 추가적인 화자 유사도 지표가 적용됩니다. 이 리더보드에는 'Listen' 탭도 있어 사용자가 직접 TTS 출력을 비교하고 가장 마음에 드는 모델에 투표할 수 있습니다.
명료도 측면에서 Phonon은 독일어와 스페인어에서 1위를 차지했으며, 평가된 모든 언어에서 상위 3위권 안에 들었으며, 그 옆에는 크기가 최대 100배나 되는 모델들도 존재합니다.
Phonon이 진정으로 빛을 발하는 곳은 속도입니다. Phonon은 최초 오디오까지의 시간(time-to-first audio) 부문에서 CPU 스트리밍 벤치마크에서 최고 기록을 세웠습니다.
저희는 Phonon 전용으로 ptts라는 새로운 추론 프레임워크를 구축했습니다. ptts의 목표는 광범위한 장치에서 최고의 성능을 내는 것이며, 이를 위해 CPU(Intel, Arm, WebAssembly), GPU(CUDA, Vulkan, Metal, WebGPU), NPU(Apple Core ML, Snapdragon®) 등 10개 이상의 백엔드를 지원합니다.
Phonon은 또한 참조 PyTorch 구현체로서 v5.21부터 🤗 Transformers에서도 사용할 수 있습니다. ptts가 장치에서 단일 스트림을 실행하는 반면, Transformers는 배치 생성(batched generation), 전체 그래프 torch.compile 등을 통해 GPU 처리량(throughput)을 목표로 합니다. 네이티브 PyTorch 기반이기 때문에, Phonon을 자체 스택에 통합하든 모델 자체를 연구하든 구축할 수 있는 기반이 됩니다.
이는 Pocket TTS 계보에 속하기 때문에, 저희는 먼저 Pocket TTS를 Transformers에 추가했습니다. Phonon은 그 위에 모듈식 모델로 자리 잡고 있으며, 차이가 나는 부분을 설명하는 코드는 약 200줄 정도입니다.
Phonon은 오디오 라텐트(audio latents)를 자기회귀적(autoregressively)으로 생성합니다. 각 단계는 다음 입력으로 다시 공급되는 라텐트를 출력하며, 훈련 손실(training loss)은 이들을 기반으로 계산됩니다. 라텐트는 언어 모델에서 텍스트 토큰이 그러하듯이, 모델의 입력, 출력 및 타겟입니다. 따라서 오디오를 라텐트로 매핑하는 코덱(codec)은 토크나이저(tokenizer) 역할을 수행합니다. Transformers는 이를 다음과 같이 구현합니다: 텍스트 토크나이저 옆에 위치한 오디오 토크나이저가 프로세서에 의해 관리됩니다:
from transformers import AutoProcessor, GradiumPhononTTSForConditionalGeneration
model_id = "gradium/phonon-31m-en"
processor = AutoProcessor.from_pretrained(model_id, device_map="auto")
...
음성은 녹음 파일이 아니라 스피커 라텐트(speaker latents)의 텐서입니다. Phonon은 디코더 전용(decoder-only)으로 제공되는 오디오 토크나이저를 사용하여 오디오를 직접 인코딩하지 않으며, 음성 데이터는 미리 계산되어 제공됩니다: gradium/phonon-voices.
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
path = hf_hub_download("gradium/phonon-voices", "voices/LMDIYE0Oa377Qh6Z.safetensors")
...
프롬프트 레이아웃(음성 위치, 텍스트, 그리고 오디오를 시작하는 토큰)은 Transformers의 다른 멀티모달 모델들과 마찬가지로 체크포인트와 함께 채팅 템플릿(chat template) 형태로 제공됩니다. 사용자는 음성이 들어갈 빈 audio 항목을 포함하여 표준 대화를 작성하며, 이 경우 코드도 체크포인트 전반에 걸쳐 동일하게 유지됩니다. 이후 프로세서가 해당 음성 플레이스홀더를 프레임당 하나의 위치로 확장하고, 텍스트를 정규화 및 토큰화한 다음, 입력을 배치(batch)합니다:
conversation = [
{"role": "user", "content": [{"type": "audio"}, {"type": "text", "text": "Hello from Phonon."}]}
]
...
generate 함수는 라텐트를 반환하며, 프로세서가 이를 오디오로 디코드합니다:
outputs = model.generate(**inputs) # audio_latents: (batch_size, num_frames, 32)
audio = processor.decode(outputs.audio_latents, outputs.audio_latents_mask)
processor.save_audio(audio, "phonon.wav")
더 자세한 내용은 공식 문서를 참조하세요! 🤗
Phonon은 어떤 목소리든 말할 수 있습니다. 화자의 동의를 얻어 짧은 녹음 파일에서 클론하거나, Gradium Studio에서 일반 텍스트로 새로운 목소리를 설명할 수 있습니다. 그런 다음 음성 파일을 다운로드하여 Phonon에 로드하면 장치에서 완전히 실행됩니다.
또한 디자인 파트너와 함께 맞춤형 Phonon 모델을 훈련합니다. 메모리 예산이 빠듯하다면, 모델을 더 작게 만들 수 있습니다. 한국어, 아랍어 또는 일본어가 필요하다면 그것에 대해서도 훈련할 수 있습니다. 그리고 제품 고유의 어휘가 있다면, 그 위에 파인튜닝(fine-tune) 할 수 있습니다. 연락 주셔서 필요한 것을 알려주세요.
Hugging Face 팀과 첫 2주 동안 Phonon을 사용해 본 모든 분들께 감사드립니다.
Phonon은 저희의 첫 오픈 릴리스입니다. 직접 사용해 보시고 무엇을 만드셨는지 알려주세요.