시작하기 전에
- 실시간 전사 API가 켜진 워크스페이스. 조건은 개요를 참고하세요.
- 그 워크스페이스에 묶인 API Key. Scope를 지정했다면
realtime_transcription:write가 있어야 해요. 키를TIRO_API_KEY환경 변수에 넣어 두세요. - Python 3.9 이상과
websocket-client패키지.pip install websocket-client로 설치하세요. - 오디오 파일을 PCM으로 바꿀
ffmpeg.
1
오디오를 16 kHz mono PCM으로 바꾸기
실시간 전사 API는 16,000 Hz, mono, signed 16-bit little-endian PCM만 받아요. 헤더 없는 raw 데이터여야 해요. 이 형식은 1초에 32,000바이트예요. 마이크 입력을 그대로 보낼 때도 같은 형식으로 맞추세요.
ffmpeg로 아무 오디오 파일이나 이 형식으로 바꾸세요.2
세션 만들기
고객 서버에서 세션을 만드세요. 이 예제는 한국어를 전사하고 영어로 번역해요. 번역이 필요 없으면 성공하면
translationLocale을 빼세요.201 Created와 함께 세션을 받아요.streamToken은 이 응답에서 한 번만 받을 수 있어요. 세션이 OPEN인 동안 다시 연결할 때도 같은 토큰을 쓰니 안전하게 보관하세요. wsUrl은 직접 조립하지 말고 받은 값을 그대로 쓰세요.3
WebSocket 연결하기
클라이언트에서 연결되면 첫 메시지로
wsUrl에 연결하고 Authorization 헤더에 streamToken을 넣으세요. 쿼리 문자열이나 쿠키로는 토큰을 보낼 수 없어요.session.started를 받아요. 보통 1초 안팎에 오고, 드물게 수십 초 걸려요. 이 메시지를 기다리지 않고 오디오를 먼저 보내도 돼요.4
오디오를 보내고 결과 받기
오디오를 3,200바이트(100 ms) 단위로 잘라 바이너리 프레임으로 보내세요. 녹음된 파일을 보낼 때도 실제 시간 속도에 맞춰 보내야 해요. 실제 경과 시간보다 60초 넘게 앞서면 연결이 close
4029로 닫혀요.결과는 transcript와 translation 텍스트 메시지로 와요. 같은 segmentId의 isFinal: false 메시지는 화면의 이전 텍스트를 통째로 바꾸고, isFinal: true가 오면 그 문장이 확정돼요.5
세션 닫기
마지막 오디오를 보낸 뒤 WebSocket을 쓸 수 없는 상황이면 고객 서버에서
{"type": "session.end"}를 보내세요. Tiro가 남은 결과를 isFinal: true로 모두 보내고 session.ended를 보낸 다음 close 1000으로 연결을 닫아요. session.ended를 받을 때까지 연결을 유지하세요. 남은 결과를 보내는 데는 최대 30초가 걸려요.POST /v1/external/realtime-transcriptions/{id}/end를 호출해 세션을 닫으세요.전체 예제
아래 스크립트는 위 단계를 하나로 묶은 거예요. PCM 파일을 실시간 속도로 보내고, 결과를 출력하고, 세션을 닫아요. 연결이 끊기면 재접속하지 않고 REST로 세션을 닫아요. 재접속을 구현하려면 재접속 규칙을 따르세요.stream_pcm.py 전체 코드 보기
stream_pcm.py 전체 코드 보기
stream_pcm.py
다음 단계
WebSocket 프로토콜
메시지 필드, 에러, 재접속, close code를 확인하세요.
API 레퍼런스
세션 생성, 조회, 목록, 종료 REST API를 확인하세요.