AI_TRANSCRIBE
AI_TRANSCRIBE
AI_TRANSCRIBE는 스테이지에 저장된 오디오·비디오 파일을 전사해 텍스트, 타임스탬프, 화자 정보를 추출하는 완전 관리형 SQL 함수예요. AI_TRANSCRIBE가 처리할 파일을 저장하기에 적합한 스테이지 생성에 대한 정보는 미디어 파일용 스테이지 생성 문서를 참고하세요.
내부적으로 AI_TRANSCRIBE는 전사와 화자 분리(diarization)를 위한 최적화된 AI 모델을 오케스트레이션하며, 최대 2시간 길이의 오디오 파일을 처리해요. AI_TRANSCRIBE는 수평 확장이 가능해서, 여러 파일을 동시에 처리해 효율적인 배치 처리를 지원해요. 불필요한 데이터 이동을 피하기 위해 오디오를 객체 스토리지에서 직접 처리할 수 있어요.
기본적으로 AI_TRANSCRIBE는 오디오 파일을 깨끗하고 읽기 쉬운 텍스트로 변환해요. 각 단어 또는 화자 변경에 대한 타임스탬프를 추출하도록 타임스탬프 세분성을 지정할 수도 있어요. 단어 수준 타임스탬프는 자막 같은 애플리케이션이나, 사용자가 전사에서 단어를 클릭해 오디오의 특정 부분으로 이동하게 하는 데 유용해요. 화자 수준 타임스탬프는 회의, 인터뷰, 전화 통화에서 누가 무엇을 말했는지 이해하는 데 유용해요.
| 타임스탬프 세분성 모드 | 결과 |
|---|---|
| 기본값 (Default) | 전체 오디오 파일을 한 조각으로 전사 |
| Word | 각 단어에 대한 타임스탬프와 함께 전사 |
| Speaker | 각 화자 변경 시 누가 말하는지와 타임스탬프 표시 |
본문
문법
AI_TRANSCRIBE( <audio_file> [ , <options> ] [, <return_error_details> ] )
인자
audio_file (필수) — 오디오 파일을 나타내는 FILE 타입 객체예요. TO_FILE 함수를 사용해 스테이지된 파일에 대한 참조를 만드세요.
options (선택) — 다음 필드를 0개 이상 담은 OBJECT 값이에요.
timestamp_granularity: 원하는 타임스탬프 세분성을 지정하는 문자열. 가능한 값:"word": 파일이 각자 고유한 타임스탬프를 가진 일련의 단어로 전사됨."speaker": 파일이 각자 고유한 타임스탬프와 화자 레이블을 가진 일련의 대화 "턴"(turn)으로 전사됨. 이 필드를 지정하지 않으면 기본적으로 파일 전체가 타임스탬프 없이 단일 세그먼트로 전사됨.
return_error_details (선택) — 오류 발생 시 오류 세부 정보를 반환할지 나타내는 BOOLEAN 플래그예요. TRUE로 설정하면 함수는 값과 오류 메시지를 담은 OBJECT를 반환하는데, 함수의 성공/실패 여부에 따라 둘 중 하나는 NULL이에요. 자세한 내용은 Error behavior 참고.
반환
전사 결과의 JSON 표현을 담은 문자열을 반환해요. JSON 객체는 다음 필드를 담아요.
"audio_duration": 오디오 파일의 총 길이(초)."text": timestamp_granularity 필드를 지정하지 않았을 때 제공되는, 완전한 오디오 파일의 전사."segments": timestamp_granularity 필드를 "word" 또는 "speaker"로 설정했을 때 제공되는 세그먼트 배열. 각 세그먼트는 다음 필드를 담은 JSON 객체예요."start": 세그먼트의 시작 시간(초)."end": 세그먼트의 종료 시간(초)."text": 세그먼트의 전사 텍스트."speaker_label": timestamp_granularity 필드를 speaker로 설정했을 때 제공되는, 세그먼트의 화자 레이블. 레이블은 "SPEAKER_00", "SPEAKER_01" 등의 형태이며 오디오 파일에서 화자가 감지되는 순서대로 할당됨.
오류 동작 (Error behavior)
기본적으로 AI_TRANSCRIBE가 입력을 처리할 수 없으면 함수는 NULL을 반환해요. 쿼리가 여러 행을 처리하면 오류가 있는 행은 NULL을 반환하고 쿼리가 완료되는 것을 막지 않아요.
오류 시 반환 값은 return_error_details 인자에 따라 달라져요. 다음 표는 return_error_details 인자에 따른 반환 값을 보여줘요.
| return_error_details | 반환 값 | 설명 |
|---|---|---|
| FALSE / 전달 안 함 | NULL | |
| TRUE | value와 error 필드를 가진 OBJECT | value: 전사 결과를 담은 VARCHAR 값, 오류가 발생했으면 NULL. error: 오류가 발생했으면 오류 메시지를 담은 VARCHAR, 함수가 성공하면 NULL. |
AI 함수의 오류 처리에 대한 자세한 내용은 Snowflake Cortex AI Function: Multirow error handling improvements 문서를 참고하세요.
접근 제어 요구사항
사용자는 SNOWFLAKE.CORTEX_USER 데이터베이스 역할이 부여된 역할을 사용해야 해요. 이 역할에 대한 자세한 내용은 Cortex LLM 권한을 참고하세요.
사용 노트
AI_TRANSCRIBE는 다음 오디오·비디오 파일 형식을 지원해요.
| 오디오 | AAC, FLAC, M4A, MP3, MP4, OGG, WAV, WEBM |
|---|---|
| 비디오 | MKV, MOV, MP4, OGV, WEBM |
비디오 파일은 최소한 하나의 오디오 트랙을 포함해야 해요. 모든 파일에 대해 오디오 트랙은 지원되는 코덱 중 하나로 인코딩되어야 해요: AAC, ALAC, FLAC, MP3, Opus, Vorbis, PCM.
샘플 레이트, 비트 깊이, 채널 수 같은 요소는 전사에 영향을 주지 않지만, 너무 높으면 파일이 처리하기에 너무 커질 수 있어요. 내부적으로 AI_TRANSCRIBE는 16kHz 단일 채널(모노포닉) 오디오를 사용하며, 입력 파일이 이미 이 형식이 아니면 리샘플링해요.
최대 오디오 파일 크기는 700 MB예요.
타임스탬프 세분성이 "word" 또는 "speaker"로 설정되면 최대 오디오 파일 길이는 60분이에요. 타임스탬프 세분성을 사용하지 않으면 최대 길이는 120분이에요.
지원 언어
AI_TRANSCRIBE는 다음 언어를 지원하며, 자동으로 감지돼요. 파일은 여러 지원 언어를 포함할 수 있어요.
참고: 언어 감지는 오디오가 파일의 처음 5초 안에 시작되도록 요구해요. 최상의 결과를 위해 업로드 전에 과도한 침묵을 잘라내세요.
아랍어, 불가리아어, 광둥어, 카탈루냐어, 중국어, 체코어, 네덜란드어, 영어, 프랑스어, 독일어, 그리스어, 히브리어, 힌디어, 헝가리어, 인도네시아어, 이탈리아어, 일본어, 한국어, 라트비아어, 말레이어, 노르웨이어, 폴란드어, 포르투갈어, 루마니아어, 러시아어, 세르비아어, 슬로베니아어, 스페인어, 스웨덴어, 태국어, 터키어, 우크라이나어.
비용 고려사항
모든 AI 함수의 청구는 토큰 소비를 기반으로 해요. 전사의 경우 언어나 세그멘테이션 방식과 무관하게 처리된 오디오 1초당 50토큰이에요. 따라서 오디오 1시간은 180,000토큰이에요. 백만 토큰 처리에 0.97 크레딧이 든다고 가정하고, Global 라우팅 기준 Snowflake AI 크레딧 1개가 미화 2.00달러라고 가정하면, 처리된 오디오 1시간당 약 미화 0.35달러가 들어요. 이 추정치는 변경될 수 있어요. 현재 가격 정보는 Snowflake Service Consumption Table을 참고하세요.
참고: AI_TRANSCRIBE에는 최소 청구 시간 10초가 있어요. 10초보다 짧은 파일도 처리되지만 10초로 청구돼요. 많은 수의 짧은 오디오 파일을 효율적으로 처리하려면 파일을 하나로 배치하고 타임스탬프로 결과 전사에서 각 원본 파일의 시작과 끝을 식별하는 것을 고려하세요.
예제
텍스트 전사
다음 예제는 financial_consultation 스테이지에 저장된 오디오 파일을 전사해 파일 전체의 텍스트 전사를 반환해요. TO_FILE 함수는 스테이지된 파일을 파일 참조로 변환해요.
SELECT AI_TRANSCRIBE(TO_FILE(
'@financial_consultation', 'consultation.wav'));
응답(일부 축약):
{"audio_duration":321.78,"text":"Good afternoon, Robert. Thanks for calling in
today. I understand you had some concerns about your portfolio you wanted to
discuss. Yes, I'm really worried. I've been watching the news and the market's
been all over the place lately. I'm thinking maybe I should just sell
everything ... The key is making sure we're protecting it in the right way.
Staying invested in a diversified portfolio, even with some volatility, has
historically been the best way to preserve and grow wealth over time. ... I'll
have the rebalancing done by tomorrow morning, and you should see the changes
reflected in your account by Thursday. Perfect. Thanks again, Sarah. I thank
you deeply for your patience and understanding. I'll talk to you next month."}
단어 수준 세그멘테이션과 타임스탬프
timestamp granularity를 "word"로 설정하면 말한 모든 단어에 대한 정밀한 타임스탬프를 추출할 수 있어서, 검색·탐색 가능한 전사를 만들 수 있어요. 이 오디오 파일은 스페인어라는 점에 유의하세요.
SELECT AI_TRANSCRIBE(TO_FILE('@financial_consultation', 'consultation_3_sp.wav'),
{'timestamp_granularity': 'word'});
응답 (간결함을 위해 축약됨; 전체 출력에는 오디오 파일에서 말한 각 단어에 대한 세그먼트가 있음):
{
"audio_duration": 150.66,
"segments": [
{
"end": 1.513,
"start": 0.031,
"text": "«Buenos"
},
{
"end": 2.034,
"start": 1.553,
"text": "días,"
},
{
"end": 2.334,
"start": 2.054,
"text": "doña"
},
{
"end": 4.457,
"start": 2.374,
"text": "Esperanza."
},
{
"end": 6.5,
"start": 5.578,
"text": "hoy?»"
},
...
],
"text": "«Buenos días, doña Esperanza. ¿En qué puedo ayudarla hoy?» «Roberto, quiero
hacer un cambio grande en mi portafolio. ... Ya veremos, Roberto. Gracias por tu ayuda.""
}
화자 인식
timestamp granularity를 "speaker"로 설정하면 대화나 회의에서 고유 화자를 감지·분리·식별할 수 있어요. 이 예제는 한 명은 영어를, 다른 한 명은 스페인어를 말하는 두 명의 화자가 있는 오디오 파일을 사용해요.
SELECT AI_TRANSCRIBE(TO_FILE('@financial_consultation', 'consultation_5_mix_es_en.wav'),
{'timestamp_granularity': 'speaker'});
응답 (간결함을 위해 축약됨; 전체 출력에는 오디오 파일의 각 대화 "턴"에 대한 세그먼트가 있음):
{
"audio_duration": 208.66,
"segments": [
{
"end": 3.076,
"speaker_label": "SPEAKER_00",
"start": 0.031,
"text": "Good afternoon, this is Aaliyah Johnson from Secure Financial Services."
},
{
"end": 4.297,
"speaker_label": "SPEAKER_02",
"start": 3.196,
"text": "How can I help you today?"
},
{
"end": 7.182,
"speaker_label": "SPEAKER_02",
"start": 5.139,
"text": "Hola, necesito ayuda con mis inversiones."
},
...
],
"text": "Good afternoon, this is Aaliyah Johnson from Secure Financial Services.
How can I help you today? Hola, necesito ayuda con mis inversiones. ... Muchísimas
gracias, María. Me siento mucho más tranquila ahora."
}
통화 전사 분석
AI_TRANSCRIBE의 출력을 다른 AI 함수에 전달해 추가 처리할 수 있어요. 예를 들어 AI_SUMMARIZE로 전사를 요약하거나 AI_CLASSIFY로 전사 내용을 분류할 수 있어요. 이 예제는 AI_SENTIMENT와 AI_COMPLETE를 사용해 고객 통화 오디오에서 전사된 텍스트를 분석하고 네 가지 차원의 감성과 에이전트에 대한 평가를 제공해요.
참고: AI_SENTIMENT는 텍스트만 분석하며 말투 같은 음성 특성은 고려하지 않아요.
WITH transcriptions AS
( SELECT TO_VARCHAR(AI_TRANSCRIBE(TO_FILE('@financial_consultation',
'consultation_1.wav'))) AS transcribed_call )
SELECT
AI_SENTIMENT(transcribed_call, ['Professionalism', 'Resolution',
'Wait Time', 'Market Conditions']) AS call_sentiment,
AI_COMPLETE('claude-4-opus', CONCAT('Summarize how the agent can improve in 50 words',
transcribed_call)) AS agent_assessment
FROM transcriptions
AI_SENTIMENT 응답:
{
"categories": [
{
"name": "overall",
"sentiment": "negative"
},
{
"name": "Market Conditions",
"sentiment": "negative"
},
{
"name": "Professionalism",
"sentiment": "negative"
},
{
"name": "Resolution",
"sentiment": "negative"
},
{
"name": "Wait Time",
"sentiment": "unknown"
}
]
}
AI_COMPLETE 응답:
"The agent needs significant improvement in empathy, active listening, and client-centered communication. Instead of
dismissing concerns and using condescending language, they should validate emotions, explain market conditions
professionally, present multiple options, and guide clients through informed decision-making while respecting their
risk tolerance and personal circumstances."
문제 해결 (Troubleshooting)
함수가 실패하면 오류를 발생시켜요. 일반적인 오류 메시지는 다음과 같아요.
| 오류 메시지 | 상황 및 해결책 |
|---|---|
| Invalid options object | 제공된 timestamp_granularity 필드의 옵션(제공된 경우)은 "word" 또는 "speaker"여야 함. |
| No response from server | 오디오 파일을 가져올 수 없음. 아마 만료된 scoped URL 때문일 수 있음. |
| File too large. Maximum size is 734,003,200 Bytes, file exceeds this limit. | 제공된 오디오 파일이 최대 파일 크기를 초과함. |
| Invalid file format. Only ['flac', 'mp3', 'ogg', 'wav', 'webm'] files are supported, or WebM file does not contain an audio stream. | 오디오 파일이 오류 메시지에 나열된 지원 형식 중 하나가 아님. WebM 파일은 여러 미디어 타입을 지원하므로 파일에 오디오 스트림이 포함되어 있는지 확인. 파일이 지원 형식이라면 손상되지 않았는지 확인. |
| File will be too large after resampling it to 16000 Hertz. Expected size is 3,355,444,448,000.0 Bytes. | 제공된 오디오 파일이 16kHz로 리샘플링한 뒤 너무 큼. 제공된 오디오의 샘플 레이트가 더 낮으면 리샘플링된 크기가 원본보다 커져 최대 허용 파일 크기를 초과할 수 있음. |
| Audio duration too long: 6052.10 seconds. Maximum allowed: 3600 seconds. 또는 Audio duration too long: 7335.28 seconds. Maximum allowed: 7200 seconds. | 제공된 오디오 파일이 너무 김. 타임스탬프 세분성을 사용한다면 최대 길이는 60분(3600초). |
| Unsupported detected language | 오디오 파일에 AI_TRANSCRIBE가 지원하지 않는 언어가 포함되어 있음. |
지역 가용성 (Regional availability)
AI_TRANSCRIBE는 다음 지역에서 사용할 수 있어요.
- AWS US West 2 (Oregon)
- AWS US East 1 (N. Virginia)
- AWS EU Central 1 (Frankfurt)
- Azure East US 2 (Virginia)
법적 고지
법적 고지는 Snowflake AI and ML을 참고하세요.