운영 주소: https://tts.erroop.com
인증: Authorization: Bearer <API_KEY>
모든 출처의 CORS를 허용합니다. 음성 생성에는 유효한 키가 필요합니다.
curl https://tts.erroop.com/v1/audio/speech \
-H "Authorization: Bearer $TTS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"Hello! What is your favorite animal?","voice":"af_heart","speed":0.9}' \
--output hello.wavTTS_API_KEY를 서버 환경변수에 저장하세요. 아래는 Node.js / Express 예제입니다.
app.post('/api/english-speech', async (req, res) => {
// 이 경로에는 웹앱의 사용자 인증과 사용량 제한을 적용하세요.
const response = await fetch('https://tts.erroop.com/v1/audio/speech', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TTS_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ input: req.body.text, voice: 'af_heart', speed: 0.9 }),
signal: AbortSignal.timeout(110000),
});
if (!response.ok) {
const retryAfter = response.headers.get('retry-after');
if (retryAfter) res.set('Retry-After', retryAfter);
return res.status(response.status).json(await response.json());
}
res.type('audio/wav').send(Buffer.from(await response.arrayBuffer()));
});const response = await fetch('/api/english-speech', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text: 'Great job! Let us try one more.' }),
});
if (!response.ok) throw new Error('음성을 만들지 못했어요.');
const url = URL.createObjectURL(await response.blob());
const audio = new Audio(url);
audio.addEventListener('ended', () => URL.revokeObjectURL(url), { once: true });
// 모바일 자동 재생 정책에 따라 재생 버튼에서 audio.play()를 호출하세요.
await audio.play();브라우저에서 직접 호출할 때도 Bearer 헤더를 보내면 됩니다. 다만 브라우저에 전달한 장기 API 키는 방문자가 확인할 수 있으므로, 배포할 웹앱에서는 위처럼 백엔드가 키를 보관하는 구성을 권장합니다.
| 항목 | 설명 |
|---|---|
| input | 영어 문장, 최대 1,000자 |
| voice | 기본 af_heart. /v1/voices에서 8개 목소리 조회 |
| speed | 0.5~2.0, 기본 1.0. 연습용으로 0.9부터 테스트 |
| 응답 | 24 kHz · mono · PCM16 WAV |
| 제한 | 키당 60회/분, 추론 1건 + 대기 4건 |
| 429 / 503 | Retry-After 초 이후 재시도. 무제한 재시도는 피하세요. |
| 데이터 | 문장·키를 로그에 기록하지 않음. WAV는 최대 5분·32 MiB 메모리 캐시 |