JavaScript와 Node.js로 텍스트 음성 변환
JavaScript에는 음성 합성이 내장되어 있습니다. 브라우저의 Web Speech API입니다. 무료이고 설정도 필요 없지만, 목소리는 방문자의 시스템에 따라 다르고 결과를 파일로 저장할 수 없습니다. 어디서나 같은 자연스러운 목소리, 캐릭터 목소리, 오디오 파일이 필요하다면 음성 엔진이 필요합니다.
이 가이드에서는 두 방법을 솔직하게 비교하고, 무료 SuperClonica 엔진을 Node.js와 웹 앱에서 로컬 HTTP 서버로 호출하는 방법을 소개합니다.
JavaScript에서 말하는 두 가지 방법
간단한 읽어 주기 버튼이라면 Web Speech API로 충분하고, 제품의 목소리라면 엔진을 쓰세요.
- Web Speech API: 브라우저에서 한 줄, speechSynthesis.speak(new SpeechSynthesisUtterance("Hello!")). 운영체제나 브라우저의 목소리를 씁니다.
- 목소리는 Windows, macOS, Android, 브라우저마다 다르고, 일부는 온라인 서비스이며, 소리를 파일로 저장할 수 없습니다.
- SuperClonica: 어떤 기기에서나 같은 자연스러운 목소리, 캐릭터·맞춤 목소리, 저장하고 캐시할 수 있는 WAV 파일을 주는 로컬 서버.
- 31개 언어를 말합니다. 중국어는 아직 지원하지 않습니다.
엔진 목소리를 무료로 들어 보기
코드를 쓰기 전에 아무 목소리 페이지에서 30~100자 문장을 입력하고 언어를 고른 뒤 생성 버튼을 누르세요. 몇 초 만에 앱이 가질 수 있는 목소리를 들을 수 있습니다. 계정은 필요 없습니다.
로컬 음성 서버 시작
NVIDIA 그래픽 카드가 있으면 cuda 이미지로 더 빨라지지만, 필수는 아닙니다.
- 어떤 CPU에서든 서버 시작: docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu.
- 첫 실행 때 Supertonic 3 모델(약 385MB)을 볼륨에 내려받습니다. 준비 여부는 GET /health로 확인합니다.
- POST /synthesize는 text, voice, lang, seed, normalize가 담긴 JSON을 받아 16비트 모노 WAV로 답합니다.
- voice는 기본 이름 M1~M5, F1~F5이거나 목소리 파일을 파싱한 내용입니다.
Node.js와 브라우저에서 호출
Node.js 18 이상에서는 fetch가 내장되어 있어 fs를 불러오면 요청은 몇 줄이면 됩니다: const voice = JSON.parse(fs.readFileSync("voice.json", "utf8")); const res = await fetch("http://localhost:8000/synthesize", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text: "Node에서 안녕하세요!", voice, lang: "ko", seed: 7 }) }); fs.writeFileSync("hello.wav", Buffer.from(await res.arrayBuffer())); 웹 앱에서는 음성 서버를 비공개로 두고 자체 백엔드에서 호출하세요. 페이지는 소리를 blob으로 받아 new Audio(URL.createObjectURL(blob)).play()로 재생합니다. 같은 텍스트, 목소리, seed면 항상 같은 파일이 나오므로 반복되는 문구의 오디오는 캐시하세요.
운영 환경 습관
포트 8000을 그대로 인터넷에 열지 마세요. SUPERCLONICA_API_KEY를 설정해 Bearer 토큰으로 보내거나, HTTPS 리버스 프록시 뒤에 두거나, 사설 네트워크 안에 두세요. 동시 요청이 많다면 SUPERCLONICA_LANES로 모델 사본을 늘리고, 내 하드웨어에서 측정하세요. 우리 테스트에서 짧은 문장은 RTX 5070 Ti에서 0.12초, CPU 4스레드에서 0.43초 걸렸습니다.