가이드

C#과 .NET에서 오프라인 텍스트 음성 변환

C#에서 말하게 하는 고전적인 방법은 System.Speech입니다. 몇 줄이면 되고, Windows 목소리를 쓰며, 인터넷도 필요 없습니다. 지금도 동작하지만 Windows 전용이고, 목소리는 낡게 들리며, 컴퓨터마다 다릅니다. 클라우드 서비스는 소리가 더 좋지만 모든 텍스트를 밖으로 보내고 글자 수로 요금을 받습니다.

이 가이드는 세 번째 방법을 보여 줍니다. 무료 SuperClonica 엔진을 로컬 HTTP 서버로 띄워 Windows, Linux, macOS의 어떤 .NET 앱에서든 호출하는 방식으로, 목소리는 자연스럽고 WAV 파일은 내 손에 남습니다.

.NET에서 말하는 세 가지 방법

Windows에서 빠른 시제품이라면 System.Speech로 충분하고, 어디서나 같게 들리는 제품 목소리라면 엔진을 쓰세요.

  • System.Speech: Windows 내장, 오프라인, 로봇 같은 목소리, Windows 전용.
  • 클라우드 음성 API: 자연스러운 목소리지만 계정, 키, 글자 수 요금, 그리고 텍스트가 남의 서버로.
  • SuperClonica: 자연스러운 목소리, 캐릭터·맞춤 목소리를 쓰는 로컬 서버. 오프라인이며 Docker가 돌아가는 모든 OS에서.
  • 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이거나 목소리 파일의 JSON 내용입니다.

C#에서 호출

System.Net.Http, System.Text, System.Text.Json.Nodes를 쓰면 .NET 6 이상에서 요청은 몇 줄이면 됩니다: using var http = new HttpClient(); var voice = JsonNode.Parse(File.ReadAllText("voice.json")); var body = new JsonObject { ["text"] = "C#에서 안녕하세요!", ["voice"] = voice, ["lang"] = "ko", ["seed"] = 7 }; var res = await http.PostAsync("http://localhost:8000/synthesize", new StringContent(body.ToJsonString(), Encoding.UTF8, "application/json")); File.WriteAllBytes("hello.wav", await res.Content.ReadAsByteArrayAsync()); 기본 목소리라면 파일을 불러오는 대신 ["voice"] = "F1"로 지정하세요. 같은 텍스트, 목소리, seed면 항상 같은 소리가 나므로 반복되는 문구의 파일은 캐시하고, 앱이 이미 쓰는 오디오 라이브러리로 재생하세요.

운영 환경 습관

HttpClient는 앱이 살아 있는 동안 하나만 쓰세요. 포트 8000을 그대로 인터넷에 열지 마세요. SUPERCLONICA_API_KEY를 설정해 Bearer 토큰으로 보내거나, 사설 네트워크 안에 두세요. 동시 요청이 많다면 SUPERCLONICA_LANES로 모델 사본을 늘리고, 내 하드웨어에서 측정하세요. 우리 테스트에서 짧은 문장은 RTX 5070 Ti에서 0.12초, CPU 4스레드에서 0.43초 걸렸습니다.