단순히 여러 모델을 연결한 구조라기보다는 Kanana-v(Vision)와 Kanana-a(Audio)를 Model Merging 방식으로 결합해 하나의 LLM backbone 위에서 동작하도록 설계된 통합 멀티모달 모델이라고 소개되고 있습니다.
말이 참 어렵습니다. 구조적으로 쉽게 이해해보자면 아래와 같습니다.
Audio Encoder (Whisper) // 사람의 귀처럼 음성을 텍스트 형태로 이해할 수 있는 정보로 바꿔줌 ↓ Audio Projector // 텍스트를 LLM이 이해할 수 있는 형태로 번역기처럼 가공해줌 ↓ LLM backbone // 사람의 뇌처럼 여러 데이터 보고 문맥 파악, 질문 이해, 결론 도출 ↑ Vision Encoder // 사람의 눈처럼 이미지를 읽어들여서 Vision Projector // 이미지를 LLM이 이해할 수 있는 형태로 번역기처럼 가공해줌 ↓ Voice Token LM // 사람의 성대처럼 목소리나 톤, 속도 등의 발화 스타일을 만들어줌 ↓ TTS (Voicebox + Univnet) // 사람의 입처럼 음성으로 말해줌
한줄 요약 :말을 하면 → 귀(Whisper)가 듣고 → 뇌(LLM)가 생각하고 → 필요하면 눈(vision) 정보도 같이 보고 → 합쳐서 이해한 뒤 → 입(TTS)으로 다시 말해주는 모델
당연히 짚고 넘어가야 할
음성 처리 방식
한국어 음성 특화 모델인 만큼, Kanana-o의 음성 구조에서 중요한 부분은 말투가 결정되고 만들어지는 단계입니다.
흥미로운 점은, 텍스트 응답을 먼저 생성한 뒤 -> 음성 토큰으로 변환하는 two-stage 방식이 특징입니다.
음성 → Whisper → 임베딩 ↓ LLM 이해 ↓ 텍스트 응답 생성 ↓ Voice Token LM // 어떤 말투로 말할지 결정하는 곳 (억양, 톤, 속도, 감정 등) ↓ Token → Mel spectrogram // 위에서 결정된 성대 진동 패턴을 만드는 단계 ↓ Vocoder → 음성
Kanana-v(Vision)의
사진 처리 방식
흥미로운 점은, 이미지를 LLM이 이해할 수 있는 형태로 변환할때 LLM에 바로 넣지 않고,
Vision Encoder → Projector → LLM구조를 거쳐,
이미지 정보를 LLM이 이해할 수 있는 embedding 형태로 변환하는 방식이 특징입니다.
사진 입력 ↓ Vision Encoder (CLIP 기반) // 이미지 특징 추출 ↓ Image Feature Embedding // 고차원 feature로 표현 ↓ C-Abstractor (Projector) // feature를 LLM이 이해할 수 있는 토큰(Visual Token) 형태로 변환 ↓ LLM 입력 // 이미지 + 텍스트 context 함께 이해 ↓ 텍스트 응답 생성 // 사진 설명, 객체 인식, OCR, 차트 해석 등 수행
둘러 볼 만한
카카오의 차별화 전략
1) 멀티모달 데이터셋 직접 구축
텍스트 입력에서는 정확하고 풍부한 설명을 제공하던 모델이, 동일한 질문을 오디오로 전달하면 답변 품질이 저하될 수도 있다고 합 니다. 모달리티에 따라 답변 품질이 다르다는 것.
카카오는 이를 해결하고자
단순한 양의 확보를 넘어, 난이도·도메인 다양성·모달 조합의 균형까지 모두 고려한 구조화된 데이터셋을 직접 설계 구축함으로써,
모달리티에 무관하게 멀티모달 지시 이행 능력 고도화를 진행했다고 합니다.
텍스트로 "~방법 알려줘" => 답변 품질 좋음 VS 음성으로 "~방법 알려줘" => 답변 품질 떨어짐(모달리티별 성능 차이) => 데이터셋 확보 => 멀티모달 지시 이행 능력 개선
2) 멀티턴 memory 기반 음성 대화
일반적인 LLM => [질문 → 답변], [질문 → 답변], [질문 → 답변] 학습 => 질문하면 답변하고 끝. VS Kanana-o => 하나의 Sequence로 [대화 전체] 학습 => 대화 흐름 유지 + context 기억 + tone 유지.
3) 감정 음성 (DPO 학습)
결론부터 말하면, AI가감정 없이 읽는 음성이 아니라, 사람처럼 감정을 담아서 말하도록 훈련했다는 겁니다.
단순 TTS가 아니라, DPO(Direct Preference Optimization) 방식으로 감정 표현을 학습했다고 합니다.
예를들면 아래와 같습니다.
일반 AI => "감사합니다" => 감정이 없음 VS Kanana-o => "감사합니다;;" => 딱딱 당황 => 이건 별로라는걸 AI에게 계속 가르침 => 부정 톤 학습 Kanana-o => "감사합니다." => 정중 미지근 => 무미건조한걸 AI에게 계속 가르침 => 평범 톤 학습 Kanana-o => "감사합니다~!" => 밝고 긍정적 => 이게 더 좋다는걸 AI에게 계속 가르침 => 긍정 톤 학습
앞으로 기대해도 좋은
미래 성장 로드맵
Kanana-o 모델의 성장은 멈추지 않습니다. 카카오의 다음 목표는 아래와 같습니다.
1. Full-duplex 대화 =>서로 쉼 없이 동시에 말할 수 있고, 남의 말도 끊을 수 있고, 정말 사람처럼. 2. On-device 경량화 => 클라우드 의존 없이, 기기 안에서 바로 실행 3. 음성 외 모든 오디오 생성 => 박수소리, 게임 사운드, 고기 굽는 소리 등 다른 소리도 만들자. 4. Human preference alignment => AI를 취향에 맞게 조정하는 것
# 음성 청크 수집 및 병합 (샘플 코드)
audio_chunks = []
for chunk in stream_response:
audio_data = extract_audio(chunk)
if audio_data:
save_wav_chunk(audio_data, chunk_index)
audio_chunks.append(audio_data)
merge_wav_chunks(audio_chunks, output_path="result/output.wav")
(4) 음성 UX — 아이들 타임아웃 & 녹음 충돌 방지
음성 대화 모드에서 UX를 다듬는 데 생각보다 많은 공이 들었습니다.
Voice Idle Timeout: 일정 시간 침묵 시 자동으로 녹음 종료 처리
이중 API Key: 쿼터 제한 대응을 위해 두 개의 API 키를 번갈아 사용
녹음 충돌 모달: 녹음 중 재시작 시도 시 경고 다이얼로그 표시
뮤트 기능: 음성 응답 재생 중 음소거 토글
// 아이들 타임아웃 처리 (샘플 코드)
function startIdleTimer() {
idleTimer = setTimeout(() => {
if (isRecording) stopRecording();
}, IDLE_TIMEOUT_MS);
}
(5) 사투리 페르소나 구현
시스템 프롬프트에 방언 가이드를 명시해 서울 표준어 · 부산 사투리 두 가지 페르소나를 구현했습니다. 별도로 TTS 화자(A / B)는 목소리 톤 선택 제공되며, 방언과 화자는 독립적으로 조합할 수 있습니다.
인사말, 에러 메시지, 안내 문구 등도 방언별로 분기 처리해 전체적인 일관성을 유지했습니다.
이미지를 함께 전달하면 모델이 지정한 출력 형식을 무시하는 경우가 있습니다. FORMAT 태그 + Few-shot 예시를 함께 쓰면 준수율이 높아집니다.
이미지를 분석하고, 반드시 아래 [FORMAT] 안의 형식으로만 답하세요.
다른 텍스트는 절대 포함하지 마세요.
[FORMAT]
KEYWORD: <키워드1>, <키워드2>
LEVEL: <junior|mid|senior>
[/FORMAT]
--- 예시 ---
입력: (백엔드 개발자 명함 이미지)
출력:
[FORMAT]
KEYWORD: Java, Spring Boot, AWS
LEVEL: mid
[/FORMAT]
이 부분은 다른 테스터분들의 프롬프트 전략도 궁금한 포인트입니다. 좋은 방법이 있다면 공유해 주세요!
(3) 사투리 시스템 프롬프트 예시
TTS 화자 프리셋뿐만 아니라, 시스템 프롬프트에 방언 규칙과 예시를 구체적으로 명시하면 효과가 더 좋습니다.
당신은 부산 출신 AI 상담사입니다.
반드시 부산 사투리를 사용해 답변하세요.
[방언 규칙]
- ~습니다 → ~습니더
- ~이에요 → ~이라예
- ~인가요? → ~인교?
[예시]
표준어: 무엇을 도와드릴까요?
부산어: 뭐 도와드릴까예?
표준어: 잠시만요.
부산어: 잠깐만예.
(4) 쿼터 소진 방지 테스트 팁
베타 기간 개발 중 쿼터를 아껴쓸 수 있는 방법을 고민해보았습니다.
텍스트 먼저 검증 — 음성 출력은 쿼터 소모가 빠를것으로 예상되어, 로직은 텍스트 모드로 먼저 검증
모달리티별 단독 우선 테스트 — 이미지 / 음성 조합 전에 각각 단독으로 먼저 테스트
(5) 앞으로 해보고 싶은 것들
아직 테스트해보지 못한 기능이 많습니다.
기능
활용 아이디어
Podcast-style Speech
채용 뉴스나 JD를 AI가 팟캐스트 형식으로 읽어주는 기능
감정 표현력 TTS
면접 상황에 따라 긴장감 있는 / 친근한 톤 전환
Audio Multiturn
음성만으로 연속 모의면접 진행
Image-to-Podcast
포트폴리오 이미지를 자동으로 음성 자기소개로 변환
시연 Shorts
서비스의 사용자 경험 시나리오는 아래와 같습니다.
부산 사투리 프로필로 변경
화자 선택
실시간 대화 모드 활성화 후 인사
커나나가 부산 사투리로 반갑게 응답
" 부산 사투리까지 하는 멀티모달 AI 등장... "
※ 20초부터 사투리 음성을 들으실 수 있습니다.
Kanana-o의 사투리를 실제로 들어보니 어떠셨나요?
사투리를 사용하지 않는 저로서는 이 발음이 정확한 사투리인지, 흉내 낸 발음인지 판단하긴 어려웠습니다.
응답 텍스트에는 "듣겠습니더"로 표시되어 있었지만, 음성에서는 "듣겠습니다"에 가깝게 발음된 것처럼 들리기도 했습니다.
다만 전반적인 한국어 발화 자체는 매우 자연스럽게 느껴졌습니다.
특히 실제 사람이 말하는 것처럼 말 사이의 호흡이나 템포가 자연스럽게 이어진다는 점이 인상적이었습니다.
서울 사람인 제 기준에서는 사투리 표현도 충분히 신기하고 인상적으로 들렸습니다.
(솔직히 저보다 커나나가 사투리를 더 잘하는 것 같습니다..)
테스트 한계
1. 멀티모달 요청에서 규칙 미준수
명함 이미지와 텍스트를 함께 입력했을 때 Tool Call처럼 활용하기 위해 특정 출력 형식을 명시했지만,
간혹 모델이 해당 형식을 그대로 따르지 않는 경우도 있었습니다.
프롬프트 설계를 조금 더 정교하게 다듬어야 할 부분도 있겠지만,
생성형 모델 특성상 출력 형식을 완전히 강제하기는 쉽지 않은 부분이 아닐까 생각했습니다.
다른 테스터분께서도 비슷한 경험을 공유해주신 것으로 보아,
향후 모델 측면에서도 점차 개선되지 않을까 기대하고 있습니다.
2. 일일 쿼터 제한
현재 1일 횟수 제한이 있으며, 잔여 쿼터 조회 기능은 아직 지원되지 않아, 개발 사이클 상 더딘 부분이 있지만, 베타 기간인 만큼 이해는 하고 있습니다.
친절하게 도움주시는 관계자분들께 항상 감사드립니다.
출처 https://api-omni.kanana.ai/
앞으로의 목표
명함 · 포트폴리오 이미지 기반 커리어 분석 기능 고도화
멀티턴 모의면접 흐름 구현
출력 형식 준수를 위한 프롬프트 전략 개선
풍부한 감정 표현력 테스트
다중 화자 대화 TTS 심층 테스트
출처 https://omni.kanana.ai/
처음 이런 기회를 주신 카카오 관계자분들께 감사드립니다. 앞으로 모델 성능이 개선될수록 더 많은 가능성이 열릴 것 같아 기대됩니다.
맺음말
다른 테스터분들은 어떻게 Kanana-o를 활용하고 계신가요? 디스코드 혹은 댓글로 편하게 공유해 주세요!