요약: Google Gemini API release notes는 2026년 6월 17일 gemini-3.1-flash-tts-preview 모델에서 speech generation 스트리밍을 지원한다고 공지했습니다. streamGenerateContent와 Interactions API의 stream:true를 사용할 수 있습니다. 음성 챗봇, 콜센터 보조, 교육 앱을 만드는 팀이라면 “완성된 음성 파일을 기다리는 구조”에서 “말이 만들어지는 즉시 재생하는 구조”로 바꿀 수 있습니다.
텍스트 생성에서는 스트리밍이 이미 익숙합니다. 첫 토큰이 빨리 보이면 사용자는 시스템이 일하고 있다고 느낍니다. 음성 생성도 같습니다. 15초짜리 답변을 모두 만든 뒤 재생하면 사용자는 15초 가까이 기다린다고 느낄 수 있습니다. 반대로 앞부분 오디오가 1~2초 안에 나오면 전체 생성 시간이 같아도 체감 지연은 크게 줄어듭니다.
Gemini API의 6월 17일 release notes는 gemini-3.1-flash-tts-preview에서 스트리밍 speech generation을 지원한다고 적고 있습니다. 지원 경로는 streamGenerateContent와 Interactions API의 stream:true입니다. 이 업데이트는 단순 기능 추가라기보다 음성 제품의 아키텍처 선택지를 넓힙니다.
기존 구조는 보통 요청, 전체 음성 생성, 파일 저장, 재생 순서였습니다. 스트리밍 구조는 요청, 첫 오디오 chunk 수신, 재생 시작, 나머지 chunk 이어붙이기로 바뀝니다. 이 차이 때문에 프론트엔드 플레이어, 네트워크 재시도, 캐시, 로그 설계가 모두 달라집니다.
스트리밍은 대화형 제품에 적합합니다. 예를 들어 AI 튜터가 학생 질문에 답하거나, 고객 상담 보조가 상담원에게 문장을 읽어주거나, 운전 중 음성 비서가 짧은 안내를 말하는 경우입니다. 사용자가 기다리고 있는 상황에서는 첫 소리까지 걸리는 시간이 핵심 지표입니다.
반대로 완성 파일 품질이 더 중요한 경우에는 비스트리밍 방식이 나을 수 있습니다. 광고 내레이션, 팟캐스트 인트로, 영상 더빙처럼 후처리와 재생 위치 조정이 필요한 콘텐츠는 전체 파일을 받은 뒤 검수하는 편이 안전합니다. 스트리밍은 중간 chunk를 바로 재생하기 때문에 뒤쪽 문맥을 보고 앞쪽 발화 톤을 바꾸는 식의 후처리가 어렵습니다.
따라서 제품별로 다음 기준을 정하면 됩니다.
스트리밍 구현에서 자주 하는 실수는 API에서 받은 chunk를 클라이언트로 그대로 넘기면 끝이라고 생각하는 것입니다. 실제 운영에서는 chunk 순서, 끊김, 중복, 재시도, 취소를 처리해야 합니다. 네트워크가 흔들리면 같은 문장의 일부가 두 번 재생되거나, 마지막 chunk가 빠진 채 재생 완료로 표시될 수 있습니다.
서버에는 최소한 세 가지 상태가 필요합니다. 첫째, request_id입니다. 사용자가 같은 질문을 빠르게 두 번 보냈을 때 이전 스트림을 취소하거나 무시해야 합니다. 둘째, sequence 번호입니다. chunk 순서를 검증하고 누락을 감지해야 합니다. 셋째, final 이벤트입니다. 재생이 정상 종료됐는지, 중간에 끊겼는지 구분해야 합니다.
또한 텍스트와 음성을 분리해 로깅하는 편이 좋습니다. 음성 데이터 자체를 오래 저장하지 않더라도, 어떤 텍스트가 어떤 음성 요청으로 이어졌는지, 첫 chunk까지 몇 ms가 걸렸는지, 전체 재생 시간이 얼마였는지는 남겨야 합니다. 그래야 모델 변경이나 네트워크 이슈가 생겼을 때 원인을 좁힐 수 있습니다.
브라우저나 모바일 앱은 오디오 chunk를 받는 즉시 재생할 수 있어야 하지만, 너무 공격적으로 재생하면 끊김이 들립니다. 처음 300~800ms 정도를 버퍼링하고 재생을 시작하는 전략이 현실적입니다. 네트워크 품질이 낮은 사용자는 버퍼를 조금 더 크게 잡고, 와이파이 환경에서는 더 짧게 잡는 식으로 조정할 수 있습니다.
사용자 경험에서 중요한 것은 “멈춘 것처럼 보이지 않는 것”입니다. 재생 전에는 작은 로딩 인디케이터를 보여주고, 재생 중 chunk가 늦어지면 자연스러운 pause UI를 표시합니다. 갑자기 처음부터 다시 재생하는 방식은 피해야 합니다. 음성 대화에서 중복 재생은 텍스트 중복보다 훨씬 거슬립니다.
모바일에서는 백그라운드 전환도 고려해야 합니다. 사용자가 앱을 잠깐 내렸을 때 스트림을 계속 유지할지, 중단할지, 다시 들어왔을 때 이어서 재생할지 정책을 정해야 합니다. 교육 앱처럼 문맥이 중요한 경우에는 이어듣기가 좋고, 실시간 상담처럼 현재성이 중요한 경우에는 취소가 더 안전합니다.
TTS 스트리밍은 지연 시간을 줄이지만, 비용 최적화를 자동으로 해주지는 않습니다. 오히려 대화형 UX가 좋아지면 사용량이 늘 수 있습니다. 따라서 음성으로 읽을 문장과 화면에만 보여줄 문장을 구분해야 합니다. 모든 설명을 음성화하면 길고 비싸고 피곤합니다.
추천 방식은 응답을 세 층으로 나누는 것입니다.
예를 들어 개발 문서 Q&A 앱이라면 음성은 “원인은 인증 토큰 만료입니다. refresh token 재발급 로그를 먼저 확인하세요” 정도로 짧게 말하고, 화면에는 curl 예제와 로그 필터를 보여줍니다. 음성과 화면의 역할을 나누면 비용과 UX를 동시에 잡을 수 있습니다.
출처: Google Gemini API release notes, 2026년 6월 17일 Streaming support for speech generation 공지.