가이드

Ruby 음성 합성: 스크립트와 Rails 앱

Ruby에는 자체 음성 합성이 없습니다. 스크립트는 흔히 Mac의 say나 리눅스의 espeak를 부르지만 로봇 같은 소리가 나고, Rails 앱은 보통 모든 텍스트를 글자당 요금을 받는 클라우드 API로 보냅니다.

무료 SuperClonica 엔진은 앱 옆에서 HTTP 서버로 돌아가며 31개 언어의 자연스러운 목소리를 제공하고, 호출에는 Ruby 표준 라이브러리면 충분합니다. 이 가이드에서는 간단한 스크립트, Active Job과 Active Storage를 쓰는 Rails 구성, 운영 환경에서 안전하게 쓰는 습관을 소개합니다.

Ruby가 말하는 방법

오디오는 텍스트 버전마다 한 번만 만들어 파일로 제공하고, 요청마다 합성하지 마세요.

  • 시스템 목소리: system()으로 say나 espeak. 설정은 필요 없지만 로봇 같고 컴퓨터마다 다릅니다.
  • 클라우드 API: 자연스러운 목소리지만 키, 글자당 청구, 남의 서버로 가는 내 텍스트.
  • SuperClonica: 자연스러운 목소리, 캐릭터 목소리, 내 목소리를 쓰는 로컬 서버. Ruby가 JSON을 보내고 WAV를 받습니다.
  • 31개 언어를 말하며, 중국어는 아직 지원하지 않습니다.

목소리를 무료로 들어 보기

코드를 쓰기 전에 아무 목소리 페이지에서 30~100자 문장을 입력하고 언어를 고른 뒤 생성 버튼을 눌러 보세요. 몇 초 만에 앱이 가질 수 있는 목소리를 들을 수 있습니다. 계정은 필요 없습니다.

음성 서버 시작하기

NVIDIA 그래픽카드와 cuda 이미지를 쓰면 더 빠르지만, 일반 CPU로도 충분합니다.

  • 같은 컴퓨터나 비공개 컴퓨터에서 서버를 시작하세요: docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu.
  • 처음 시작할 때 Supertonic 3 모델(약 385 MB)을 내려받습니다. 준비되었는지는 GET /health로 확인합니다.
  • POST /synthesize는 text, voice, lang, seed, normalize가 든 JSON을 받아 16비트 모노 WAV로 답합니다.
  • 기본적으로 요청 하나는 5,000자까지 받습니다(SUPERCLONICA_MAX_TEXT). 긴 글은 문단별로 나누세요.

Ruby에서 호출하기

gem은 필요 없습니다: require "net/http"; require "json"; uri = URI("http://localhost:8000/synthesize"); res = Net::HTTP.post(uri, { text: "Ruby에서 안녕하세요!", voice: "F1", lang: "ko" }.to_json, "Content-Type" => "application/json"); File.binwrite("hello.wav", res.body) if res.is_a?(Net::HTTPSuccess). 카탈로그 목소리는 기본 이름 대신 읽어 들인 파일을 보내세요: voice: JSON.parse(File.read("voice.json")). 앱에서 이미 Faraday나 HTTParty를 쓴다면 같은 방식으로 쓰면 됩니다.

Rails: 백그라운드 작업과 Active Storage

Rails에서는 웹 요청 안이 아니라 Active Job에서 음성을 만들고, 결과를 레코드에 첨부하세요: post.audio.attach(io: StringIO.new(res.body), filename: "post-#{post.id}.wav", content_type: "audio/wav"). 텍스트가 바뀔 때만 다시 만드세요. 포트 8000을 인터넷에 열지 마세요. 서버에 SUPERCLONICA_API_KEY를 설정해 Authorization: Bearer 헤더로 보내거나, 서버를 비공개 네트워크에 두세요. 오디오가 생성된 것임을 청취자에게 알리세요.