문서
AI 보이스
글을 목소리로 읽어 주는 음성 합성입니다. 목소리 163개(한국어 127개·영어 전용 36개) 가운데 고르고, 감정·빠르기·음높이·음량을 어느 목소리든 같은 방식으로 조절합니다. 소리는 만들어지는 대로 흘려보내 첫 소리가 0.3~0.6초 안에 나옵니다.
가장 짧은 예
목소리 이름(key)과 읽을 문장만 주면 mp3 가 옵니다. 모델은 목소리가 알아서 정합니다.
curl -X POST https://futureinfra.ai/v1/ai/audio/speech \
-H "Authorization: Bearer $FI_KEY" -H "Content-Type: application/json" \
-d '{"voice":"fish-hayoon","input":"안녕하세요, 퓨쳐인프라입니다."}' \
--output hello.mp3
목소리 목록과 10초 미리듣기는 콘솔 AI 보이스 메뉴에서 볼 수 있습니다. 카드의 API 예시 복사를 누르면 위 명령이 그 목소리로 채워집니다.
목소리 고르기
GET /v1/ai/voices — 조건을 주면 서버가 거르고, q 는 설명·태그·용도에서 점수로 줄 세웁니다.
# 한국어 여성, 차분한 오디오북용, 첫 소리 0.7초 안, 3개만
GET /v1/ai/voices?language=ko&gender=female&q=오디오북 차분&maxFirstSoundMs=700&limit=3
# 무료로도 쓸 수 있는 목소리를 첫 소리 빠른 순으로
GET /v1/ai/voices?free=true&sort=fast
| 조건 | 값 |
|---|---|
q | 찾는 낱말(예: 광고 밝은, 뉴스, 명상). 어울리지 않는 용도에 걸리면 뒤로 밀립니다 |
gender · ageBand | female·male / 20대·30대·40대·50대 이상 |
language | ko(한국어 목소리) · en(영어 목소리 — Deepgram 은 영어 전용, ElevenLabs 는 한국어·영어 둘 다) |
mood · use | 분위기 7가지, 용도 8가지(응답의 filters 에 목록이 있습니다) |
emotion | 그 감정을 모델이 직접 받는 목소리만 |
pitchLevel · pace | 음높이(낮음~높음) · 말 빠르기(느림~빠름) — 같은 성별 목소리 사이의 위치 |
maxFirstSoundMs | 평균 첫 소리가 이 값(ms) 이하. 실시간 대화라면 600 안팎 |
free · maxKrwPer1k | 무료 모델로도 되는 목소리 · 1,000자당 값 상한 |
sort · limit | fast(첫 소리 빠른 순) · cheap(싼 순) · 개수 |
목소리마다 오는 값 가운데 고를 때 쓰는 것:
- description — 소리를 직접 듣고 쓴 설명(음높이·음색·빠르기·발음, 어울리는 장면). useCases·notFor 는 어울리는 곳과 안 어울리는 곳
- firstSoundMs — 요청부터 첫 소리까지 걸린 시간(공개 주소로 3번 잰 가운데 값)
- pitchHz·pitchLevel·pace·intonation — 소리 분석 값
- emotionSupport — 이 목소리의 모델이 감정 16가지를 어떻게 받는지(아래 "결과 확인" 참고)
- directionSupport — 자유 연기 지시를 모델이 직접 받는지
- krwPer1kChars·freeModel — 1,000자당 값, 무료로 합성할 때 쓸 모델 이름
조절 — 모든 목소리 공통
같은 이름의 값을 어느 목소리에 줘도 됩니다. 모델이 직접 못 하는 것은 우리가 받은 소리를 다듬어 맞춥니다.
| 값 | 범위 | 설명 |
|---|---|---|
emotion | 16가지 | happy·excited·calm·tender·confident·sad·moved·angry·surprised·fearful·nervous·embarrassed·disgusted·sarcastic·whisper (neutral=기본) |
intensity | low·medium·high | 감정 세기 |
direction | 200자 | 자유 연기 지시(예: "라디오 진행자처럼 다정하게"). 한국어로 써도 됩니다 |
speed | 0.5~2 | 말 빠르기 배율 |
pitch | -12~12 | 음높이(반음). 목소리 결은 그대로 둡니다 |
volume | -20~10 | 음량(dB) |
normalize | true·"exact"·false | 기본 켬 — 어떤 목소리든 같은 크기(-16 LUFS). "exact" 는 문장마다 정밀하게 맞춥니다 |
trimSilence | true·false | 앞뒤 무음 자르기 |
response_format · sampleRate | mp3·wav·ogg·pcm · 16000~48000 | 형식과 샘플레이트 |
model | 선택 | 보통은 비워 둡니다. freeModel 을 주면 무료로 합성합니다 |
{"voice":"gemini-kore","input":"드디어 합격했어요!",
"emotion":"moved","intensity":"high","speed":0.95,"pitch":1}
문장 속 괄호로도 됩니다
[ ] < > ( ) 어느 괄호든, 영어든 한국어든 같은 뜻으로 읽고 괄호는 소리 내어 읽지 않습니다.
"[속삭이듯] 비밀인데요, [웃음] 사실은 제가 만들었어요."
"<happy> 오늘도 좋은 하루!"
"(천천히) 한 번 더 말씀드릴게요. [쉼] 준비되셨나요?"
"[라디오 진행자처럼] 오늘의 첫 곡입니다."
- 감정 낱말(기쁘게·차분하게·긴장해서…) →
emotion - 빠르기 낱말(천천히·빠르게) →
speed - 소리 효과([웃음]·[한숨]·[쉼]·[숨]) → 그 자리에 모델마다 맞는 표기
- 그 밖의 괄호 속 문장 →
direction
결과 확인 — X-Voice-Controls
응답 헤더에 조절이 실제로 어떻게 들어갔는지 JSON(URL 인코딩)으로 옵니다. 조용히 무시하지 않습니다.
X-Voice-Controls: {"emotion":"approx","emotionAs":"fearful","speed":"verified",
"post":{"pitch":1,"normalize":"fixed","stream":true}}
| 값 | 뜻 |
|---|---|
verified | 들어서 확인한 방식으로 적용 |
best_effort | 모델 공식 방식으로 적용(세기는 모델에 따라 다름) |
approx | 그 감정 대신 가장 비슷한 감정으로(emotionAs) |
unsupported | 이 모델에는 적용할 방법이 없음 — 다른 목소리를 고르세요 |
post | 우리가 소리를 다듬은 내용(음높이·빠르기·음량·음량 맞춤·무음 자르기·흘려보내기) |
모델마다 잘하는 것
값은 1,000자 기준, 첫 소리는 목소리들의 가운데 값입니다(2026년 9~10월 실측).
| 모델 | 목소리 | 첫 소리 | 1,000자 | 강점 |
|---|---|---|---|---|
| Fish Audio | 한국어 18 | 0.28초 | 약 27원 · 무료 모델 있음 | 가장 빠름. 감정 폭이 넓고 연기 지시를 받습니다 |
| MiniMax | 한국어 49 | 0.51초 | 약 107원 | 캐릭터 목소리가 많습니다. 감정 7가지를 직접 받습니다 |
| xAI Grok | 한국어 5 | 0.53초 | 약 27원 | 속삭임·세기 조절이 또렷합니다 |
| Deepgram | 영어 36 | 0.61초 | 무료 | 영어 억양(미국·영국 등)이 다양합니다 |
| Google Gemini | 한국어 30 | 약 3.8초 | 약 58원 · Flash-Lite 더 쌈 | 연기 지시를 가장 잘 따릅니다. 긴 낭독·녹음용 |
| Qwen Audio 3.0 | 한국어 4 | 약 0.7초 | 약 23~31원 | 차분한 안내·아나운서 톤. 8개 언어 모두 또렷합니다 |
| ElevenLabs | 한국어·영어 21 | 약 1.0초 | 약 70원(v4 Turbo) · v4·v3 약 140원 | 웃음·한숨·속삭임을 문장 속 꼬리표로 직접 받습니다. 한 목소리로 한국어·영어를 모두 읽습니다 |
실시간 대화처럼 첫 소리가 중요하면 Fish·MiniMax·Grok, 미리 만들어 두는 낭독·광고라면 Gemini 가 잘 맞습니다.
무료 모델은 시험과 적은 양에 알맞습니다.
말할 수 있는 언어
모델마다 8개 언어 문장을 합성해 받아쓰기로 확인했습니다(2026년 9~10월). 목록의 speaks 값이고, ?speaks=ja 로 거를 수 있습니다.
| 모델 | 한국어 | 영어 | 일본어 | 중국어 | 스페인어 | 프랑스어 | 독일어 | 베트남어 |
|---|---|---|---|---|---|---|---|---|
| xAI Grok | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| MiniMax | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Google Gemini · Flash-Lite | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Qwen Audio 3.0 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ElevenLabs v4 · v3 · Flash v2.5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ElevenLabs Multilingual v2 · Turbo v2.5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — |
| Fish Audio | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | — |
| Deepgram | — | ✓ | — | — | ✓ | △ | ✓ | — |
억양은 목소리 본래 언어를 따릅니다. 한국어 목소리로 영어를 읽으면 한국어 억양이 조금 남습니다 — 영어가 중심이면 영어 목소리(Deepgram)를 고르세요.
프로그램에서 — 받는 대로 재생
응답은 만들어지는 대로 흘러옵니다. 파일로 받아도 되고, 받는 즉시 재생해도 됩니다.
# Python
import requests
r = requests.post("https://futureinfra.ai/v1/ai/audio/speech",
headers={"Authorization": f"Bearer {KEY}"},
json={"voice": "minimax-korean-calmlady", "input": "안녕하세요", "emotion": "tender"},
stream=True)
with open("out.mp3", "wb") as f:
for chunk in r.iter_content(4096):
f.write(chunk)
// JavaScript (브라우저)
const r = await fetch("/v1/ai/audio/speech", { method: "POST",
headers: { Authorization: "Bearer " + KEY, "Content-Type": "application/json" },
body: JSON.stringify({ voice: "grok-eve", input: "안녕하세요", pitch: 2 }) });
new Audio(URL.createObjectURL(await r.blob())).play();
AI 에이전트에서 — MCP
ai.voices 도구가 위 조건을 그대로 받습니다. 에이전트가 설명을 읽고 목소리를 고른 뒤 합성합니다.
ai.voices { "q": "광고 밝은", "language": "ko", "maxFirstSoundMs": 700, "limit": 5 }