서버 정보 및 API Key
- WebSocket Endpoint:
wss://HOSTNAME/stream
- Client ID:
- API Key:
사용법
Initialization
- 웹소켓 접속 후 다음과 같이 세션 시작을 요청합니다.
- 출발어 1개와 도착어 여러개를 지정할 수 있습니다. 출발어 문장도 실시간으로 보여준다면 도착어에 출발어도 함께 포함시키는 것이 좋습니다.
- 소스 오디오 포맷은 현재 16000hz mono 16-bit integer PCM Audio만을 지원합니다.
{
"type": "start_async",
"client_id": CLIENT_ID,
"api_key": API_KEY,
"api_type": "SPEECH_TO_TEXT",
"timeliness": "INTERPRETING",
"source_data_format": {
"language_code": "en",
"audio_format": {
"sample_rate": 16000,
"channels": 1
}
},
"target_data_format": {
"language_code": "en",
"additional_language_code": ["ko", "es-419"]
},
"options": {}
}
- 세션이 잘 생성되면 다음과 같은 응답이 돌아옵니다. 오류 등을 리포팅할 때 세션 ID를 함께 주시면 좋습니다.
{"type": "started", "session_id": "7066244455fd45b9a157a146f4c6bad7"}
- 요청이 잘못되었거나 서버에 문제가 있는 경우 다음과 같은 에러 메시지가 옵니다.
{"type": "error", "error_code": 500, "error_msg": "Invalid language code: zz"}
오디오 및 번역 결과
- 세션 시작 후 오디오는 헤더가 없는 Raw PCM Audio를 Binary Message로 보내면 됩니다.
- 16-bit Integer 16khz mono PCM Audio만 지원합니다.
ffmpeg -i audio.mp3 -f s16le -acodec pcm_s16le -ac 1 -ar 16000 out.pcm
- 오디오는 0.5초 또는 0.25초 정도 단위로 보내는 것을 추천합니다.
- 실제 시간보다 많은 양의 오디오를 보내는 경우 딜레이가 생길 수 있습니다.
- 일정 시간 오디오를 보내지 않으면 접속이 끊깁니다. (Ping 메시지를 보내서 유지 가능)
- 오디오에서 문장이 인식되면 다음과 같이 결과를 돌려줍니다.
- 번역이 필요 없는 영어가 먼저 도착하고, 번역이 필요한 한국어는 조금 나중에 도착하는 것을 확인할 수 있습니다.
- 문장마다 고유번호인
seq
이 주어지며, 이를 통해 여러 언어의 문장을 매칭할 수 있습니다.
{ "type": "async", "seq": 1, "source_lang": "en", "target_lang": "en", "is_partial": true, "source": "good", "target": "good", "start_msec": 190, "end_msec": 400", ... }
{ "type": "async", "seq": 1, "source_lang": "en", "target_lang": "en", "is_partial": true, "source": "good morning", "target": "good morning", ... }
{ "type": "async", "seq": 1, "source_lang": "en", "target_lang": "ko", "is_partial": true, "source": "good", "target": "좋아요", ... }
{ "type": "async", "seq": 1, "source_lang": "en", "target_lang": "en", "is_partial": false, "source": "Good morning, everyone.", "target": "Good morning, everyone", ... }
{ "type": "async", "seq": 2, "source_lang": "en", "target_lang": "en", "is_partial": false, "source": "How are", "target": "How are", ... }
{ "type": "async", "seq": 1, "source_lang": "en", "target_lang": "ko", "is_partial": false, "source": "Good morning, everyone.", "target": "모두 좋은 아침입니다.", ... }
{ "type": "async", "seq": 2, "source_lang": "en", "target_lang": "en", "is_partial": false, "source": "How are you doing", "target": "How are you doing", ... }
{ "type": "async", "seq": 2, "source_lang": "en", "target_lang": "ko", "is_partial": false, "source": "How are", "target": "어떻게", ... }
- 위와 같이 언어마다 결과가 따로 오는 것이 처리가 불편하다면, 위 Initialization Request에서
type
을 start_async
대신 start
로 주면 항상 대응되는 번역 전후 문장이 함께 오게 됩니다. 이 경우 모든 언어의 번역이 끝난 뒤에 해당 문장 결과가 오기 때문에 딜레이가 조금 더 높을 수 있습니다.
세션 종료
- 세션 종료시 다음과 같이 종료 메시지를 보내고 접속을 끊으면 좋습니다.