<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sujin-koo.log</title>
        <link>https://velog.io/</link>
        <description>AI 😎</description>
        <lastBuildDate>Sun, 17 May 2026 14:30:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sujin-koo.log</title>
            <url>https://velog.velcdn.com/images/sujin-koo/profile/b8e9c288-b048-47d3-88d1-a8f595822437/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sujin-koo.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sujin-koo" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[대화 데이터셋 리뷰]]></title>
            <link>https://velog.io/@sujin-koo/%EB%8C%80%ED%99%94-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%85%8B-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@sujin-koo/%EB%8C%80%ED%99%94-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%85%8B-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Sun, 17 May 2026 14:30:20 GMT</pubDate>
            <description><![CDATA[<p>Open-Source Full-Duplex Conversational Datasets for Natural and Interactive Speech Synthesis</p>
<p>대화형 모델에 계속 관심을 갖고 있고, 데이터 파트가 궁금해 읽게 되었습니다. 논문에서 진행한 방식은 직접 녹음하는 방식이었는데 사실 비용 문제로 크롤링이나 합성에 비해 제가 따라서 적용하기는 어렵겠다는 생각이 들었습니다. 추가적으로 좀 더 대규모 데이터셋으로 실험한 모델 크기가 더 컸을 때 결과가 궁금했는데 아무래도 그런 규모를 직접 녹음하기는 어렵고 하다보니 없어서 아쉬웠습니다. 그래도 이렇게 녹음하는 게 데이터 퀄리티는 가장 높고 fine-tuning 용으로 적합하기 때문에 그런 부분에서 도움이 되는 논문이었습니다.</p>
<p>✔️ 배경</p>
<p>최근 대화형 TTS와 음성 에이전트가 더 자연스러워지려면, 단순히 문장을 또렷하게 읽는 것을 넘어서 사람처럼 짧게 맞장구치고, 겹쳐 말하고, 끼어들고, 반응 타이밍을 조절하는 능력이 중요해졌습니다.</p>
<p>문제는 기존 음성 코퍼스 대부분이 여전히 turn-based, 즉 “한 사람이 말하고 끝나면 다음 사람이 말하는” 반이중(half-duplex) 형태가 많다는 점입니다.</p>
<p>✔️ Main Problem and Key Approach</p>
<p>이를 위해 저자들은 중국어와 영어 두 언어에 대해, 화자 두 명이 각자 분리된 공간에서 독립적으로 녹음하되 실제 대화는 자유롭게 진행하는 수집 프로토콜을 설계했습니다. 이렇게 하면 대화는 자연스럽게 유지하면서도, 각 화자의 오디오는 깨끗한 개별 채널로 확보할 수 있습니다. 즉, 상호작용의 자연스러움과 학습용 음질이라는 두 가지 요구를 동시에 잡으려는 접근입니다.</p>
<ul>
<li><p>Full-duplex conversation: 두 사람이 완전히 번갈아가며 말하는 것이 아니라, 말과 듣기가 동시에 일어나며 overlap, backchannel, interruption이 자연스럽게 발생하는 대화 형태입니다.</p>
</li>
<li><p>Dual-track recording: 각 화자를 서로 다른 오디오 트랙에 분리해 녹음하는 방식입니다. 겹쳐 말해도 후처리나 학습 시 화자별 신호를 깨끗하게 다룰 수 있다는 장점이 있습니다.</p>
</li>
</ul>
<p>✔️ Dataset Design &amp; Annotation</p>
<ol>
<li>수집 방식</li>
</ol>
<p>데이터는 중국어와 영어 원어민을 크라우드소싱 플랫폼을 통해 모집해 구축했습니다. 중요한 점은, 가능하면 서로 이미 친한 두 사람을 짝으로 구성했다는 것입니다. 친구, 가족, 동료처럼 익숙한 관계일수록 사회적 긴장이 적고, backchannel이나 interruption 같은 자연스러운 상호작용이 더 잘 나온다고 본 것입니다. 대화 주제도 강하게 제한하지 않고, 참가자들이 스스로 관심 있는 주제를 고르게 했습니다.</p>
<ol start="2">
<li>녹음 포맷</li>
</ol>
<p>Speaker A와 Speaker B의 파형이 서로 다른 트랙으로 시간축에 정렬되어 있습니다. 한쪽이 말하는 동안 다른 쪽이 짧게 반응하거나, 두 사람의 발화가 부분적으로 겹치는 구조를 그대로 볼 수 있습니다. 최종 공개 포맷은 16-bit PCM, 16kHz의 dual-track WAV이며, track 1은 Speaker A, track 2는 Speaker B에 대응합니다. conversational overlap을 잃지 않으면서도 speaker-isolated training data를 제공한다는 점이 이 데이터셋의 가장 실용적인 포인트입니다.</p>
<ol start="3">
<li>전사와 어노테이션</li>
</ol>
<p>어노테이션도 단순 ASR transcript보다 한 단계 더 신경 썼습니다. 각 발화에는 화자 ID, 성별, 시작/종료 시각이 붙고, 동시 발화는 두 트랙에서 겹치는 시간 구간으로 표현됩니다. 또 저자들은 문자 정확도만이 아니라 문장부호, 문장 경계, 문맥적 완결성까지 중요하게 다뤘다고 강조합니다. 특히 VAD segmentation을 “소리가 끊기는 지점”이 아니라 의미적으로 완결된 단위에 맞추려 했다는 점이 흥미롭습니다.</p>
<ol start="4">
<li>데이터 구성</li>
</ol>
<p>전체 데이터는 중국어 10시간, 영어 5시간, 총 15시간입니다. 세부적으로는 중국어 27개 대화, 영어 8개 대화이며, 총 35개 conversation에 14명의 화자가 포함됩니다. T중국어는 6명의 화자가 2,306개 발화 세그먼트를, 영어는 8명의 화자가 4,149개 발화 세그먼트를 구성합니다. 전사 파일은 화자별로 정리되며, 침묵이나 듣기 구간에는 &quot;None&quot; 라벨도 부여됩니다.</p>
<p>✔️ Technical Validation</p>
<p>이 논문은 “데이터가 실제로 도움이 되는가?”를 보여주기 위해, 새 모델을 제안하기보다 CosyVoice-300M을 이 데이터셋으로 파인튜닝해 전후 비교를 수행합니다. 저자들은 중국어/영어 데이터를 각각 따로 파인튜닝했고, 세그먼트 길이는 중국어 약 30자, 영어 15단어 수준으로 제한하고, 너무 짧으면 다음 발화와 병합했습니다.</p>
<ol>
<li>객관 평가</li>
</ol>
<p>결과를 보면 prosody 관련 지표들이 특히 좋아졌음을 볼 수 있습니다.</p>
<ol start="2">
<li>주관 평가</li>
</ol>
<p>주관 평가는 언어별 원어민 10명씩을 모집해, 원본 모델(A)과 파인튜닝 모델(B)이 같은 텍스트를 읽은 샘플을 비교하게 했습니다. 각 청자는 80쌍을 평가했고, A/B 순서는 랜덤화된 single-blind 방식으로 제시됐습니다. 결과는 B가 약간 더 선호하는 것으로 나왔습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[LLM 에이전트 기업들을 어떻게 차별점을 가져가고 있을까?]]></title>
            <link>https://velog.io/@sujin-koo/LLM-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-%EA%B8%B0%EC%97%85%EB%93%A4%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%B0%A8%EB%B3%84%EC%A0%90%EC%9D%84-%EA%B0%80%EC%A0%B8%EA%B0%80%EA%B3%A0-%EC%9E%88%EC%9D%84%EA%B9%8C</link>
            <guid>https://velog.io/@sujin-koo/LLM-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-%EA%B8%B0%EC%97%85%EB%93%A4%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%B0%A8%EB%B3%84%EC%A0%90%EC%9D%84-%EA%B0%80%EC%A0%B8%EA%B0%80%EA%B3%A0-%EC%9E%88%EC%9D%84%EA%B9%8C</guid>
            <pubDate>Sun, 10 May 2026 13:02:29 GMT</pubDate>
            <description><![CDATA[<p>작성중</p>
<hr>
<p>AI EXPO 관람후기에서도 적었다시피 AI 기업이 살아남기 위해서는 결국</p>
<ol>
<li>소비자의 니즈 파악 (무작정 기술 먼저 개발x)</li>
<li>자기들만 할 수 있는 장점을 찾아 차별화 포인트 만들기 
가 필요합니다.</li>
</ol>
<p>그렇다면 현재 수많은 AI 솔루션 기업, 특히 LLM을 이용한 에이전트 기업들은 정말 많아지고 있는데 이런 기업들은 자신만의 장점을 어떻게 쌓아가고 있을까요? 이런 부분을 전체적으로 서베이하고, 나라면 무엇을 장점을 가져갈 수 있을지 고민해보려고 합니다. (물론 고민이 길어지기 보다는 프로덕트를 빠르게 내고 경험을 쌓으면서 차별화 포인트를 만드는게 빠르겠지만..! 사전 서베이로 진행)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AI EXPO 2026 국제인공지능대전 관람 후기]]></title>
            <link>https://velog.io/@sujin-koo/AI-EXPO-2026-%EA%B5%AD%EC%A0%9C%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5%EB%8C%80%EC%A0%84-%EA%B4%80%EB%9E%8C-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@sujin-koo/AI-EXPO-2026-%EA%B5%AD%EC%A0%9C%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5%EB%8C%80%EC%A0%84-%EA%B4%80%EB%9E%8C-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Thu, 07 May 2026 17:55:47 GMT</pubDate>
            <description><![CDATA[<p>코엑스에서 진행된 AI EXPO 2026 에 다녀왔습니다.</p>
<hr>
<h3 id="행사정보">행사정보</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/b1b58144-7ac9-46ed-97c1-b4c1c0d93c89/image.png" alt=""></p>
<ul>
<li>링크
코엑스 : <a href="https://www.coex.co.kr/exhibitions/%EA%B5%AD%EC%A0%9C%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5%EB%8C%80%EC%A0%84-2/">https://www.coex.co.kr/exhibitions/국제인공지능대전-2/</a>
국제인공지능대전: <a href="http://www.aiexpo.co.kr/home/v4.php?s=34">http://www.aiexpo.co.kr/home/v4.php?s=34</a></li>
<li>시간: 05/06(수) - 05/08(금) 10:00 - 17:00</li>
<li>장소: 코엑스 Hall A</li>
</ul>
<hr>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/5aba5ff9-51ea-4871-a44a-7e3a6d9e8409/image.png" alt=""></p>
<p>박람회는 크게 3가지 카테고리로 되어 있었습니다.</p>
<ul>
<li>AI 솔루션: AI 기술 영역</li>
<li>AI 인프라 및 플랫폼: AI 서비스를 만들고 운영하기 위한 기반 기술과 개발 환경 영역</li>
<li>AI+X 융합: AI를 다른 산업 분야와 결합해 산업별 문제를 해결하는 응용 영역</li>
</ul>
<p>이 중에서 제가 이번에 집중적으로 본 부분은</p>
<ol>
<li>음성 AI 솔루션 (특히 대화형 에이전트)</li>
<li>온디바이스와 로봇</li>
<li>전체적인 업계 동향 및 유즈케이스 탐색
이었습니다.</li>
</ol>
<hr>
<p>둘러보면서 결론적으로 느낀 점을 먼저 말씀드리자면 다음과 같습니다. 뻔한 말 같기는 하지만... ^^;</p>
<ol>
<li>실제로 돈을 벌 수 있는 사용자 니즈를 정확히 파악하고, 그에 맞는 효율적인 연구개발을 해야 한다.</li>
<li>경쟁사가 쉽게 따라 하기 어려운 자기만의 명확한 차별화가 있어야 한다.</li>
<li>결론적으로 AI 덕분에 서비스 개발 자체는 점점 쉬워지고 있지만, 그 서비스로 실제 돈을 벌고, 단기 제품이 아니라 장기적인 사업으로 끌고 가는 것은 훨씬 더 어려워지고 있다.</li>
<li>결국 중요한 것은 사용자 니즈를 정확히 이해하고, 시장에서 돈이 되는 문제를 찾고, 그 안에서 쉽게 따라오기 어려운 차별점을 만드는 것</li>
</ol>
<p>최근 제가 관심을 가지고 있는 대화형 에이전트를 예시로 말씀드리면, 요즘 대화형 에이전트 솔루션이 정말 많지 않습니까? LLM에 도구 호출을 연결해 에이전트를 만드는 방식도 점점 쉬워지고 있고, 관련 솔루션을 개발하는 기업도 이미 상당히 많습니다. 그렇다 보니 자연스럽게 “과연 어떤 차별점이 있어야 고객이 이 회사의 솔루션을 선택할까?”라는 질문이 들었습니다.</p>
<p>음성 에이전트도 동일합니다. 물론 도메인에 따라 다르겠지만, 일반적인 상담이나 업무 자동화 영역에서는 음성 자체의 품질보다 결국 LLM의 성능, 에이전트의 안정성, 업무 처리 정확도가 더 중요한 요소가 될 가능성이 높다고 생각합니다. 그렇다면 이미 LLM을 잘하는 기업들이 많은 상황에서, 음성 기업이 이 시장에서 쉽게 경쟁 우위를 가져갈 수 있을지에 대한 의문이 들었습니다.</p>
<p>예를 들어 일레븐랩스처럼 음성 합성 기술을 선도적으로 쌓아온 기업은 콘텐츠 제작처럼 음성의 다양성, 표현력, 품질 자체가 중요한 도메인에서는 분명 강점을 발휘할 수 있다고 생각합니다. 하지만 일반적인 상담 서비스에서도 그 정도의 음성 다양성이 핵심 경쟁력이 될 수 있을지는 다소 의문이 남습니다. 이 경우에는 오히려 자연스러운 음색보다 빠른 응답 속도, LLM 에이전트가 얼마나 실수 없이 업무를 처리하느냐가 더 중요해 보였습니다. (물론 일레븐랩스 테스트해봤을 때 음성 에이전트가 꽤 좋아보였지만 굳이 음성으로 예시를 들자면...!)</p>
<p>이렇게 보면 고객 입장에서는 “굳이 LLM을 잘하는 기업이 아니라 음성 기업의 솔루션을 선택해야 할 이유가 무엇일까?”라는 질문이 생길 수 있습니다. 이제는 적당히 괜찮은 TTS 솔루션도 많기 때문에, 기존 LLM 에이전트 프레임워크에 TTS를 붙여 사용하는 방식이 더 간단하게 느껴질 수도 있습니다. 또는 LLM은 LLM을 잘하는 기업에 맡기고, 음성 합성 기술만 별도로 가져오는 방식도 가능할 것입니다. 물론 Speech-to-Speech 기술이 본격적으로 상용화된다면 이야기는 달라질 수 있겠지만, 현재 당장 상용화 가능한 수준의 Speech-to-Speech 모델은 아직 제한적이라고 생각합니다.</p>
<p>결국 기존 시장에 비집고 들어가기 위해서는 니치한 영역을 잘 찾아야 한다는 생각이 들었습니다. 돌고 돌아 답은 사용자 니즈를 정확히 파악하고, 우리가 다른 기업보다 강점으로 가질 수 있는 영역을 찾아 빠르게 장악하는 것이라고 느꼈습니다. 유행하는 기술을 잘 따라가는 것도 중요하지만, 잘못하면 연구개발에 많은 돈과 시간을 쏟아붓고도 충분한 output을 내지 못할 수 있습니다. 모든 것을 다 하는 것은 불가능하기 때문에 결국 선택과 집중이 중요하다고 생각합니다. (똑같은 음성 에이전트여도 어떻게 차별성을 가질 수 있을지 고민이 필요)</p>
<p>그렇다면 지금 당장 기업이 살아남기 위해 어떤 로드맵을 세워야 하는지는 매우 어려운 문제라고 느꼈습니다. 빅테크의 경우에는 오히려 선택지가 더 명확할 수 있습니다. 예를 들어 구글은 AI 솔루션을 제공하면서도, 동시에 데이터센터와 클라우드 사업처럼 다른 기업들이 쉽게 따라오기 어려운 인프라를 구축하고 있습니다. 이렇게 수요가 확실하면서도 구축 난이도가 높은 영역은 진입장벽을 만들기에 유리합니다. 로봇, 엣지 디바이스, 클라우드 서비스 운영 같은 분야도 비슷한 맥락에서 볼 수 있다고 생각합니다.</p>
<p>문제는 작은 기업의 경우, 돈과 시간, 인력, 기술력의 제약 때문에 이러한 인프라 영역에 단기간에 도전하기가 쉽지 않다는 점입니다. 반대로 너무 쉬운 길을 선택하면 남들도 쉽게 따라올 수 있기 때문에 진입장벽이 낮아지고, 금방 경쟁이 심해질 수 있습니다. 전시를 보면서 “이 기업은 오래 갈 수 있겠다”는 생각이 드는 곳도 있었지만, 반대로 “이 정도는 다른 기업도 금방 벤치마킹할 수 있을 것 같은데, 경쟁자가 많아지면 지속 가능할까?”라는 생각이 드는 곳도 있었습니다. 물론 단기적으로 빠르게 시장에 진입해 수익을 내고 철수하는 전략도 하나의 방법일 수는 있겠지만요.</p>
<p>제가 사업을 한다고 상상해볼때 어떤 것이 저의 강점이 될지 쉽게 생각이 나지는 않지만... 그럼에도 결국 소비자의 니즈와 차별화가 돌고 돌아 가장 중요하다는 것을 느꼈던 시간이었습니다.</p>
<hr>
<p>아래는 간단하게 부스 구경했던 내용들입니다:)</p>
<h3 id="참여기업">참여기업</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/b82ad98f-8fe2-4239-9aa3-7f634b24bdd5/image.png" alt="">
참여기업은 이와 같습니다.</p>
<p>저는 그냥 돌아다니면서 궁금한 기업 설명 듣고 질문하고 했네요ㅎㅎ </p>
<hr>
<h3 id="세미나">세미나</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/7c18bb05-1212-485b-98fa-9c4558a5511d/image.png" alt=""></p>
<p>세미나의 경우 이 중에서 5/7(목) 11:40-12:30 에 진행된 일레븐랩스의 발표를 들었습니다.
일레븐랩스의 음성 에이전트는 STT, TTS에 기존 LLM을 (자체 LLM도 제공) casecade 형태로 구성한 형태였습니다.
그리고 자세한 기술적인 내용보다는 전반적인 음성 에이전트에 대한 설명이었습니다.</p>
<p>흥미가 갔던 부분은</p>
<ul>
<li>latency 500ms 로 report 하고 있는 점. (물론 에이전트 응답 속도는 상황에 따라 달라질 것 같아서 정확한 측정 방식이 궁금하긴 합니다.)</li>
<li>실제 도입 기업에 대한 사례
입니다.</li>
</ul>
<p>AI 상담원이나 콜센터 신입 교육 AI가 주 고객이더라고요. 글로벌 기업인 만큼 다국어 기능 제공이 가능해 다양한 나라의 유스케이스가 있었습니다.
일레븐랩스도 그렇고 다른 기업도 그렇고 현재 음성 AI 솔루션 기업들이 기존 B2C에서 B2B 방향성으로 확장해 나아가고 있구나 싶었습니다ㅎㅎ </p>
<p><a href="https://elevenlabs.io/voice-agents">https://elevenlabs.io/voice-agents</a> &lt;--- 여기서 에이전트 구성 가능합니다.</p>
<hr>
<h3 id="부스">부스</h3>
<h4 id="일레븐랩스">일레븐랩스</h4>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/9f2f4b94-d6ba-4fe4-9ad3-3d356f0dc67c/image.png" alt="">
<img src="https://velog.velcdn.com/images/sujin-koo/post/685de931-71fd-4e67-94a3-46bb4d38de1d/image.png" alt=""></p>
<p>열정적이고 친절하게 설명해주신 일레븐랩스 분들ㅎㅎ
직접 체험해볼 수 있게 따로 부스도 운영하더라고요. 아무래도 노이즈가 끼면 음성인식이 잘 안되니까 안정적인 경험 제공을 위해 따로 마련한 것 같네요. 문제 발생 시 책임 소지 등 기업 운영 관련해서도 궁금한 점이 많았는데 워낙 잘 설명해주셔서 재밌었습니다.</p>
<h4 id="마음ai">마음AI</h4>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/7544c82e-6f12-4f8a-9d41-a74e7480fd84/image.png" alt="">
<img src="https://velog.velcdn.com/images/sujin-koo/post/60a9ad29-b388-4796-ab08-e134b13aedad/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/0440cb90-0c14-4b66-ba37-ca622701eada/image.png" alt=""></p>
<p>피지컬 AI 부스들이 꽤 보였는데 진도봇도 인상적이었습니다. 부스 내에서는 잘 걸어다니던데 ㅋㅋ 실제 환경에서도 임무 수행할 정도로 개발되었는지 궁금하네요. 워낙 피지컬 AI 쪽은 데이터 문제로 실사용 시 성능을 안정적으로 내기 어렵다보니... ㅎㅎ
그래서 그런지 피지컬 AI 기업들은 (로봇 학습을 위해서 생성형 모델을 통한) 이미지 데이터 증강 플랫폼도 함께 운영하더라고요. </p>
<h4 id="그-외-기업들">그 외 기업들</h4>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/50a78440-aac2-48c6-badb-5884793f5dde/image.png" alt="">
<img src="https://velog.velcdn.com/images/sujin-koo/post/09b12f5f-05da-48f0-92b6-8fed5dddbd00/image.png" alt="">
<img src="https://velog.velcdn.com/images/sujin-koo/post/bb8e9942-8ad9-4757-b0c1-8cc4518ce2ac/image.png" alt="">
<img src="https://velog.velcdn.com/images/sujin-koo/post/036600c0-bc6f-43e8-b2dc-e6c21cf2f21f/image.png" alt="">
<img src="https://velog.velcdn.com/images/sujin-koo/post/ac0f4cf6-77e7-4934-8bc3-45d141d4eb4d/image.png" alt=""></p>
<p>개인적으로 국방을 위한 기술과 재난 대응 로봇 개발은 중요하다고 생각하기에 관련 기업들을 보는 것도 반가웠습니다.</p>
<hr>
<p>역시 작년을 기점으로 좀 더 실생활에서 실제로 가치를 창출할 수 있는 방향으로 여러 기업들에서 도전하고 있는 모습이었습니다.
내년에는 어떤 모습으로 바뀔지 기대가 됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] Easy Turn: Integrating Acoustic and Linguistic Modalities for Robust Turn-Taking in Full-Duplex Spoken Dialogue Systems]]></title>
            <link>https://velog.io/@sujin-koo/Paper-Review-Easy-Turn-Integrating-Acoustic-and-Linguistic-Modalities-for-Robust-Turn-Taking-in-Full-Duplex-Spoken-Dialogue-Systems</link>
            <guid>https://velog.io/@sujin-koo/Paper-Review-Easy-Turn-Integrating-Acoustic-and-Linguistic-Modalities-for-Robust-Turn-Taking-in-Full-Duplex-Spoken-Dialogue-Systems</guid>
            <pubDate>Sun, 03 May 2026 03:02:08 GMT</pubDate>
            <description><![CDATA[<hr>
<p>#Full-duplex spoken dialogue systems
#turn taking detection
#음향과 언어를 함께 써서, 더 자연스러운 대화를 만들 수 있을까?</p>
<hr>
<h2 id="✔️-배경">✔️ 배경</h2>
<p>최근 spoken dialogue system은 단순히 “질문하면 대답하는” 반응형 구조를 넘어서, 사람이 말하는 도중에도 듣고 판단하고 적절한 순간에 응답하는 full-duplex interaction으로 빠르게 넘어가고 있습니다. 그런데 이때 중요한 요소 중에 하나는 지금 시스템이 말해야 하는지 혹은 계속 들어야 하는지를 정확히 판단하는 것입니다. (turn-taking detection) </p>
<p>저자들은 기존 오픈소스 접근이 너무 크거나, 음성 또는 텍스트 한쪽만 보는 단일 모달 구조라는 한계를 지닌다고 보고, acoustic + linguistic bimodal information을 함께 쓰는 Easy Turn 모델과 1,145시간규모의 turn-taking 데이터셋을 동시에 제안합니다.</p>
<blockquote>
<p>Turn-taking detection이란?
사용자가 말을 “끝낸 것인지”, “잠깐 멈춘 것인지”, “맞장구만 친 것인지”, 혹은 “시스템에게 멈추라고 한 것인지”를 판별해서, 시스템의 다음 행동을 결정하는 모듈입니다. 이 논문은 이를 complete / incomplete / backchannel / wait의 4가지 상태로 정의합니다.</p>
</blockquote>
<h2 id="✔️-paper-info">✔️ Paper Info</h2>
<ul>
<li>Title: Easy Turn: Integrating Acoustic and Linguistic Modalities for Robust Turn-Taking in Full-Duplex Spoken Dialogue Systems (<a href="https://arxiv.org/pdf/2509.23938">https://arxiv.org/pdf/2509.23938</a>)</li>
<li>Authors : </li>
<li>Affiliation: Northwestern Polytechnical University ASLP 그룹과 Huawei Technologies 소속 연구진의 공동 연구입니다.</li>
<li>Conference: </li>
<li>Keywords: turn-taking detection, full-duplex, open-source, corpus, bimodal.</li>
</ul>
<h2 id="✔️-main-problem-and-key-approach">✔️ Main Problem and Key Approach</h2>
<h3 id="기존-접근의-한계">기존 접근의 한계</h3>
<p>이 논문이 짚는 기존 방법의 한계는 다음과 같습니다.</p>
<p>첫째, TEN Turn Detection은 텍스트 기반 의미 해석은 가능하지만 Qwen2.5-7B를 써서 무겁고, 음성 입력을 직접 받지 못해 앞단 ASR이 필요합니다. (ASR 과정에서 acoustic information 잃어버림)
둘째, Smart Turn V2는 빠르고 가볍지만 음성만 입력으로 받고 complete / incomplete 두 상태만 분류하기 때문에 의미적 맥락을 충분히 반영하기 어렵습니다.
셋째, LLM backbone 자체를 full-duplex하게 만드는 end-to-end 접근은 매력적이지만, 이를 위해 필요한 대규모 고품질 full-duplex 데이터가 공개 형태로 거의 없다는 문제가 있습니다.</p>
<ul>
<li>오픈소스 아닌 turn taking model 에 의존한다.</li>
<li>공개돼 있는 건 parameter size 가 크거나, 언어/음성 중 하나의 모달리티만 제공한다.</li>
<li>LLM backbone 으로 훈련시키는건 full-duplex 데이터셋이 필요하다.</li>
<li>complete, incomplete, backchannel, and wait 예측하는 모델 + 데이터셋 공개하겠다.</li>
</ul>
<h3 id="easy-turn의-핵심-아이디어">Easy Turn의 핵심 아이디어</h3>
<p>이 논문의 해법은 다음과 같습니다.
<strong>“음향 정보만으로도 부족하고, 텍스트 정보만으로도 부족하다. 둘을 함께 보자.”</strong>
그래서 Easy Turn은 사용자의 speech를 입력받아, 먼저 ASR transcription을 생성하고, 그 과정에서 얻은 linguistic 정보와 acoustic representation을 결합해 turn state를 예측합니다. 즉, 이 논문은 turn-taking을 단순 classifier 문제로 보지 않고, ASR + state prediction이 연결된 멀티모달 이해 문제로 재정의합니다.</p>
<h3 id="이-논문이-정의한-4가지-상태">이 논문이 정의한 4가지 상태</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/b017c888-6f17-44a0-8d46-54cc9fc86274/image.png" alt=""></p>
<ul>
<li>Complete: 사용자가 의도를 끝까지 말했고, 시스템이 이제 응답해야 하는 상태</li>
<li>Incomplete: 사용자가 잠깐 멈췄지만 아직 말을 덜 끝낸 상태</li>
<li>Backchannel: “응”, “맞아”, “uh-huh” 같은 짧은 맞장구라서 시스템 발화를 끊으면 안 되는 상태</li>
<li>Wait: “잠깐”, “그만”, “shut up”처럼 시스템에게 멈추거나 pause하라고 하는 상태</li>
</ul>
<h2 id="✔️-architecture--method">✔️ Architecture &amp; Method</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/01605f36-3486-4373-8992-63a50473db2f/image.png" alt=""></p>
<ul>
<li><p>Input : 사용자의 음성 (speech)
별도의 ASR을 앞단에 두지 않고 음성을 직접 받습니다. 이게 논문에서 주장하기로 TEN Turn Detection 대비 장점으로 강조되는 부분입니다. TEN Turn Detection은 텍스트만 받기 때문에 ASR을 거쳐야 하고, 그 과정에서 acoustic 정보(억양, 멈춤, 말끝 흐려짐 등)가 손실되는 문제가 있을 수 있기 때문입니다.</p>
</li>
<li><p>Output
두 가지를 동시에 출력합니다:
(1) ASR transcription - 입력 음성에 대한 텍스트 전사
(2) Dialogue turn state - 네 가지 중 하나로 분류</p>
</li>
</ul>
<h3 id="easy-turn-corpus">Easy Turn Corpus</h3>
<p>이 논문의 큰 기여 중 하나는 모델만이 아니라 Easy Turn Corpus를 함께 공개한다는 점입니다. 2페이지 Figure 1을 보면, 데이터 구축 파이프라인이 real data와 synthetic data 두 축으로 나뉘어 설계되어 있습니다.</p>
<ul>
<li>real 쪽은 MagicData-RAMC에서 utterance-level로 세그먼트한 뒤 텍스트 기반 LLM annotation을 적용하고,</li>
<li>synthetic 쪽은 DeepSeek V3나 Qwen2.5-72B로 텍스트를 생성한 후 TTS와 ASR 검증까지 거쳐 품질을 맞추는 구조입니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/e22a5166-9391-4312-b217-642eebce7946/image.png" alt=""></p>
<p>Trainset은 총 1,145시간이며, Table 1기준으로</p>
<ul>
<li>complete: 423k entries / 580h</li>
<li>incomplete: 712k entries / 532h</li>
<li>backchannel: 41k / 10h</li>
<li>wait: 40k / 23h
로 구성됩니다.</li>
</ul>
<p>즉, entry 수 기준으로는 incomplete가 가장 많고, backchannel과 wait는 상대적으로 작습니다.</p>
<p>그 외</p>
<ul>
<li>텍스트 생성: DeepSeek V3/ Qwen2.5-72B로 4가지 turn state(complete/incomplete/backchannel/wait)에 맞는 문장을 대량 생성</li>
<li>Cross-Annotation: Qwen2.5-32B-Instruct와 TEN Turn Detection 두 모델로 라벨링해서, 둘 다 같은 라벨을 준 텍스트만</li>
<li>Speech Synthesis: 필터링된 텍스트를 CosyVoice 2로 TTS 변환 (Emilia 코퍼스를 화자 음색 reference로 사용)</li>
<li>ASR Verification: 합성된 음성을 Paraformer로 다시 인식해서, 원본 텍스트와 WER=0으로 일치하는 샘플만 최종 채택</li>
</ul>
<h3 id="2-모델-구조-whisper--adaptor--qwen25">2. 모델 구조: Whisper + Adaptor + Qwen2.5]</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/6cba0561-2bc7-4d43-8c45-11df164e9f81/image.png" alt=""></p>
<ul>
<li>Audio Encoder: Whisper-Medium</li>
<li>Audio Adaptor: 3개의 1D convolution + 4개의 Transformer layer</li>
<li>LLM: Qwen2.5-0.5B-Instruct</li>
</ul>
<p>(1) Qwen2.5-7B 같은 대형 모델이 아니라 0.5B를 선택해, turn-taking이라는 비교적 간단한 목적에 맞게 경량화와 실용성을 챙깁니다.
(2) Whisper는 음성 자체의 pause, prosody, hesitation 같은 acoustic cue를 포착하고, 생략된 transcript는 semantic completeness를 반영하므로, 두 모달리티가 서로 보완되도록 설계되었습니다.</p>
<h3 id="3-asr--turn-detection">3. ASR + Turn-Detection</h3>
<p>LLM이 먼저 ASR transcription을 생성하고, 이어서 acoustic feature와 결합해 complete / incomplete / backchannel / wait를 순차적으로 예측합니다. 저자들은 이를 위해 자연어 prompt를 사용하고, DeepSeek V3가 생성한 5개의 후보 prompt 중 하나를 학습 중 랜덤 샘플링해 robustness를 높였다고 설명합니다.</p>
<p>이 부분이 중요한 이유는, 기존 acoustic-only classifier가 잘 보기 어려운 “의미적으로 아직 문장이 안 끝났는가?” 같은 문제를 transcript가 보완해주기 때문입니다. 반대로 text-only 방식은 pause나 짧은 맞장구의 음향적 특성을 놓치기 쉬운데, Easy Turn은 이를 음향 표현으로 메웁니다. </p>
<h3 id="4-학습-전략">4. 학습 전략</h3>
<p>학습은 2단계로 진행됩니다.
(1) 먼저 modality alignment training 단계에서, Aishell1/2, WenetSpeech, 내부 ASR 데이터를 포함한 23,000시간 규모의 ASR 데이터로 acoustic-linguistic alignment를 맞춥니다. 이때는 LLM을 freeze하고 encoder와 adaptor만 학습합니다.
(2) 이후 두 번째 단계에서는 Easy Turn trainset으로 turn-taking 전용 학습을 수행하며, 이때는 encoder / adaptor / LLM 전체를 full fine-tuning합니다.</p>
<p>처음부터 turn-taking만 학습시키면 음성과 텍스트 정렬이 약할 수 있는데, 먼저 대규모 ASR로 representation alignment를 만든 뒤, 그 위에서 downstream turn policy를 얹는 구조입니다.</p>
<h2 id="✔️-dataset--evaluation">✔️ Dataset &amp; Evaluation</h2>
<p>Testset은 총 800개 샘플로 구성됩니다.</p>
<ul>
<li>complete 300</li>
<li>incomplete 300</li>
<li>backchannel 100</li>
<li>wait 100
이며,</li>
</ul>
<p>real : synthetic = 1 : 1로 맞췄고, trainset 외부 출처의 transcription을 사용해 독립성을 확보하려고 했습니다.
또 state annotation은 수동 라벨링으로 진행합니다.</p>
<p>비교 대상은 두 오픈소스 모델입니다.
하나는 Paraformer + TEN Turn Detection, 다른 하나는 Smart Turn V2입니다. 평가 지표는 각 상태별 accuracy와 함께, 모델 크기, 평균 latency, GPU memory usage를 함께 봅니다.</p>
<h2 id="✔️-results">✔️ Results</h2>
<h3 id="1-메인-결과">1. 메인 결과</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/8f8ca1c7-40c5-4044-9472-2bb3f1fa1492/image.png" alt=""></p>
<h3 id="2-ablation-결과">2. Ablation 결과</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/bddb0abd-9ae1-4fb4-82d9-3ecc1326b086/image.png" alt=""></p>
<ul>
<li>두 modality 함께 황용</li>
</ul>
<hr>
<h2 id="✔️-resources">✔️ Resources</h2>
<ul>
<li><a href="https://arxiv.org/pdf/2509.23938">🧾 Paper</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[PersonaPlex 리뷰]]></title>
            <link>https://velog.io/@sujin-koo/PersonaPlex-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@sujin-koo/PersonaPlex-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Sun, 26 Apr 2026 14:35:27 GMT</pubDate>
            <description><![CDATA[<p>PersonaPlex: Voice and Role Control for Full Duplex Conversational Speech Models</p>
<h2 id="✔️-배경">✔️ 배경</h2>
<p>최근 음성 AI는 단순히 자연스러운 음성을 합성하는 TTS를 넘어서, 실시간으로 듣고, 말하고, 끼어들고, 맞장구치며, 상황에 맞는 역할을 수행하는 대화형 음성 에이전트로 빠르게 확장되고 있습니다. 특히 full-duplex speech model은 사람이 말하는 동안에도 계속 듣고 반응할 수 있어 훨씬 자연스러운 상호작용을 가능하게 하지만, 지금까지의 많은 시스템은 고정된 역할과 고정된 목소리에 묶여 있었습니다. 그래서 보험 상담원, 은행 직원, 예약 센터, 멀티 캐릭터 에이전트, 개인화 음성 비서처럼 역할 중심(role-driven) 인 실제 서비스 시나리오에 적용하기에는 유연성이 부족했습니다.</p>
<p>기존 cascaded ASR–LLM–TTS 방식은 reasoning과 음질 측면에서는 강하지만, 중간에 텍스트로 정보를 압축하는 과정에서 억양,말의 속도, 망설임, 끼어들기 타이밍 같은 paralinguistic 정보가 약화되기 쉽습니다. 반대로 duplex speech model은 이런 대화적 자연스러움을 더 잘 살릴 수 있지만, 역할 제어(role conditioning) 와 화자 제어(voice conditioning) 를 동시에 붙이는 것은 latency 제약과 speech-text coupling 때문에 쉽지 않았습니다. PersonaPlex는 바로 이 지점을 겨냥해, full-duplex 대화 구조 위에 텍스트 기반 역할 프롬프트와 음성 기반 보이스 프롬프트를 함께 넣는 방식을 제안합니다.</p>
<ul>
<li>Full duplex란? 모델이 한 턴이 완전히 끝난 뒤에만 반응하는 half-duplex와 달리, 말하면서도 동시에 듣는 구조를 뜻합니다.</li>
<li>Role conditioning이란? “너는 보험 상담원이다”, “너는 친절한 교사다”처럼 역할 정보를 모델에 주어 응답 내용과 태도를 제어하는 것입니다.</li>
<li>Voice cloning이란? 짧은 참조 음성을 보고, 이후 생성되는 음성을 그 화자의 목소리처럼 말하게 하는 기술입니다.</li>
</ul>
<h2 id="✔️-paper-info">✔️ Paper Info</h2>
<p>Title: PersonaPlex: Voice and Role Control for Full Duplex Conversational Speech Models
Authors: Rajarshi Roy, Jonathan Raiman, Sang-gil Lee, Teodor-Dumitru Ene, Robert Kirby, Sungwon Kim, Jaehyeon Kim, Bryan Catanzaro
Affiliation: NVIDIA
Status: arXiv preprint, ICASSP 2026 under review
Keywords: Conversational Speech Model, Duplex Spoken Language Model, Role Conditioning, Voice Cloning</p>
<h2 id="✔️-main-problem-and-key-approach">✔️ Main Problem and Key Approach</h2>
<h3 id="기존-duplex-speech-model의-한계">기존 duplex speech model의 한계</h3>
<p>이 논문이 짚는 핵심 문제는 크게 세 가지입니다.
첫째, 기존 full-duplex 음성 모델은 자연스러운 turn-taking과 응답 속도는 좋아도 하나의 assistant persona와 하나의 voice에 고정되어 있는 경우가 많았습니다.</p>
<p>둘째, voice cloning이나 style control은 주로 TTS 쪽에서, role following은 주로 instruction-tuned LLM 쪽에서 발전해왔지만, 이를 낮은 지연의 speech-to-speech 대화 모델에 통합하는 것은 별개의 어려움이 있었습니다. 셋째, 기존 벤치마크는 단일 assistant가 많아, 실제 고객 응대처럼 역할 지시와 문맥 충실도가 중요한 환경을 충분히 평가하지 못했습니다.</p>
<h3 id="personaplex의-핵심-아이디어">PersonaPlex의 핵심 아이디어</h3>
<p>PersonaPlex의 해법은 의외로 복잡한 새 backbone을 만드는 것이 아니라, 기존 Moshi 계열 duplex architecture 위에 “Hybrid System Prompt”를 얹는 것입니다. 이 하이브리드 프롬프트는 두 부분으로 구성됩니다. 하나는 “당신은 보험사 상담원입니다” 같은 텍스트 역할 프롬프트, 다른 하나는 짧은 참조 음성을 주는 보이스 프롬프트입니다. 즉, 모델이 무슨 역할로 말해야 하는지와 어떤 목소리로 말해야 하는지를 동시에 조건으로 받게 만드는 구조입니다.
또 하나의 중요한 기여는 데이터와 평가 셋업입니다. 저자들은 오픈소스 LLM과 TTS를 활용해 대규모 synthetic dialog corpus를 만들고, 기존 Full-Duplex-Bench를 고객 서비스 시나리오로 확장한 Service-Duplex-Bench를 제안합니다. 즉, 이 논문은 모델만 제안한 것이 아니라, “역할 + 목소리 + 대화 자연스러움”을 함께 평가할 수 있는 실제 서비스형 평가 프레임까지 만든 점이 핵심입니다.</p>
<h2 id="✔️-architecture--method">✔️ Architecture &amp; Method</h2>
<h3 id="1-기본-구조-moshi-기반-full-duplex-모델">1. 기본 구조: Moshi 기반 full-duplex 모델</h3>
<p>논문 2페이지의 Figure 1을 보면, PersonaPlex는 user audio, agent text, agent audio라는 세 개의 스트림을 입력으로 받는 Moshi 기반 구조를 사용합니다. 즉 사용자의 음성을 계속 들으면서, 모델은 내부적으로 텍스트와 오디오를 함께 autoregressive하게 생성합니다. 중요한 점은, 역할과 목소리 제어를 위해 backbone 자체를 갈아엎지 않고 입력 프롬프트 설계만으로 conditioning을 붙였다는 것입니다. 이 단순성은 실제 시스템 확장 관점에서 꽤 강한 장점입니다.</p>
<h3 id="2-hybrid-system-prompt">2. Hybrid System Prompt</h3>
<p>Hybrid System Prompt는 시간축상 두 세그먼트로 이어집니다.
Text prompt segment: agent text 채널에 역할 설명 텍스트를 넣고, agent audio 채널은 silence로 둡니다.
Voice prompt segment: agent audio 채널에 짧은 음성 샘플을 넣고, agent text 채널은 padding으로 둡니다.
이렇게 하면 이후 생성되는 agent speech는 지정된 역할에 맞는 내용을 유지하면서, 동시에 제공된 음색에 가까운 목소리로 발화하게 됩니다. 논문은 두 세그먼트의 순서 자체는 큰 성능 차이를 만들지 않지만, 구현에서는 voice prompt를 먼저 두어 prefill을 가능하게 하고 latency를 줄였다고 설명합니다. 또 system prompt 구간에서는 user audio 대신 440Hz sine wave를 넣어 conditioning을 안정화했고, 시스템 프롬프트 부분에는 loss backpropagation을 막았으며, non-semantic audio token과 padded text token의 손실 가중치도 각각 0.02, 0.3으로 조정했습니다.</p>
<h3 id="3-synthetic-dialog-데이터-생성">3. Synthetic dialog 데이터 생성</h3>
<p>이 논문의 또 다른 핵심은 synthetic data engineering입니다. 대화 텍스트는 Qwen-3-32B와 GPT-OSS-120B를 이용해 생성됩니다. 서비스 데이터는 먼저 restaurant, bank 같은 도메인을 고르고, 그 안에서 refund, inquiry 같은 시나리오를 고른 뒤, 이를 실제 2인 대화 transcript로 확장하는 계층적 방식으로 만듭니다. QA 시나리오의 경우에는 “You are a wise and friendly teacher” 같은 고정 role을 둔 2-turn 질의응답 데이터도 추가합니다.
음성 쪽도 꽤 공들였습니다. 총 26,296개의 single-speaker voice sample을 VoxCeleb, Libriheavy, LibriTTS, CommonAccent, Fisher등에서 가져와 synthetic dialog와 voice prompt 생성에 사용했고, 별도로 2,630개 voice sample은 speaker similarity평가용 테스트셋으로 남겨뒀습니다. 서비스 시나리오 음성은 두 화자의 타이밍과 room tone을 더 자연스럽게 만들기 위해 multi-speaker TTS인 Dia를 사용했고, QA 시나리오는 zero-shot voice cloning이 가능한 Chatterbox TTS로 생성한 뒤 user/agent turn을 stitching했습니다. 여기서 silence를 양수로 넣으면 자연스러운 turn-taking을, 음수 길이 silence를 넣으면 barge-in / interruption 상황을 시뮬레이션할 수 있다고 설명합니다.</p>
<h3 id="4-service-duplex-bench">4. Service-Duplex-Bench</h3>
<p>기존 Full-Duplex-Bench가 주로 단일 assistant 역할을 가정했다면, 이 논문은 여기에 50개의 서비스 역할 시나리오 × 각 7개 질문 = 350개 평가 항목을 추가합니다. 표 3의 예시는 건강보험 상담원 시나리오인데, 회사 이름 확인, 잘못 제시된 SSN 검증, 플랜 설명, 당장 오늘 개통해달라는 불가능한 요청 대응, 무례한 고객 응대, 관련 없는 질문 거절 등 현실 서비스에서 진짜 중요한 케이스들로 구성되어 있습니다. 즉, “답을 아느냐”만 보는 것이 아니라 문맥 세부사항을 유지하는지, 거절을 어떻게 하는지, 역할에서 이탈하지 않는지를 묻는 벤치마크입니다.</p>
<h2 id="✔️-dataset--evaluation">✔️ Dataset &amp; Evaluation</h2>
<h3 id="학습-데이터와-학습-셋업">학습 데이터와 학습 셋업</h3>
<p>실험에 사용된 전체 학습 데이터는 고객 서비스 대화 1,840시간 / 105,410 dialogs, 그리고 일반 QA 대화 410시간 / 39,322 dialogs로 구성됩니다. 학습은 Adam과 cosine annealing을 사용했고, depth transformer와 temporal transformer의 learning rate를 다르게 두었습니다. 총 24,576 step, batch size 32, maximum sequence length 2048 token(약 163.84초) 조건에서 학습했으며, 저자들은 8×A100 GPU에서 약 6시간이 걸렸다고 보고합니다.</p>
<h3 id="평가-지표">평가 지표</h3>
<p>이 논문은 단순 WER 하나로 끝내지 않고, 대화 시스템답게 여러 층위의 지표를 봅니다.
DMOS: 사람이 듣고 평가한 dialog naturalness
SSIM: 여기서는 이미지 SSIM이 아니라, voice prompt와 생성 음성 사이의 speaker similarity
Full-Duplex-Bench metrics: pause handling, backchannel, smooth turn-taking, interruption대응, latency
Service-Duplex-Bench: GPT-4o 기반 평가 점수로 role adherence와 instruction following을 측정
특히 DMOS는 AMT human study로 수집했고, speaker similarity는 WavLM-TDNN 기반 cosine similarity로 측정했습니다. 즉, 이 논문은 음성 품질만 보는 것이 아니라 사람답게 대화하는가, 지시한 역할을 지키는가, 지정한 목소리로 말하는가를 함께 본다는 점이 특징입니다.
Backchannel이란? “음”, “네”, “그렇군요”처럼 상대 말을 끊지 않으면서 짧게 반응하는 신호입니다.
Turn-taking latency란? 사용자의 발화가 끝나거나 끼어들었을 때, 모델이 얼마나 빠르게 다음 동작으로 넘어가는지를 보는 지표입니다.</p>
<h2 id="✔️-results">✔️ Results</h2>
<h3 id="1-자연스러움과-voice-cloning">1. 자연스러움과 voice cloning</h3>
<p>가장 눈에 띄는 결과는 자연스러움과 화자 유사도를 동시에 잡았다는 점입니다. Table 1에서 PersonaPlex는 Full-Duplex-Bench 기준 DMOS 3.90 ± 0.15, Service-Duplex-Bench 기준 DMOS 3.59 ± 0.12, 그리고 speaker similarity 0.57을 기록합니다. 이는 Gemini의 3.72 / 3.22 / 0.00, Qwen-2.5-Omni의 3.70 / 2.37 / 0.07, Freeze-Omni의 3.51 / 2.38 / 0.05, Moshi의 3.11 / 2.83 / 0.10과 비교해 꽤 강한 결과입니다. 특히 closed model들도 role prompt는 줄 수 있지만 실제 voice cloning까지 되는 것은 아니기 때문에, speaker similarity서 PersonaPlex의 이점이 크게 드러납니다.</p>
<h3 id="2-full-duplex-상호작용-품질">2. Full-duplex 상호작용 품질</h3>
<p>Table 2를 보면 PersonaPlex는 모든 세부 지표에서 무조건 1등은 아닙니다. 예를 들어 pause나 backchannel 일부 TOR에서는 Gemini가 더 좋은 숫자를 보이는 구간도 있고, user interruption의 GPT-4o score 자체는 Qwen-2.5-Omni가 더 높습니다. 하지만 PersonaPlex는 smooth turn-taking TOR 0.992, latency 0.070,그리고 user interruption TOR 1.000, latency 0.400처럼실제 실시간 상호작용에서 중요한 지점에서 매우 강합니다. Qwen-2.5-Omni는 interruption GPT-4o score가 4.590으로 높지만 latency가 2.740으로 훨씬 크고, 다른 일부 항목은 VAD 부재로 공란입니다. 그래서 실사용 관점에서는 PersonaPlex의 강점이 “최고 점수 하나”보다 낮은 지연과 안정된 duplex behavior의 균형에 있다고 보는 게 더 정확합니다.</p>
<h3 id="3-역할-충실도-service-duplex-bench">3. 역할 충실도: Service-Duplex-Bench</h3>
<p>Service-Duplex-Bench 평균 점수는 Gemini 4.73, PersonaPlex 4.48, Freeze-Omni 4.02, Qwen-2.5-Omni 2.76, Moshi 1.75입니다. 즉, PersonaPlex는 이 벤치마크에서 closed commercial system인 Gemini보다는 약간 낮지만, 공개형 duplex baseline들보다는 확실히 높습니다. 이 결과는 중요합니다. 논문이 주장하는 핵심은 “모든 영역에서 절대 최고”라기보다, open duplex model이 실제 서비스형 role following까지 꽤 설득력 있게 따라갈 수 있다는 점이기 때문입니다. 특히 proper noun recall, context detail adherence, rude customer handling 같은 항목에서 전반적으로 안정적인 점수를 보입니다.</p>
<h3 id="4-데이터-규모-ablation이-보여주는-것">4. 데이터 규모 ablation이 보여주는 것</h3>
<p>Table 5는 꽤 흥미롭습니다. Moshi baseline(0%) 대비 synthetic data를 조금만 추가해도 speaker similarity와 role adherence가 크게 올라갑니다. 예를 들어 SSIM은 0.10 → 0.54<del>0.57, Service-Duplex-Bench점수는 1.75 → 4.20</del>4.48 수준으로 크게 뛰었습니다. 반면 Full-Duplex-Bench의 GPT-4o 점수는 50% 데이터에서 4.52, 25%에서 4.44, 100%에서 4.21로 단순 데이터 양과 단조 증가 관계를 보이지는 않습니다. 저자 해석처럼, full-duplex interaction skill은 비교적 적은 데이터로도 빨리 올라오고, 반면  role adherence는 더 많은 데이터에서 꾸준히 좋아지는 성격일 수 있습니다. 이것은 실무적으로도 “어떤 능력을 키우고 싶은가에 따라 데이터 설계를 달리해야 한다”는 시사점을 줍니다.</p>
<h3 id="5-공개-체크포인트는-더-좋아졌다">5. 공개 체크포인트는 더 좋아졌다</h3>
<p>Appendix에 따르면 공개된 PersonaPlex checkpoint는 본문 실험 버전보다 몇 가지 점에서 개선되었습니다. 먼저 Fisher English corpus의 실제 대화 7,303개(1,217시간) 를 추가 학습해 backchannel, 감정 표현, 자연스러운 반응을 강화했습니다. 또 privacy 문제 때문에 실제 voice dataset 대신 TortoiseTTS로 만든 synthetic voice를 사용하고, Praat 기반 formant/pitch augmentation을 적용했습니다. 음성 생성도 Dia/Chatterbox 혼합 대신 ChatterboxTTS로 통일했는데, 이로 인해 speaker similarity가 0.57 → 0.65로 좋아졌다고 보고합니다. Table 6에서도 pause/backchannel 관련 수치가 개선됩니다. 다만 Table 7의 DMOS는 별도 연구 조건에서 측정된 값이라 Table 1과 직접 비교하면 안 된다는 점은 같이 봐야 합니다.</p>
<hr>
<p>실서비스화를 하기 위해 페르소나 부여까지 적용된 full-duplex model 이었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[화자 분리(Speaker Diarization) 기초(2) - VAD, UBM]]></title>
            <link>https://velog.io/@sujin-koo/%ED%99%94%EC%9E%90-%EB%B6%84%EB%A6%ACSpeaker-Diarization-%EA%B8%B0%EC%B4%882-VAD-UBM</link>
            <guid>https://velog.io/@sujin-koo/%ED%99%94%EC%9E%90-%EB%B6%84%EB%A6%ACSpeaker-Diarization-%EA%B8%B0%EC%B4%882-VAD-UBM</guid>
            <pubDate>Mon, 13 Apr 2026 08:36:29 GMT</pubDate>
            <description><![CDATA[<p>지난번에 이어서 화자 분리에서 사용되는 Voice Acticity Detection(VAD)와 kaldi 에서 사용되는 UBM에 대해서 다뤄보고자 합니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/1b2ff2d7-302e-4356-8094-e47b2acc854a/image.png" alt=""></p>
<p><a href="https://docs.nvidia.com/nemo-framework/user-guide/24.09/nemotoolkit/asr/speaker_diarization/intro.html">이미지 출처</a></p>
<p>이미지는 엔비디아의 니모를 가져오기는 했는데... kaldi 기반으로 기본 과정을 정리하고 있기 때문에 그림과는 약간 차이가 있습니다 ^^;</p>
<h2 id="1-시작하며--화자-분리-파이프라인에서-vad와-ubm의-위치">1. 시작하며 — 화자 분리 파이프라인에서 VAD와 UBM의 위치</h2>
<p>화자 분리(Speaker Diarization)란, 하나의 오디오 녹음에서 <strong>&quot;누가, 언제 말했는가?&quot;</strong> 를 자동으로 판별하는 기술입니다. 회의 녹취, 콜센터 통화 분석, 미디어 자막 생성 등 수많은 실용 시나리오에서 핵심 전처리 역할을 합니다.</p>
<p>전통적인 화자 분리 시스템의 파이프라인을 크게 그려 보면 다음과 같습니다.</p>
<pre><code>[VAD] → [특징 추출] → [UBM / i-vector] → [클러스터링] → [리세그먼테이션]</code></pre><p>이 파이프라인에서 <strong>VAD(Voice Activity Detection)</strong> 는 가장 첫 번째 관문입니다. 전체 오디오에서 사람의 음성이 실제로 존재하는 구간만을 골라내는 역할을 합니다. 음성이 없는 구간 — 침묵, 배경 소음, 음악 등 — 을 하류(downstream) 모듈에 넘기면 불필요한 계산이 늘어날 뿐 아니라, 클러스터링 결과 자체를 심각하게 오염시킵니다.</p>
<p><strong>UBM(Universal Background Model)</strong> 은 그 다음 단계에서 등장합니다. &quot;모든 화자의 목소리가 공유하는 일반적인 음향 공간&quot;을 모델링한 것으로, 개별 화자의 특징을 뽑아내기 위한 <em>기준점(reference point)</em> 역할을 합니다. i-vector, supervector 등 화자 표현(speaker representation)을 추출하는 거의 모든 전통적 방법론이 UBM 위에 세워져 있습니다.</p>
<p>이번 글에서는 이 두 모듈을 하나씩 깊이 파고들겠습니다.</p>
<hr>
<h2 id="2-vad는-왜-필요한가">2. VAD는 왜 필요한가?</h2>
<p>오디오 파일을 떠올려 보세요. 1시간짜리 회의 녹음이라면, 그 안에는 발화 구간뿐 아니라 침묵, 에어컨 소리, 키보드 타이핑 소리, 웃음 소리, 기침 등 다양한 비음성(non-speech) 구간이 뒤섞여 있습니다. 만약 이 전체 신호를 그대로 화자 클러스터링에 넣으면 어떤 일이 벌어질까요?</p>
<blockquote>
<p>🚨 <strong>핵심 문제</strong>
비음성 구간에서 추출된 특징 벡터(feature vector)는 어떤 화자에도 속하지 않지만, 클러스터링 알고리즘은 이 벡터들도 &quot;어딘가에는 할당해야&quot; 합니다. 결과적으로 비음성 프레임들이 하나의 유령 화자(phantom speaker)로 뭉치거나, 기존 화자 클러스터에 섞여 들어가 클러스터 경계를 왜곡합니다.</p>
</blockquote>
<p>VAD가 해결하는 것은 단순히 &quot;침묵 제거&quot;가 아닙니다. 더 정확히 말하면, VAD는 다음 세 가지를 동시에 수행합니다.</p>
<p><strong>첫째, 계산 효율.</strong> 음성이 없는 구간을 조기에 제거하면, 이후의 특징 추출·UBM 적응·클러스터링 단계에서 처리해야 할 프레임 수가 줄어듭니다. 실시간 시스템에서는 이 차이가 지연(latency) 요구를 충족하느냐 마느냐를 결정짓습니다.</p>
<p><strong>둘째, 화자 표현의 순도.</strong> 화자 임베딩(embedding)이나 i-vector를 추출할 때, 비음성 프레임이 섞이면 해당 벡터의 화자 판별력(discriminability)이 떨어집니다. VAD는 &quot;깨끗한 음성 프레임만&quot; 화자 모델링에 투입되도록 보장합니다.</p>
<p><strong>셋째, 세그먼트 경계(segment boundary)의 정확도.</strong> 화자 분리의 최종 출력은 &quot;0.0초–3.2초: 화자 A, 3.2초–5.1초: 화자 B …&quot;와 같은 타임스탬프입니다. VAD가 발화의 시작(onset)과 끝(offset)을 정확히 잡지 못하면, 다운스트림에서 아무리 좋은 클러스터링을 해도 경계가 어긋납니다.</p>
<hr>
<h2 id="3-vad의-입력-음성-신호에서-특징-추출까지">3. VAD의 입력: 음성 신호에서 특징 추출까지</h2>
<p>VAD가 판단을 내리려면, 원시 파형(raw waveform)을 그대로 보는 것이 아니라 적절한 <strong>특징(feature)</strong> 으로 변환해야 합니다. 이 과정은 화자 분리 전체에서도 공유되는 단계이므로 한 번 확실히 짚고 넘어갑시다.</p>
<h3 id="프레이밍framing과-윈도잉windowing">프레이밍(Framing)과 윈도잉(Windowing)</h3>
<p>음성 신호는 시간에 따라 계속 변하지만, 아주 짧은 구간(약 20~30ms)에서는 상대적으로 안정적입니다. 이것을 <strong>준정상(quasi-stationary) 가정</strong>이라 합니다. 이 가정에 따라 신호를 짧은 프레임(frame)으로 잘라서 분석합니다.</p>
<blockquote>
<p>💡 <strong>실무 관례</strong>
일반적으로 <strong>프레임 길이(frame length) 25ms, 프레임 이동(frame shift) 10ms</strong>가 가장 널리 쓰입니다. 이 경우 1초의 오디오에서 약 100개의 프레임이 생성됩니다. 프레임 간에 15ms가 겹치는데(overlap), 이 중첩이 시간적 연속성을 보존해 줍니다.</p>
</blockquote>
<p>각 프레임에는 <strong>윈도우 함수(window function)</strong> 를 곱해 줍니다. 가장 흔히 쓰이는 것은 <strong>해밍 윈도우(Hamming window)</strong> 입니다. 윈도우를 곱하는 이유는 프레임의 양 끝을 부드럽게 감쇠시켜, 이후 FFT(Fast Fourier Transform)를 적용할 때 발생하는 스펙트럼 누출(spectral leakage)을 줄이기 위함입니다.</p>
<p>$$w(n) = 0.54 - 0.46 \cdot \cos\left(\frac{2\pi n}{N-1}\right), \quad 0 \le n \le N-1$$</p>
<h3 id="에너지energy와-영교차율zero-crossing-rate">에너지(Energy)와 영교차율(Zero-Crossing Rate)</h3>
<p>가장 단순한 VAD에서는 프레임 단위의 <strong>단기 에너지(short-time energy)</strong> 와 <strong>영교차율(zero-crossing rate, ZCR)</strong> 만으로도 판단합니다.</p>
<p><strong>단기 에너지</strong>는 프레임 내 샘플 값의 제곱합입니다. 음성 구간은 배경 소음보다 에너지가 높으므로, 임계값(threshold)을 설정해서 그 위를 음성으로 판단할 수 있습니다. 다만, 이 방법은 SNR(Signal-to-Noise Ratio)이 낮은 환경에서 급격히 성능이 떨어집니다.</p>
<p><strong>영교차율</strong>은 신호가 양→음 또는 음→양으로 부호가 바뀌는 횟수입니다. 무성 자음(unvoiced consonant, 예: /s/, /f/)은 에너지는 낮지만 ZCR이 높고, 묵음(silence)은 에너지도 ZCR도 낮다는 특성을 이용합니다.</p>
<h3 id="스펙트럼-특징-mfcc와-filter-bank">스펙트럼 특징: MFCC와 Filter Bank</h3>
<p>현대적인 VAD는 에너지나 ZCR 같은 시간 영역(time-domain) 특징 대신, 주파수 영역(frequency-domain) 특징을 사용합니다. 그 중 가장 대표적인 것이 <strong>MFCC(Mel-Frequency Cepstral Coefficients)</strong> 와 <strong>Log Mel Filter Bank(log-mel filterbank energy)</strong> 입니다.</p>
<p><strong>1단계: FFT (Fast Fourier Transform)</strong>
프레임에 윈도우를 곱한 뒤, FFT를 적용하여 시간 영역 신호를 주파수 영역으로 변환합니다. 결과물은 각 주파수 성분의 크기(magnitude)와 위상(phase)인데, 보통 크기 스펙트럼(magnitude spectrum)만 사용합니다.</p>
<p><strong>2단계: 파워 스펙트럼 (Power Spectrum)</strong>
크기 스펙트럼의 각 값을 제곱하여 파워 스펙트럼을 구합니다. 이것이 각 주파수 대역의 에너지를 나타냅니다.</p>
<p><strong>3단계: 멜 필터뱅크 (Mel Filter Bank) 적용</strong>
인간의 청각 시스템은 저주파에서는 주파수 변화에 민감하고, 고주파에서는 둔감합니다. 이 비선형적 감각을 모사하기 위해, 주파수 축을 <strong>멜 스케일(mel scale)</strong> 로 변환합니다. 보통 20~40개의 삼각 필터(triangular filter)를 멜 스케일 위에 균등 간격으로 배치하여, 파워 스펙트럼에 적용합니다.</p>
<p><strong>4단계: 로그 압축</strong>
필터뱅크 출력에 로그를 취합니다. 로그 압축은 두 가지 목적이 있습니다. 첫째, 인간의 음량 인지가 로그적이라는 점을 반영합니다. 둘째, 이후 DCT를 적용할 때 convolution을 곱셈으로 분리하는 효과(cepstral deconvolution)를 가능하게 합니다. 여기까지가 <strong>log-mel filterbank feature</strong>입니다.</p>
<p><strong>5단계: DCT (Discrete Cosine Transform) → MFCC</strong>
로그 멜 필터뱅크 출력에 DCT를 적용하면 MFCC를 얻습니다. DCT는 필터뱅크 간의 상관관계(correlation)를 제거하여, 서로 독립에 가까운 계수(coefficient)를 만들어 줍니다. 보통 첫 13개의 계수를 사용합니다(c₀ 또는 에너지 + c₁~c₁₂).</p>
<blockquote>
<p>💡 <strong>MFCC vs. Log-Mel Filterbank, 무엇을 쓸까?</strong>
전통적인 GMM 기반 시스템에서는 MFCC가 선호되었습니다. GMM은 입력 특징이 서로 독립이라고 가정하는 대각 공분산(diagonal covariance) 행렬을 많이 쓰는데, DCT가 이 독립 가정을 도와주기 때문입니다. 반면, 딥러닝 기반 시스템에서는 신경망이 스스로 특징 간 상관관계를 학습할 수 있으므로 DCT를 생략하고 log-mel filterbank를 직접 입력하는 것이 더 일반적입니다. 최근의 뉴럴 VAD는 대부분 log-mel filterbank를 사용합니다.</p>
</blockquote>
<h3 id="델타delta와-델타-델타delta-delta">델타(Delta)와 델타-델타(Delta-Delta)</h3>
<p>정적(static) 특징만으로는 시간에 따른 변화를 포착하지 못합니다. 그래서 인접 프레임 간의 <strong>1차 시간 미분(delta)</strong> 과 <strong>2차 시간 미분(delta-delta, 또는 acceleration)</strong> 을 추가합니다. 예를 들어 13차원 MFCC에 delta 13차원, delta-delta 13차원을 붙이면 총 39차원의 특징 벡터가 됩니다.</p>
<p>$$d(t) = \frac{\sum_{\theta=1}^{\Theta} \theta \cdot \left( c(t+\theta) - c(t-\theta) \right)}{2 \cdot \sum_{\theta=1}^{\Theta} \theta^2}$$</p>
<p>여기서 $c(t)$는 $t$번째 프레임의 정적 특징, $\Theta$는 전후로 참조하는 프레임 수(보통 2)입니다. Delta-delta는 delta 시퀀스에 같은 공식을 한 번 더 적용하면 됩니다.</p>
<hr>
<h2 id="4-vad의-핵심-방법론들">4. VAD의 핵심 방법론들</h2>
<p>VAD는 결국 각 프레임(또는 짧은 구간)에 대해 <strong>&quot;음성(speech)인가, 비음성(non-speech)인가?&quot;</strong> 라는 이진 분류(binary classification) 문제를 푸는 것입니다. 이 문제를 풀기 위한 방법론은 크게 세 가지 계보로 나눌 수 있습니다.</p>
<h3 id="41-에너지-기반-vad-energy-based--threshold-based">4.1. 에너지 기반 VAD (Energy-based / Threshold-based)</h3>
<p>가장 고전적인 방식입니다. 앞서 설명한 단기 에너지와 ZCR에 임계값을 설정합니다. ITU-T G.729B는 전화 통신에서 오랫동안 사용된 표준 VAD로, 풀밴드 에너지(full-band energy), 저밴드 에너지(low-band energy), ZCR, 스펙트럼 차이(spectral difference)의 네 가지 특징을 사용합니다.</p>
<p><strong>장점:</strong> 계산량이 극도로 적어 임베디드 기기에서도 실시간 동작 가능합니다.</p>
<p><strong>한계:</strong> 배경 소음이 조금만 커져도(SNR &lt; 15dB) 급격히 성능이 떨어집니다. 에너지가 높은 소음(TV 소리, 음악)과 에너지가 낮은 음성(속삭임, 무성 자음)을 구분하지 못합니다.</p>
<h3 id="42-통계-모델-기반-vad-statistical-model-based">4.2. 통계 모델 기반 VAD (Statistical Model-based)</h3>
<p>소음과 음성을 각각 확률 분포로 모델링하고, 프레임마다 <strong>우도비(likelihood ratio)</strong> 를 계산하여 판단합니다.</p>
<p>대표적인 방법이 <strong>Sohn et al. (1999)</strong> 의 통계적 VAD입니다. 이 방법은 DFT(Discrete Fourier Transform) 계수의 각 주파수 빈(bin)이 복소 가우시안(complex Gaussian) 분포를 따른다고 가정합니다.</p>
<p>$$\Lambda(k) = \frac{p(Y(k) \mid H_1)}{p(Y(k) \mid H_0)}$$</p>
<p>$$H_1: \text{음성 + 소음 존재} \quad\quad H_0: \text{소음만 존재}$$</p>
<p>여기서 $Y(k)$는 $k$번째 주파수 빈의 DFT 계수입니다. $H_1$ 가설(음성 존재)과 $H_0$ 가설(비음성) 각각에서의 우도를 계산하고, 그 비율이 임계값을 넘으면 음성으로 판정합니다. 실제로는 각 주파수 빈의 우도비를 곱하거나 로그를 취해 전체 프레임의 판정치를 구합니다.</p>
<p>소음의 분산(variance)은 비음성 구간에서 추정하고, 음성 구간에서는 고정합니다. 이를 위해 <strong>소음 추정(noise estimation)</strong> 알고리즘이 필요한데, MCRA(Minimum Controlled Recursive Averaging) 같은 방법이 병행됩니다.</p>
<p>통계 모델 기반 VAD는 HMM(Hidden Markov Model)과 결합하여, 프레임 단위 결정에 시간적 연속성(temporal continuity)을 부여하기도 합니다. 음성-비음성 간 전이 확률(transition probability)을 모델링하면, 단발성 오판(짧은 비음성을 음성으로, 또는 그 반대)을 효과적으로 줄일 수 있습니다.</p>
<h3 id="43-딥러닝-기반-vad-neural-vad">4.3. 딥러닝 기반 VAD (Neural VAD)</h3>
<p>최근의 VAD는 신경망을 사용하는 것이 주류입니다. 프레임 단위(또는 짧은 세그먼트 단위)로 음성/비음성 확률을 출력하는 이진 분류 네트워크를 학습합니다.</p>
<p><strong>DNN/LSTM 기반 VAD</strong></p>
<p>Google의 WebRTC VAD 이후, 소규모 DNN이나 LSTM(Long Short-Term Memory) 네트워크를 사용한 VAD가 등장했습니다. 입력으로 log-mel filterbank를 받고, 출력으로 각 프레임의 음성 확률을 내보냅니다. 컨텍스트 윈도우(context window)를 통해 현재 프레임 전후의 몇 개 프레임도 함께 보기 때문에, 시간적 문맥을 반영할 수 있습니다.</p>
<p><strong>pyannote.audio의 VAD</strong></p>
<p>화자 분리 연구에서 가장 널리 쓰이는 오픈소스 툴킷 중 하나인 <strong>pyannote.audio</strong>는 SincNet/LSTM/Transformer 기반의 뉴럴 VAD를 제공합니다. 이 모델은 단순한 음성/비음성 분류를 넘어, <strong>&quot;겹침 음성(overlapped speech)&quot; 구간</strong>까지 검출합니다. 겹침 음성 검출은 화자 분리에서 특히 중요한데, 겹침 구간에서는 단일 화자를 가정하는 클러스터링이 실패하기 때문입니다.</p>
<p><strong>Silero VAD</strong></p>
<p><strong>Silero VAD</strong>는 경량화에 초점을 맞춘 모델로, ONNX 포맷으로 제공되어 다양한 환경에서 빠르게 추론(inference)할 수 있습니다. 모델 크기가 작지만, 다양한 언어와 소음 환경에서 준수한 성능을 보여 실무에서 많이 활용됩니다.</p>
<blockquote>
<p>🔑 <strong>방법론 선택 가이드</strong>
<strong>임베디드/실시간 저지연 시스템</strong>에서는 에너지 기반 또는 소규모 뉴럴 VAD를, <strong>오프라인 대용량 처리</strong>에서는 pyannote.audio 같은 더 무거운 모델을 사용하는 것이 일반적입니다. 핵심은 VAD 오류가 전체 파이프라인에 전파(error propagation)된다는 점입니다 — VAD에서의 missed speech는 해당 발화가 영영 분석되지 못함을 의미하고, false alarm은 비음성을 음성으로 넘겨 화자 모델을 오염시킵니다.</p>
</blockquote>
<hr>
<h2 id="5-vad-실전--출력-형태와-후처리">5. VAD 실전 — 출력 형태와 후처리</h2>
<h3 id="vad의-출력-프레임-레벨-vs-세그먼트-레벨">VAD의 출력: 프레임 레벨 vs. 세그먼트 레벨</h3>
<p>VAD 모델은 보통 각 프레임에 대해 <strong>음성 확률(speech probability)</strong> 을 출력합니다. 예를 들어, 10ms 프레임 시프트를 사용하면 1초에 100개의 확률값이 나옵니다.</p>
<p>이 연속적인 확률값을 이산적인 음성/비음성 판정으로 바꾸기 위해서는 <strong>임계값(threshold)</strong> 이 필요합니다. 보통 0.5를 기본으로 쓰지만, 용도에 따라 조정합니다. 임계값을 낮추면(예: 0.3) 더 많은 구간을 음성으로 잡아 missed speech를 줄이는 대신 false alarm이 늘고, 높이면(예: 0.7) 그 반대입니다.</p>
<h3 id="후처리-스무딩과-최소-길이-제약">후처리: 스무딩과 최소 길이 제약</h3>
<p>프레임 단위 판정을 그대로 쓰면 아주 짧은 음성/비음성 구간이 산발적으로 나타나는 문제가 있습니다. 이를 방지하기 위한 후처리 기법들이 있습니다.</p>
<p><strong>미디언 필터링(median filtering)</strong> 은 연속된 N개의 프레임 판정값에 대해 중앙값을 취해서 산발적인 토글을 제거합니다. <strong>최소 발화 길이(minimum speech duration)</strong> 제약은 너무 짧은 음성 세그먼트(예: 100ms 미만)를 비음성으로 전환합니다. 반대로 <strong>최소 묵음 길이(minimum silence duration)</strong> 제약은 너무 짧은 비음성 구간(예: 200ms 미만)을 음성으로 채워서, 단어 사이의 짧은 쉼(pause)으로 발화가 조각나는 것을 방지합니다.</p>
<h3 id="출력-포맷-rttm">출력 포맷: RTTM</h3>
<p>VAD의 최종 출력은 보통 <strong>RTTM(Rich Transcription Time Marked)</strong> 파일이나 이와 유사한 시간 구간 리스트로 표현됩니다.</p>
<pre><code>SPEAKER meeting01 1 0.500 3.200 &lt;NA&gt; &lt;NA&gt; speech &lt;NA&gt; &lt;NA&gt;
SPEAKER meeting01 1 4.100 2.800 &lt;NA&gt; &lt;NA&gt; speech &lt;NA&gt; &lt;NA&gt;
SPEAKER meeting01 1 8.300 5.100 &lt;NA&gt; &lt;NA&gt; speech &lt;NA&gt; &lt;NA&gt;</code></pre><p>각 줄은 &quot;어느 파일에서, 몇 초부터, 몇 초 동안 음성이 존재한다&quot;를 뜻합니다. 이 음성 구간 리스트가 다음 단계인 특징 추출과 UBM 기반 화자 모델링으로 넘어갑니다.</p>
<hr>
<h2 id="6-ubm은-왜-필요한가">6. UBM은 왜 필요한가?</h2>
<p>VAD가 음성 구간을 골라냈다면, 이제 그 구간에서 <strong>&quot;이 목소리가 누구의 것인지&quot;</strong> 를 판별할 수 있는 표현(representation)을 만들어야 합니다.</p>
<p>가장 직관적인 접근은 각 화자마다 별도의 모델을 학습하는 것입니다. 그러나 화자 분리에서는 근본적인 문제가 있습니다 — <strong>화자가 누구인지 사전에 알 수 없고, 각 화자의 데이터도 아주 적습니다.</strong> 회의 녹음에서 한 사람이 말한 구간이 총 30초에 불과할 수도 있는데, 이 30초로 음향 모델을 바닥부터 학습하는 것은 현실적으로 불가능합니다.</p>
<blockquote>
<p>🔑 <strong>UBM의 핵심 아이디어</strong>
&quot;먼저 수천 명의 음성으로 &#39;보편적인 목소리 지도(universal voice map)&#39;를 만들어 놓자. 그리고 새로운 화자의 짧은 음성이 들어오면, 이 지도 위에서 어느 방향으로 얼마나 벗어나는지(deviation)를 계산하자.&quot; — 이것이 UBM의 핵심 발상입니다.</p>
</blockquote>
<p>즉, UBM은 <strong>화자 독립적(speaker-independent)</strong> 인 배경 모델입니다. &quot;인간의 음성이라면 대체로 이런 음향적 분포를 가진다&quot;를 포착한 모델이며, 개별 화자의 특성을 잡으려는 것이 아닙니다. 개별 화자의 특성은 UBM으로부터의 <em>편차(deviation)</em> 로 표현됩니다.</p>
<hr>
<h2 id="7-ubm의-수학적-기반-gaussian-mixture-model">7. UBM의 수학적 기반: Gaussian Mixture Model</h2>
<p>UBM은 <strong>GMM(Gaussian Mixture Model)</strong> 으로 구현됩니다. GMM을 먼저 이해해야 UBM을 이해할 수 있으므로, GMM의 수학을 차근차근 풀어보겠습니다.</p>
<h3 id="gmm이란">GMM이란?</h3>
<p>GMM은 데이터의 분포를 여러 개의 가우시안(정규분포)의 가중합(weighted sum)으로 모델링하는 확률 모델입니다. 왜 하나의 가우시안이 아니라 여러 개가 필요할까요?</p>
<p>음성 신호의 특징 벡터 분포를 생각해 보세요. 모음 /a/를 발음할 때의 MFCC와 모음 /i/를 발음할 때의 MFCC는 특징 공간(feature space) 상에서 서로 다른 영역에 모여 있습니다. 자음 /s/는 또 다른 곳에 위치합니다. 이런 다봉성(multi-modal) 분포는 단일 가우시안으로는 절대 포착할 수 없습니다. 여러 개의 가우시안을 섞으면, 각 가우시안이 특징 공간의 한 영역(하나의 음소 클래스, 또는 조음 방식의 한 유형)을 담당하여 전체 분포를 유연하게 모델링할 수 있습니다.</p>
<h3 id="gmm의-수학적-정의">GMM의 수학적 정의</h3>
<p>D차원 특징 벡터 <strong>x</strong>에 대한 GMM의 확률밀도함수는 다음과 같습니다.</p>
<p>$$p(\mathbf{x} \mid \lambda) = \sum_{k=1}^{K} w_k \cdot \mathcal{N}(\mathbf{x} \mid \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)$$</p>
<p>여기서 각 기호의 의미는 다음과 같습니다.</p>
<p><strong>K</strong>는 혼합 성분(mixture component)의 개수입니다. UBM에서는 보통 512, 1024, 또는 2048개를 사용합니다.</p>
<p><strong>$w_k$</strong> 는 $k$번째 성분의 혼합 가중치(mixture weight)입니다. 모든 $w_k$의 합은 1이고, 각각은 0 이상이어야 합니다. 직관적으로 &quot;전체 데이터에서 이 성분이 차지하는 비율&quot;로 이해할 수 있습니다.</p>
<p><strong>$\mathcal{N}(\mathbf{x} \mid \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)$</strong> 는 평균 벡터 $\boldsymbol{\mu}_k$와 공분산 행렬 $\boldsymbol{\Sigma}_k$를 가지는 D차원 가우시안 분포입니다.</p>
<p>$$\mathcal{N}(\mathbf{x} \mid \boldsymbol{\mu}, \boldsymbol{\Sigma}) = (2\pi)^{-D/2} |\boldsymbol{\Sigma}|^{-1/2} \cdot \exp\left(-\frac{1}{2}(\mathbf{x}-\boldsymbol{\mu})^\top \boldsymbol{\Sigma}^{-1} (\mathbf{x}-\boldsymbol{\mu})\right)$$</p>
<p>따라서 GMM의 모든 파라미터를 한데 모으면 $\lambda = {w_k, \boldsymbol{\mu}<em>k, \boldsymbol{\Sigma}_k}</em>{k=1}^{K}$로 표현됩니다.</p>
<h3 id="대각-공분산-vs-전체-공분산">대각 공분산 vs. 전체 공분산</h3>
<p>이론적으로 공분산 행렬 $\boldsymbol{\Sigma}_k$는 D×D의 전체 행렬(full covariance)이지만, 실무에서 UBM에는 거의 항상 <strong>대각 공분산(diagonal covariance)</strong> 을 사용합니다. 이유는 두 가지입니다.</p>
<p>첫째, 계산 효율. 전체 공분산 행렬은 $D^2$개의 파라미터를 가지지만, 대각 공분산은 $D$개만 있으면 됩니다. $K=1024$, $D=39$(39차원 MFCC)일 때, 전체 공분산은 성분당 $39 \times 39 = 1{,}521$개인데 비해 대각은 39개이므로 약 40배 차이입니다.</p>
<p>둘째, MFCC의 특성. 앞서 설명했듯이 DCT가 필터뱅크 간 상관관계를 상당 부분 제거하므로, MFCC의 차원 간 상관이 작아 대각 공분산의 가정이 크게 위배되지 않습니다. 성분 수 K를 충분히 크게 잡으면, 대각 공분산 GMM이 전체 공분산 GMM에 근사할 수 있다는 것도 알려져 있습니다.</p>
<hr>
<h2 id="8-ubm은-어떻게-학습되는가">8. UBM은 어떻게 학습되는가?</h2>
<p>UBM을 학습한다는 것은, 대규모 음성 데이터셋에서 GMM 파라미터 $\lambda = {w_k, \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k}$를 추정하는 것입니다. 이 추정에는 <strong>EM(Expectation-Maximization) 알고리즘</strong>이 사용됩니다.</p>
<h3 id="em-알고리즘의-직관">EM 알고리즘의 직관</h3>
<p>EM은 &quot;관측되지 않은 잠재 변수(latent variable)가 있는 상황에서 최대우도추정(MLE)을 수행하는&quot; 반복적(iterative) 알고리즘입니다. GMM에서 잠재 변수는 <strong>&quot;각 데이터 포인트가 어느 가우시안 성분에서 생성되었는가?&quot;</strong> 입니다. 이 정보를 안다면 파라미터 추정은 단순한 통계량 계산이 되지만, 모르기 때문에 EM이 필요합니다.</p>
<p>EM은 두 단계를 번갈아 반복합니다.</p>
<h3 id="e-step-expectation-step-사후-확률-계산">E-step (Expectation step): 사후 확률 계산</h3>
<p>현재 파라미터 $\lambda$ 하에서, 각 데이터 포인트 $\mathbf{x}_t$가 $k$번째 성분에 속할 <strong>사후 확률(posterior probability)</strong>, 즉 <strong>responsibility</strong> $\gamma_k(t)$를 계산합니다.</p>
<p>$$\gamma_k(t) = \frac{w_k \cdot \mathcal{N}(\mathbf{x}<em>t \mid \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)}{\sum</em>{j=1}^{K} w_j \cdot \mathcal{N}(\mathbf{x}_t \mid \boldsymbol{\mu}_j, \boldsymbol{\Sigma}_j)}$$</p>
<p>직관적으로, $\gamma_k(t)$는 &quot;현재 모델이 보기에, 이 프레임 $\mathbf{x}_t$를 $k$번째 가우시안이 생성했을 가능성이 얼마나 되는가?&quot;를 뜻합니다. 분자는 $k$번째 성분이 $\mathbf{x}_t$를 생성할 결합 확률이고, 분모는 모든 성분에 대해 합산한 값으로 정규화 상수 역할을 합니다.</p>
<h3 id="m-step-maximization-step-파라미터-갱신">M-step (Maximization step): 파라미터 갱신</h3>
<p>E-step에서 구한 responsibility를 이용하여, 각 성분의 파라미터를 갱신합니다.</p>
<p>$$N_k = \sum_{t=1}^{T} \gamma_k(t)$$</p>
<p>$$w_k \leftarrow \frac{N_k}{T}$$</p>
<p>$$\boldsymbol{\mu}<em>k \leftarrow \frac{1}{N_k} \sum</em>{t=1}^{T} \gamma_k(t) \cdot \mathbf{x}_t$$</p>
<p>$$\boldsymbol{\Sigma}<em>k \leftarrow \frac{1}{N_k} \sum</em>{t=1}^{T} \gamma_k(t) \cdot (\mathbf{x}_t - \boldsymbol{\mu}_k)(\mathbf{x}_t - \boldsymbol{\mu}_k)^\top$$</p>
<p><strong>$N_k$</strong> 는 $k$번째 성분에 할당된 &quot;유효 데이터 수(effective count)&quot;입니다. 하드 할당이 아니라 소프트 할당이므로 정수가 아닌 실수입니다.</p>
<p><strong>$w_k$</strong> 는 유효 데이터 수의 비율로 갱신됩니다 — 데이터가 많이 몰리는 성분은 가중치가 커집니다.</p>
<p><strong>$\boldsymbol{\mu}_k$</strong> 는 $\gamma_k$로 가중된 데이터의 가중 평균입니다.</p>
<p><strong>$\boldsymbol{\Sigma}_k$</strong> 는 $\gamma_k$로 가중된 공분산입니다.</p>
<p>이 두 단계를 로그 우도(log-likelihood)가 수렴할 때까지(또는 정해진 반복 횟수만큼) 반복하면, 데이터의 분포를 가장 잘 설명하는 GMM 파라미터가 얻어집니다.</p>
<h3 id="ubm-학습-시-실무적-고려사항">UBM 학습 시 실무적 고려사항</h3>
<p><strong>학습 데이터의 다양성</strong></p>
<p>UBM은 &quot;보편적인&quot; 음성 분포를 모델링해야 하므로, 학습 데이터는 가능한 한 <strong>다양한 화자, 언어, 채널, 환경</strong>을 포함해야 합니다. NIST SRE 데이터, VoxCeleb, LibriSpeech 등의 대규모 코퍼스가 흔히 사용됩니다. 성별 균형, 연령 분포, 전화/마이크/원거리 등 다양한 채널 조건을 포함시키는 것이 중요합니다.</p>
<p><strong>성분 수 K의 선택</strong></p>
<p>K가 클수록 더 세밀한 음향 공간을 표현할 수 있지만, 파라미터 수도 비례하여 늘어나며 학습과 추론에 더 많은 연산이 필요합니다. 전통적으로 <strong>K = 512 ~ 2048</strong>이 화자 인식/분리에서 사용됩니다. K가 너무 작으면 음향 공간의 세밀한 구조를 놓치고, 너무 크면 일부 성분이 데이터 부족으로 불안정해집니다.</p>
<p><strong>초기화: K-means + EM</strong></p>
<p>EM 알고리즘은 초기값에 민감합니다. 실무에서는 먼저 <strong>K-means 클러스터링</strong>으로 데이터를 K개의 클러스터로 나누고, 각 클러스터의 평균과 분산으로 GMM 파라미터를 초기화한 뒤 EM을 돌리는 것이 표준적인 접근입니다.</p>
<p><strong>분산 플로어링 (Variance Flooring)</strong></p>
<p>학습 과정에서 일부 가우시안 성분의 분산이 0에 가까워지면 수치적 불안정(numerical instability)이 발생합니다. 이를 방지하기 위해 분산의 최소값(floor)을 설정합니다. 보통 전체 분산의 일정 비율(예: 0.01배)로 잡습니다.</p>
<hr>
<h2 id="9-ubm이-화자-분리에서-하는-역할">9. UBM이 화자 분리에서 하는 역할</h2>
<p>UBM이 학습된 뒤에는, 새로운 음성 데이터가 들어올 때 <strong>개별 화자를 어떻게 표현할 것인가</strong>의 문제가 남습니다. 여기서 UBM은 두 가지 대표적인 방식으로 활용됩니다.</p>
<h3 id="91-map-적응을-통한-화자별-gmm">9.1. MAP 적응을 통한 화자별 GMM</h3>
<p><strong>MAP(Maximum A Posteriori) 적응</strong>은 Reynolds et al. (2000)이 제안한 방법으로, UBM-GMM 기반 화자 모델링의 핵심입니다.</p>
<p>아이디어는 이렇습니다. UBM은 이미 &quot;인간 음성의 일반적 분포&quot;를 잘 학습하고 있습니다. 새로운 화자 s의 짧은 음성 데이터가 주어졌을 때, 이 데이터만으로 GMM을 바닥부터 학습하는 대신, <strong>UBM의 파라미터를 이 화자의 데이터 방향으로 조금 밀어주는(adapt)</strong> 것입니다.</p>
<p>$$\hat{\boldsymbol{\mu}}_k = \alpha_k \cdot E_k(\mathbf{x}) + (1 - \alpha_k) \cdot \boldsymbol{\mu}_k^{\text{UBM}}$$</p>
<p>여기서 <strong>$E_k(\mathbf{x})$</strong> 는 화자 s의 데이터에서 $k$번째 성분에 할당된 프레임들의 가중 평균이고, <strong>$\boldsymbol{\mu}_k^{\text{UBM}}$</strong> 은 UBM에서의 $k$번째 평균 벡터입니다. <strong>$\alpha_k$</strong> 는 적응 계수(adaptation coefficient)로, 해당 성분에 할당된 데이터가 많을수록 1에 가까워져 데이터 쪽을 더 신뢰하고, 적으면 0에 가까워져 UBM 쪽을 더 신뢰합니다.</p>
<p>$$\alpha_k = \frac{N_k}{N_k + r}$$</p>
<p>여기서 <strong>$r$</strong> 은 관련 인자(relevance factor)로, 사전에 설정하는 하이퍼파라미터입니다(보통 16 정도). $N_k$가 $r$보다 훨씬 크면 $\alpha_k \approx 1$이 되어 데이터를 거의 그대로 반영하고, $N_k$가 작으면 UBM의 사전 정보(prior)에 의존합니다. 이것이 바로 <strong>Bayesian 적응</strong>의 아름다움입니다 — 데이터가 적을 때 자동으로 사전 분포(UBM)로 회귀합니다.</p>
<blockquote>
<p>💡 <strong>왜 평균만 적응하는가?</strong>
실무에서는 대부분 <strong>평균 벡터(μ)만 적응</strong>하고, 가중치(w)와 공분산(Σ)은 UBM의 값을 그대로 사용합니다. 이유는 두 가지입니다. 첫째, 실험적으로 평균만 적응해도 화자 판별력의 대부분이 확보됩니다. 둘째, 가중치와 공분산까지 적응하면 파라미터 수가 크게 늘어나 적은 데이터로 안정적인 추정이 어렵습니다.</p>
</blockquote>
<h3 id="92-supervector와-i-vector">9.2. Supervector와 i-vector</h3>
<p>MAP 적응으로 얻은 화자별 GMM에서, 모든 K개 성분의 적응된 평균 벡터 $\hat{\boldsymbol{\mu}}_1, \hat{\boldsymbol{\mu}}_2, \ldots, \hat{\boldsymbol{\mu}}_K$를 하나로 이어붙이면(concatenate), <strong>GMM 슈퍼벡터(supervector)</strong> 가 됩니다.</p>
<p>$$\mathbf{M}_s = [\hat{\boldsymbol{\mu}}_1^\top, \hat{\boldsymbol{\mu}}_2^\top, \ldots, \hat{\boldsymbol{\mu}}_K^\top]^\top \in \mathbb{R}^{K \times D}$$</p>
<p>$K=1024$, $D=39$(39차원 MFCC)이면 슈퍼벡터의 차원은 $1024 \times 39 = 39{,}936$차원입니다. 이 고차원 벡터가 한 화자의 음향적 특성을 담고 있습니다. 같은 화자의 서로 다른 발화에서 추출한 슈퍼벡터는 가까이 모이고, 다른 화자의 슈퍼벡터와는 멀어지는 것이 이상적입니다.</p>
<p>하지만 39,936차원은 너무 고차원입니다. 여기에 <strong>Total Variability(전체 가변성) 모델</strong>이 등장하여 이 슈퍼벡터를 저차원 공간(보통 400차원 내외)으로 사영(project)합니다. 이 저차원 벡터가 바로 <strong>i-vector</strong>입니다.</p>
<p>$$\mathbf{M}_s = \mathbf{m} + \mathbf{T} \cdot \mathbf{w}_s$$</p>
<p><strong>$\mathbf{m}$</strong> 은 UBM 슈퍼벡터(모든 화자의 평균), <strong>$\mathbf{T}$</strong> 는 전체 가변성 행렬(total variability matrix), <strong>$\mathbf{w}_s$</strong> 가 바로 화자 s의 i-vector입니다. $\mathbf{T}$는 대규모 데이터에서 Factor Analysis로 학습됩니다.</p>
<p>i-vector 추출 과정에서 UBM은 두 가지 역할을 합니다. 첫째, <strong>기준점($\mathbf{m}$)</strong> 을 제공합니다. 둘째, i-vector를 추출할 때 각 프레임의 <strong>Baum-Welch 통계량(zeroth-order와 first-order statistics)</strong> 을 UBM의 성분별로 계산하는데, 이때 UBM의 성분 구조가 그대로 사용됩니다.</p>
<p>$$N_k = \sum_t \gamma_k(t) \quad \text{(zeroth-order)}$$</p>
<p>$$\mathbf{F}_k = \sum_t \gamma_k(t) \cdot (\mathbf{x}_t - \boldsymbol{\mu}_k^{\text{UBM}}) \quad \text{(centralized first-order)}$$</p>
<p>여기서 $\gamma_k(t)$는 UBM에서 계산된 프레임 $t$의 $k$번째 성분에 대한 사후 확률입니다. 이 통계량이 주어지면, i-vector $\mathbf{w}_s$는 사후 분포의 기대값으로 구해집니다.</p>
<hr>
<h2 id="10-vad-→-ubm-두-모듈의-연결">10. VAD → UBM: 두 모듈의 연결</h2>
<p>지금까지 VAD와 UBM을 각각 살펴봤습니다. 이제 이 둘이 화자 분리 파이프라인 안에서 어떻게 연결되는지 전체 흐름을 정리해 보겠습니다.</p>
<p><strong>① 원시 오디오 입력</strong>
WAV 파일(또는 실시간 오디오 스트림)이 시스템에 들어옵니다. 보통 16kHz 샘플링, 16비트 양자화의 단일 채널(mono)을 가정합니다.</p>
<p><strong>② VAD 적용</strong>
전체 오디오에 VAD를 적용하여, 음성이 존재하는 구간의 타임스탬프를 추출합니다.
출력: <code>[(0.5s, 3.7s), (4.1s, 6.9s), (8.3s, 13.4s), …]</code></p>
<p><strong>③ 음성 구간만 특징 추출</strong>
VAD가 음성으로 판정한 구간에서만 MFCC(또는 log-mel filterbank) 특징을 추출합니다. 비음성 구간은 아예 건너뜁니다.</p>
<p><strong>④ 세그먼테이션</strong>
음성 구간을 일정 길이(예: 1~3초)의 짧은 세그먼트로 나눕니다. 각 세그먼트는 &quot;한 화자가 말한 짧은 조각&quot;으로 가정됩니다. 이 가정이 성립하려면 세그먼트가 너무 길지 않아야 합니다(화자 전환 포함 가능성 ↑).</p>
<p><strong>⑤ UBM 기반 화자 표현 추출</strong>
각 세그먼트의 특징 벡터들을 UBM에 넣어 Baum-Welch 통계량을 구하고, MAP 적응 또는 i-vector 추출을 통해 해당 세그먼트의 화자 표현(embedding)을 생성합니다.</p>
<p><strong>⑥ 클러스터링</strong>
세그먼트별 화자 표현들을 AHC(Agglomerative Hierarchical Clustering), Spectral Clustering, 또는 다른 클러스터링 알고리즘으로 묶어, 같은 화자의 세그먼트들을 하나의 그룹으로 모읍니다.</p>
<p><strong>⑦ 최종 출력</strong>
각 세그먼트에 화자 라벨이 할당되고, 이를 시간축에 펼치면 &quot;누가 언제 말했는가&quot;의 최종 결과가 됩니다.</p>
<blockquote>
<p>🚨 <strong>VAD 오류의 전파</strong>
이 파이프라인에서 VAD의 중요성이 한 번 더 드러납니다. <strong>VAD가 놓친 음성 구간(missed speech)</strong> 은 이후 단계에서 영영 복구할 수 없습니다. 반대로 <strong>비음성을 음성으로 잘못 판정한 구간(false alarm)</strong> 은 해당 프레임의 특징 벡터가 UBM에 넘어가 화자 표현을 오염시킵니다. 따라서 VAD의 성능은 전체 화자 분리 성능의 상한(upper bound)을 결정짓는 요인 중 하나입니다.</p>
</blockquote>
<hr>
<h2 id="11-정리">11. 정리</h2>
<p>이번 글에서 다룬 내용을 요약합니다.</p>
<table>
<thead>
<tr>
<th>모듈</th>
<th>역할</th>
<th>핵심 개념</th>
</tr>
</thead>
<tbody><tr>
<td><strong>VAD</strong></td>
<td>음성 존재 구간 검출</td>
<td>에너지/ZCR, 통계적 우도비 검정, 뉴럴 VAD (DNN/LSTM/Transformer), 후처리 (미디언 필터, 최소 길이 제약)</td>
</tr>
<tr>
<td><strong>UBM</strong></td>
<td>화자 독립적 배경 음향 모델</td>
<td>GMM, EM 알고리즘, MAP 적응, Supervector, i-vector, Baum-Welch 통계량</td>
</tr>
</tbody></table>
<p><strong>VAD</strong>는 화자 분리의 첫 관문으로, 이후 모든 단계에 넘겨줄 데이터의 순도를 결정합니다. 단순한 에너지 임계값부터 딥러닝 모델까지 다양한 스펙트럼이 존재하며, 시스템의 요구 사항(실시간 여부, 소음 환경, 계산 자원)에 맞게 선택합니다.</p>
<p><strong>UBM</strong>은 &quot;모든 화자의 평균적 목소리&quot;를 모델링한 GMM으로, 개별 화자의 특성을 추출하기 위한 기준점입니다. MAP 적응을 통해 소량의 데이터로도 화자별 모델을 안정적으로 구축할 수 있으며, 이를 확장한 i-vector는 화자 표현의 표준으로 오랫동안 자리잡았습니다.</p>
<p>다음 파트에서는 이 i-vector 위에서 화자를 군집화하는 클러스터링 기법과, 딥러닝 기반 화자 임베딩(d-vector, x-vector)에 대해 다루겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration]]></title>
            <link>https://velog.io/@sujin-koo/Paper-Review-AWQ-Activation-aware-Weight-Quantization-for-LLM-Compression-and-Acceleration</link>
            <guid>https://velog.io/@sujin-koo/Paper-Review-AWQ-Activation-aware-Weight-Quantization-for-LLM-Compression-and-Acceleration</guid>
            <pubDate>Sat, 11 Apr 2026 05:00:24 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/abs/2306.00978">https://arxiv.org/abs/2306.00978</a></p>
<p>작성중..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[화자 분리(Speaker Diarization) 기초 (1) - MFCC]]></title>
            <link>https://velog.io/@sujin-koo/%ED%99%94%EC%9E%90-%EB%B6%84%EB%A6%ACSpeaker-Diarization-%EA%B8%B0%EC%B4%88-1-MFCC</link>
            <guid>https://velog.io/@sujin-koo/%ED%99%94%EC%9E%90-%EB%B6%84%EB%A6%ACSpeaker-Diarization-%EA%B8%B0%EC%B4%88-1-MFCC</guid>
            <pubDate>Thu, 09 Apr 2026 08:05:55 GMT</pubDate>
            <description><![CDATA[<h1 id="시작하기-전에">시작하기 전에...</h1>
<p>용어를 헷갈려 하실까봐 spectrum, spectrogram, mel spectrogram, mfcc 의 차이를 간단히 정리하자면 이와 같습니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/2ae86bd0-76c4-4a94-b5b2-7ffef1798f18/image.png" alt=""></p>
<p><a href="https://www.researchgate.net/figure/Spectrogram-generation-options_fig1_399371262">이미지 출처</a></p>
<p><strong>waveform → (pre-emphasis) → STFT</strong>(framing(hamming window, overlap, hop size) → 각 프레임에 DFT(실제로는 연산 빠르게 하려고 FFT알고리즘 활용)) <strong>→ |magnitude|²</strong> (power spectrum)** → 시간축으로 정렬** (spectrogram) <strong>→ mel filterbank 적용</strong> (mel spectrogram)** → log** (log-mel spectrogram) <strong>→ DCT → MFCC</strong></p>
<ul>
<li>*<em>spectrum: *</em>FT를 통해 frequency domain에서 frequency별 성분이 얼마만큼 있는지 나타낸 것 (복소수 형태로, 크기와 위상 정보를 모두 포함)</li>
<li>*<em>power spectrum: *</em>spectrum에서 위상 정보를 버리고 크기의 제곱(|magnitude|²)만 취한 것. frequency별 에너지 분포를 나타낸다.</li>
<li>*<em>spectrogram: *</em>power spectrum을 시간축으로 정렬하여 (예를 들어 0<del>25ms 구간의 power spectrum + 10</del>35ms 구간의 power spectrum + ...) time-frequency-energy 정보를 나타낸 것</li>
<li><strong>mel spectrogram:</strong> spectrogram에 mel filterbank를 적용한 것. mel filterbank는 사람의 청각 특성을 반영하여 저주파 대역에서는 필터를 촘촘하게, 고주파 대역에서는 넓게 배치한 필터이다. 사람이 저주파에서는 미세한 주파수 차이도 잘 구분하지만 고주파에서는 상대적으로 둔감한 특성을 모사한 것.</li>
<li><strong>MFCC:</strong> log-mel spectrogram에 DCT를 적용한 뒤 낮은 차수의 계수(보통 13개 정도)만 취한 것. 이 낮은 차수의 계수들이 스펙트럼의 전체적인 형태(spectral envelope)를 나타내며, 음성 인식에 유용한 정보를 압축적으로 담고 있다.</li>
</ul>
<ul>
<li>전통적인 MFCC 추출 과정에서는 pre-emphasis 포함</li>
<li>일반적으로 mel spectrogram 구할 때는 pre-emphasis 과정 미포함</li>
</ul>
<hr>
<h1 id="배경">배경</h1>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/3b415c3f-02ee-4c8f-bd7b-70b57101e104/image.png" alt=""></p>
<p><a href="https://docs.nvidia.com/nemo-framework/user-guide/24.09/nemotoolkit/asr/speaker_diarization/intro.html">이미지 출처</a></p>
<p>회의록 등을 만들 때 사용되는 화자 분리 기술에 대해서 설명드리고자 합니다. 여러 사람이 의견을 나누는 상황에서는 ASR(음성 인식) 기술로 음성을 텍스트로 바꿔주더라도, 각 발언이 누가 한 말인지 구분이 안되면 회의 내용을 정리하기가 어렵습니다. 실제로 쓸 만한 회의록이 되려면 <strong>&quot;00:12<del>00:47 구간은 화자 A, 00:48</del>01:23 구간은 화자 B&quot;</strong>처럼 발화 구간마다 화자를 자동으로 태깅해 주는 기술이 필요합니다. 이 문제를 푸는 분야가 바로 화자 분리(Speaker Diarization) 기술입니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/5db0478b-0534-4134-ad43-fd6302a7521e/image.png" alt=""></p>
<p><a href="https://docs.nvidia.com/nemo-framework/user-guide/24.09/nemotoolkit/asr/speaker_diarization/intro.html">이미지 출처</a></p>
<p>화자 분리를 이해하기 위해서는 데이터에서 어떻게 음성 신호를 캐치하고 음성 특성을 뽑아낼 것인가(VAD, MFCC), 그 특성을 어떻게 저차원 벡터로 압축할 것인가(i-vector, x-vector), 벡터 간 유사도를 어떻게 정의하고 클러스터링할 것인지(LDA, PLDA, AHC), 그리고 결과를 어떻게 정량 평가할 것인지(EER, minDCF, DER)를 알아야합니다.</p>
<p>이 글에서는 화자 분리의 각 요소들을 간단히 소개하고자 합니다.</p>
<blockquote>
<p>관련 개념: MFCC, VAD, UBM, i-vector, x-vector, LDA, PLDA, EER, minDCF</p>
</blockquote>
<h1 id="화자-분리란-무엇인가">화자 분리란 무엇인가</h1>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/c8554ac6-e0aa-487f-ba77-78e520c39004/image.png" alt=""></p>
<p><a href="https://actionpower.medium.com/%EC%9D%8C%EC%84%B1-%EC%9D%B8%EC%8B%9D-%EA%B8%B0%EC%88%A0-1-%ED%99%94%EC%9E%90-%EB%B6%84%EB%A6%AC-speaker-diarization-f71b5f34119e">이미지 출처</a></p>
<p>화자 분리(Speaker Diarization)는 여러 사람의 목소리가 섞인 오디오에서 <strong>각 발화 구간에 화자 레이블을 붙이는 기술</strong>입니다. 회의 녹음, 전화 통화, 팟캐스트 등에서 &quot;이 구간은 화자 A, 저 구간은 화자 B&quot;를 자동으로 알아냅니다.</p>
<p>여기서 중요한 구분이 있습니다. 많이들 헷갈려 하시는데, 화자 분리는 <strong>화자 인식(Speaker Recognition)</strong>과 목적이 다릅니다.</p>
<table>
<thead>
<tr>
<th>구분</th>
<th>화자 인식 (Recognition)</th>
<th>화자 분리 (Diarization)</th>
</tr>
</thead>
<tbody><tr>
<td>질문</td>
<td>&quot;이 사람이 누구인가?&quot;</td>
<td>&quot;몇 명이 말하고, 각각 언제 말하는가?&quot;</td>
</tr>
<tr>
<td>사전 등록</td>
<td>필요 (등록된 화자 DB 존재)</td>
<td>불필요 (미지의 화자들)</td>
</tr>
<tr>
<td>출력</td>
<td>화자 ID 또는 수락/거부</td>
<td>시간 구간 + 화자 레이블 (spk_0, spk_1, …)</td>
</tr>
</tbody></table>
<p>화자 분리는 보통 화자의 수조차 사전에 알 수 없는 상황에서 동작해야 합니다. 임베딩 추출기(i-vector, x-vector)와 스코어링 모델(PLDA)은 별도의 레이블 데이터로 사전 학습하지만, 최종적으로 테스트 오디오에서 화자를 나누는 단계는 정답 레이블 없이 유사도 기반으로 묶는 비지도 클러스터링입니다. 이런 점에서 화자 분리는 화자 인식과 다르다고 할 수 있습니다.</p>
<hr>
<h1 id="mfcc">MFCC</h1>
<h2 id="mfccmel-frequency-cepstral-coefficients란">MFCC(Mel-Frequency Cepstral Coefficients)란</h2>
<p>오디오 신호 그 자체(waveform)는 샘플 수가 방대하고, 화자 정보와 무관한 잡음 등의 정보도 뒤섞여 있습니다. 우리가 원하는 것은 오로지 화자 정보를 알 수 있는 간결한 표현이고, 이러한 표현 중 하나로 사용되는 것이 MFCC입니다.</p>
<p>MFCC는 파형 전체를 그대로 사용하지 않고 인간의 청각 특성(mel scale)을 모방하여 스펙트럼 포락(spectral envelope)을 소수의 계수로 압축합니다. 그래서 성도(vocal tract) 특성, 채널 특성, 발성 습관 같은 정보는 어느 정도 남기되, 원 신호의 세밀한 위상 정보 등은 직접 다루지 않습니다. 다시 말해 MFCC는 화자를 구별하는 데 유용한 음향 단서들을 추출하는 단계입니다.  </p>
<p>참고로 간단히 말하면, log-mel spectrogram에 DCT를 적용해 얻은 계수가 MFCC입니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/d9f49a6b-2a92-49f4-8652-5721c4c39f52/image.png" alt=""></p>
<p><a href="https://www.analyticsvidhya.com/blog/2021/06/mfcc-technique-for-speech-recognition/">이미지 출처</a></p>
<p>음성 신호에서 MFCC를 추출하는 과정은 다음과 같습니다.</p>
<h3 id="①-pre-emphasis-고주파-강조">① Pre-emphasis (고주파 강조)</h3>
<p>사람의 발성은 고주파로 갈수록 에너지가 감쇠하는 특징을 가지고 있습니다. 이를 보상하기 위해 1차 <strong>고역 통과 필터(high-pass filter)</strong>를 적용합니다. 필터의 수식은 다음과 같습니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/78a333a0-38ae-4745-8ede-b1048ae90a24/image.png" alt=""></p>
<p><a href="https://github.com/kaldi-asr/kaldi/blob/e02e35f0254bb033fab73d1df99fc34123e31d56/src/feat/feature-window.cc">코드 출처</a></p>
<p>$$y[n] = x[n] - \alpha \cdot x[n-1], \quad \alpha \approx 0.97$$</p>
<p>쉽게 말하면, <strong>현재 샘플과 직전 샘플의 차이를 계산하는 연산</strong>입니다. <code>x[n]</code>은 원래 오디오의 n번째 샘플, <code>x[n-1]</code>은 바로 직전 샘플, <code>y[n]</code>은 필터를 거친 결과입니다.</p>
<p>이게 왜 고역 통과 필터가 되는지, 예시로 확인해 봅시다. 다음처럼 똑같이 100~130 사이를 오가는 두 가지 신호가 있다고 가정해봅니다,</p>
<p><strong>신호 A</strong> — 천천히 올라갔다 내려오는 <strong>저주파</strong> (방향 전환 1번):
<code>[100, 110, 120, 130, 120, 110, 100]</code></p>
<p><strong>신호 B</strong> — 빠르게 올라갔다 내려갔다를 반복하는 <strong>고주파</strong> (방향 전환 5번):
<code>[100, 130, 100, 130, 100, 130, 100]</code></p>
<p>같은 필터(α = 0.97)를 적용하면:</p>
<table>
<thead>
<tr>
<th></th>
<th>신호 A (저주파)</th>
<th>신호 B (고주파)</th>
</tr>
</thead>
<tbody><tr>
<td>y[1]</td>
<td>110 − 0.97 × 100 = <strong>13.0</strong></td>
<td>130 − 0.97 × 100 = <strong>33.0</strong></td>
</tr>
<tr>
<td>y[2]</td>
<td>120 − 0.97 × 110 = <strong>13.3</strong></td>
<td>100 − 0.97 × 130 = <strong>−26.1</strong></td>
</tr>
<tr>
<td>y[3]</td>
<td>130 − 0.97 × 120 = <strong>13.6</strong></td>
<td>130 − 0.97 × 100 = <strong>33.0</strong></td>
</tr>
<tr>
<td>y[4]</td>
<td>120 − 0.97 × 130 = <strong>−6.1</strong></td>
<td>100 − 0.97 × 130 = <strong>−26.1</strong></td>
</tr>
<tr>
<td>y[5]</td>
<td>110 − 0.97 × 120 = <strong>−6.4</strong></td>
<td>130 − 0.97 × 100 = <strong>33.0</strong></td>
</tr>
<tr>
<td>y[6]</td>
<td>100 − 0.97 × 110 = <strong>−6.7</strong></td>
<td>100 − 0.97 × 130 = <strong>−26.1</strong></td>
</tr>
<tr>
<td><strong>절댓값 범위</strong></td>
<td><strong>6 ~ 14</strong></td>
<td><strong>26 ~ 33</strong></td>
</tr>
</tbody></table>
<p>같은 100~130 범위의 신호인데, 필터 통과 후 고주파 쪽이 더 큽니다. 저주파 신호는 연속된 샘플이 비슷해서 빼면 상쇄되고, 고주파 신호는 매번 방향이 뒤집히니까 빼기가 오히려 차이를 키워주는 겁니다. 결국 이 연산은 변화량을 강조하는 방식이며, 그 결과, 샘플 간 변화가 작으면(저주파) 값이 작아져 저주파가 억제되고, 샘플 간 변화가 크면(고주파) 값이 크게 남아 <strong>고주파가 상대적으로 부각</strong>됩니다.</p>
<p>이걸 왜 하느냐면, 사람의 발성 원리 때문입니다. 성대(glottal pulse)가 만든 원래 신호는 고주파로 갈수록 감쇠합니다. 그대로 분석하면 저주파에 에너지가 쏠려서 고주파 대역의 정보가 묻히게 되는데, 이 필터로 미리 고주파를 끌어올려서 전 대역의 에너지 밸런스를 맞춰 주는 겁니다. 그래야 이후 FFT → Mel Filterbank 단계에서 고주파 대역의 성도(vocal tract) 특성까지 제대로 포착할 수 있습니다.</p>
<p>α는 0.95~0.97이 관례적으로 사용됩니다.</p>
<h3 id="②-sampling--windowing-프레임-분할--윈도우">② Sampling &amp; Windowing (프레임 분할 + 윈도우)</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/b223dbc6-30d8-4a51-a382-63c1003a8b44/image.png" alt=""></p>
<p><a href="https://github.com/kaldi-asr/kaldi/blob/e02e35f0254bb033fab73d1df99fc34123e31d56/src/featbin/extract-feature-segments.cc#L56">코드 출처</a></p>
<p>Pre-emphasis된 신호를 <strong>20~40 ms 단위의 프레임으로 분할</strong>합니다. 음성 신호는 이 정도 짧은 구간에서는 특성이 크게 변하지 않는 &#39;준정상(quasi-stationary)&#39; 상태라고 가정할 수 있기 때문입니다. Kaldi 기본 설정은 <strong>25 ms 프레임, 10 ms 시프트</strong>로, 1초에 약 100개의 프레임이 생성됩니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/6848be94-2fb3-4362-a581-ae93dbfd0530/image.png" alt=""></p>
<p><a href="https://kr.mathworks.com/help/dsp/ref/dsp.stft.html">이미지 출처</a></p>
<p>여기서 중요한 점은, 일반적으로 <strong>프레임을 겹치게(overlap) 분할한다</strong>는 것입니다. 10 ms 시프트에 25 ms 프레임이면 약 60%가 겹칩니다. 겹침 없이 프레임을 분할하면 인접 프레임 간에 공유하는 샘플이 없어 시간적 연속성이 떨어지고, 특히 아래에서 설명할 해밍 윈도우를 적용하면 프레임 양쪽 끝의 에너지가 감쇠되는데, overlap이 없으면 그 감쇠된 구간의 정보가 아예 유실될 수 있습니다. 겹침은 이러한 정보 손실을 보완하기 위한 것입니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/91cd4132-318c-4abf-804a-14d1b0453299/image.png" alt=""></p>
<p><a href="https://kr.mathworks.com/help/dsp/ref/dsp.stft.html">이미지 출처</a></p>
<p>이후 각 프레임에 <strong>윈도우 함수(window function)</strong>를 곱합니다. 보통 <strong>해밍(Hamming) 윈도우</strong>를 사용합니다.</p>
<p>$$w[n] = 0.54 - 0.46 \cdot \cos\left(\frac{2\pi n}{N-1}\right)$$</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/17807dcc-0e4b-4f84-9fb9-e776e3f26bac/image.png" alt=""></p>
<p><a href="https://en.wikipedia.org/wiki/Spectral_leakage">이미지 출처</a></p>
<p>왜 해밍 윈도우를 사용할까요? 프레임을 잘라내는 행위는 사실상 사각형 윈도우(rectangular window)를 곱한 것과 같습니다. 이 경우 프레임 양쪽 끝에서 신호가 갑자기 뚝 끊기면서 불연속점이 생기는데, 이 상태로 FFT를 하면 원래 신호에는 없는 주파수 성분이 가짜로 나타납니다. 이를 spectral leakage라고 합니다. (위 그림에서 원래는 검정색 화살표가 원 신호인데, 프레임을 잘라내면서 파랑색이나 빨간색처럼 원하지 않은 ripple 신호가 생긴 것을 볼 수 있습니다.)</p>
<p>해밍 윈도우는 프레임의 양 끝을 부드럽게 감쇠시켜 이러한 불연속의 급격함을 완화함으로써, spectral leakage를 줄이는 역할을 합니다. 한편, 윈도우를 적용하면 프레임 가장자리의 에너지가 줄어들면서 정보가 손실되는데, 이는 프레임을 겹치게(overlap) 분할하는 것으로 보완합니다. 즉, spectral leakage는 해밍 윈도우로 보완하고, 정보 손실은 overlap으로 보완하는 것입니다.</p>
<h3 id="③-dft--fft-이산-푸리에-변환">③ DFT / FFT (이산 푸리에 변환)</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/d3bae529-be00-4b8a-9c3a-be7dc0fa6604/image.png" alt=""></p>
<p><a href="https://www.researchgate.net/figure/Fast-Fourier-Transformation-2-Fast-Fourier-Transformation-To-increase-the-performance_fig6_323281289">이미지 출처</a></p>
<p>각 프레임에 <strong>FFT(Fast Fourier Transform)</strong>를 적용하여 시간 영역 신호를 주파수 영역으로 변환합니다. 이를 통해 해당 프레임에 어떤 주파수 성분이 얼마나 포함되어 있는지 분석할 수 있습니다.</p>
<p>참고로 <strong>DFT(Discrete Fourier Transform)</strong>는 시간 영역의 이산 신호를 주파수 성분으로 변환하는 수학적 정의이며, FFT는 DFT를 효율적으로 계산하기 위한 알고리즘입니다. FFT는 DFT의 구조적 대칭성과 주기성을 이용하여 연산량을 줄임으로써 빠른 계산을 가능하게 합니다.</p>
<p>이렇게 FFT를 적용한 결과는 복소수(크기 + 위상)입니다. 여기서 위상 정보를 버리고 크기의 제곱(|magnitude|²)을 취하면 <strong>power spectrum</strong>이 됩니다. 이는 각 주파수 대역에 에너지가 얼마나 분포하는지를 나타냅니다.</p>
<p>이후 각 프레임에서 구한 power spectrum을 시간축으로 정렬하면 spectrogram이 됩니다. <strong>Spectrogram</strong>은 시간-주파수-에너지 세 가지 정보를 동시에 나타내는 표현입니다.</p>
<h3 id="④-mel-filterbank">④ Mel Filterbank</h3>
<p>MFCC 추출에서 <strong>가장 핵심적인 단계</strong>입니다. 인간의 달팽이관(cochlea)은 주파수에 대해 비선형적인 해상도를 가집니다. 약 1000 Hz 이하에서는 주파수를 선형적으로 구분하지만, 그 이상에서는 로그적으로 인식합니다. 즉 낮은 주파수 대역에서는 미세한 차이도 잘 구분하지만, 높은 주파수 대역에서는 뭉뚱그려서 듣는 것입니다. 이 특성을 모델링한 것이 <strong>Mel 스케일</strong>입니다.</p>
<p>$$m = 2595 \cdot \log_{10}\left(1 + \frac{f}{700}\right)$$</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/c051ea96-b96f-45bd-bef4-a33562ffbc3f/image.png" alt=""></p>
<p><a href="https://www.researchgate.net/figure/Mel-filter-banks-basis-functions-using-20-Mel-filters-in-the-filter-bank_fig1_288632263">이미지 출처</a></p>
<p>이 Mel 스케일 위에 <strong>삼각형 필터(triangular filters)</strong> 배치합니다. 달팽이관의 특성을 반영하여, <strong>저주파 대역에는 좁은 삼각형 필터</strong>가, <strong>고주파 대역으로 갈수록 넓은 삼각형 필터</strong>가 놓입니다. 이 삼각형 필터들의 집합이 바로 <strong>Mel Filterbank</strong>입니다. 이 필터를 앞에서 구해놓은 spectrogram에 적용한 것을 <strong>mel spectrgoram</strong> 이라고 부릅니다.</p>
<h3 id="⑤-log-압축">⑤ Log 압축</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/6ea6db4d-9fb1-44b2-af3c-016df2a1989b/image.png" alt=""></p>
<p><a href="https://towardsdatascience.com/audio-deep-learning-made-simple-part-2-why-mel-spectrograms-perform-better-aad889a93505/">이미지 출처</a></p>
<p>mel spectrogram에 로그를 취합니다. 이를 <strong>log-mel spectrogram</strong>이라 합니다.</p>
<p>여기에는 두 가지 이유가 있습니다.</p>
<p>첫째, 인간의 음량 인식 자체가 로그적(Weber&#39;s law)이기 때문에, 로그를 취하면 사람의 청각 인지에 더 가까운 표현이 됩니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/ac80ef38-82a0-4da5-bf9c-60e69436d73d/image.png" alt=""></p>
<p><a href="https://www.sciencedirect.com/topics/computer-science/vocal-tract-filter">이미지 출처</a></p>
<p>둘째, 위 그림처럼 음성 신호는 <strong>음원(source)</strong>과 <strong>필터(filter)</strong>의 결합으로 만들어집니다.</p>
<ul>
<li><p><strong>음원(source)</strong>: 성대(vocal cords)가 진동하며 만들어내는 excitation signal입니다. 유성음(voiced sound, 성대가 진동하는 소리 — 모음이나 ㄴ, ㅁ, ㄹ 등)의 경우 기본 주파수(F0)의 배수인 harmonics로 구성되며 고주파로 갈수록 에너지가 감소하고, 무성음(unvoiced sound, 성대가 진동하지 않는 소리 — ㅅ, ㅎ, ㅍ 등)의 경우 비주기적 신호가 됩니다.</p>
</li>
<li><p><strong>필터(filter)</strong>: 성도(vocal tract) — 목, 입, 코 등의 공간 — 의 공명 특성입니다. 혀의 위치, 입술 모양, 입의 개폐 등 성도의 형태 변화에 따라 다양한 모음과 자음이 만들어집니다. 스펙트럼에서 봉우리(formant)로 나타나며, 특히 모음의 경우 formant의 위치가 음소 구분의 핵심 단서가 됩니다.</p>
</li>
</ul>
<p>이 둘은 시간 영역에서 컨볼루션으로 결합되어 있고, 이는 주파수 영역에서 곱셈 관계에 해당합니다. 로그를 취하면 이 곱셈 관계가 덧셈 관계로 변환되어, 이후 DCT 단계에서 음원과 필터 성분을 분리할 수 있는 전제 조건이 됩니다. 또한 마이크나 채널 등에 의한 곱셈적 왜곡(convolutional distortion)도 덧셈으로 전환되어, CMVN(Cepstral Mean and Variance Normalization) 같은 정규화 기법으로 쉽게 제거할 수 있게 됩니다.</p>
<p>참고로 <strong>CMVN</strong>이란 cepstral 계수의 평균을 0, 분산을 1로 정규화하여 녹음 환경이나 채널 차이로 인한 왜곡을 보상하는 기법입니다.</p>
<h3 id="⑥-dct-discrete-cosine-transform">⑥ DCT (Discrete Cosine Transform)</h3>
<p>마지막으로 log-mel spectrogram에 <strong>DCT(이산 코사인 변환)</strong>를 적용합니다.
이 단계를 이해하기 위해, 먼저 일반적인 스펙트럼에서 cepstrum이 어떻게 만들어지는지 살펴보겠습니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/c1823231-8daa-4cc5-9f91-b9e8012cb9a9/image.png" alt="">
<a href="https://aliencoder.tistory.com/231#google_vignette">이미지 출처</a></p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/107d0de1-0a7a-40c1-9ed6-22b1640356e4/image.png" alt="">
<a href="https://www.researchgate.net/figure/Graphical-interpretation-of-cepstrum_fig1_26335113">이미지 출처</a></p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/26efea79-9daa-4635-950a-23a9d0065709/image.png" alt="">
<a href="https://en.wikipedia.org/wiki/Cepstrumr">이미지 출처</a></p>
<p>위 그림의 Spectrum을 보면, 봉우리(harmonics)가 일정 간격으로 빽빽하게 반복되고 있고, 그 봉우리들을 감싸는 부드러운 윤곽선(spectral envelope)이 있습니다. 앞서 설명한 source-filter 모델로 보면, <strong>빽빽한 반복 패턴은 성대(source)의 피치 정보</strong>이고, <strong>부드러운 윤곽선은 성도(filter)의 형태 정보</strong>입니다.</p>
<p>이 두 성분은 주파수 영역에서 <strong>곱셈</strong>으로 결합되어 있습니다(S = E × V). 우리는 이걸 분리하고 싶습니다. 어떻게 할 수 있을까요?</p>
<p><strong>핵심 아이디어: log로 곱셈을 덧셈으로 바꾼 뒤, IDFT로 분리한다.</strong></p>
<ul>
<li>spectrum에 log를 취하면: log(S) = log(E × V) = log(E) + log(V)</li>
</ul>
<p>이제 log spectrum이라는 숫자 배열 안에는 두 성분이 <strong>덧셈</strong>으로 나란히 존재합니다.</p>
<ul>
<li>log(V) = 주파수 축에서 <strong>천천히</strong> 변하는 부드러운 윤곽선(envelope)</li>
<li>log(E) = 주파수 축에서 <strong>빠르게</strong> 반복되는 harmonics 패턴</li>
</ul>
<p>이 log spectrum에 <strong>IDFT(역 푸리에 변환)</strong>를 적용하면, IDFT는 입력 배열 안에 있는 주기적 패턴을 분해해줍니다. 천천히 변하는 성분은 결과의 앞쪽(낮은 index)에, 빠르게 반복되는 성분은 뒤쪽(높은 index)에 나타납니다. log가 없으면 spectrum = E × V (곱셈 상태)이므로 IDFT를 해도 그냥 원래 시간 신호로 복원될 뿐, 두 성분이 깔끔하게 분리되지 않습니다. log를 취해야 덧셈 상태가 되고, 그래야 IDFT가 느린 성분과 빠른 성분을 양쪽으로 분리할 수 있습니다.</p>
<p>위 Cepstrum 그림(오른쪽 아래)으로 보면, 천천히 변하는 성분(envelope)은 낮은 쪽(x축 0<del>50 부근)에, 빠르게 반복되는 성분(harmonics)은 높은 쪽(x축 50</del>200 부근의 뾰족한 피크)에 나타납니다. 이 결과가 바로 <strong>cepstrum</strong>입니다. spectrum의 철자를 뒤집어 <strong>cepstrum</strong>이라 부릅니다. cepstrum의 x축은 <strong>quefrency</strong>라 부릅니다(frequency의 철자를 뒤집은 것).</p>
<p>정리하면 cepstrum 그림에서:</p>
<ul>
<li><strong>왼쪽(낮은 quefrency)</strong>: 스펙트럼에서 천천히 변하는 성분 = <strong>부드러운 윤곽선 = spectral envelope = 성도의 공명 특성</strong></li>
<li><strong>오른쪽(높은 quefrency)</strong>: 스펙트럼에서 빽빽하게 반복되는 성분 = <strong>harmonics = 성대의 피치 정보</strong></li>
</ul>
<blockquote>
<p><strong>왜 DFT가 아니라 IDFT를 쓰는가?</strong></p>
<p>실제 수식을 보면 DFT와 IDFT의 차이는 매우 작습니다.</p>
<p>$$\text{DFT: } X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-j2\pi kn/N}$$</p>
<p>$$\text{IDFT: } x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] \cdot e^{+j2\pi kn/N}$$</p>
<p>차이는 <strong>지수의 부호(+/-)와 1/N 스케일링</strong>뿐입니다. 둘 다 본질적으로 &quot;입력 배열을 주기적 성분으로 분해하는 연산&quot;입니다. 첫 번째 DFT로 시간 영역 → 주파수 영역으로 변환했으므로, 다시 주파수 영역 → 시간과 같은 차원(quefrency)으로 돌아가는 방향이라서 IDFT라고 부르는 것입니다. 실제로 real cepstrum의 경우(log magnitude를 입력으로 사용하여 실수이고 대칭인 경우) IDFT를 적용하는 것과 DFT를 적용하는 것은 동일합니다.</p>
</blockquote>
<blockquote>
<p><strong>그러면 MFCC에서 왜 DCT를 쓰는가?</strong></p>
<p>DFT/IDFT는 코사인과 사인 성분을 모두 사용하여 복소수 결과가 나오지만, DCT는 코사인 성분만 사용하여 실수 결과만 나옵니다. 위에서 구한 Log mel spectrogram은 실수 배열이기 때문에, 복소수 출력이 나오는 DFT/IDFT 대신 실수 출력만 나오는 DCT를 쓰는 것이 더 효율적입니다.</p>
<p>정리하면:</p>
<ul>
<li><strong>전통적 cepstrum</strong>: spectrum → log → <strong>IDFT</strong> (수학적 정의)</li>
<li><strong>MFCC</strong>: mel spectrum → log → <strong>DCT</strong> (IDFT의 실용적 대체)</li>
</ul>
</blockquote>
<p>이것이 일반적인 cepstrum의 원리입니다. <strong>MFCC에서는 원래 스펙트럼을 그대로 쓰는 것이 아니라, 이미 mel filterbank를 적용한 mel spectrogram에서 출발합니다.</strong> 여기에 log를 취한 뒤 DCT를 적용하여 <strong>cepstrum</strong>을 구합니다.</p>
<p>이 DCT 연산의 핵심 목적은 <strong>cepstral analysis를 통한 source-filter 분리</strong>입니다. 낮은 quefrency의 계수만 취하면 성도의 형태 정보만 추출할 수 있고, 동시에 차원도 압축됩니다. 전통적인 MFCC 시스템에서는 보통 8~13개의 cepstral 계수를 사용하며, 0번째 계수(c₀)는 입력 신호의 평균 log-energy를 나타내기 때문에 (이 프레임이 전체적으로 얼마나 큰 소리인가를 알려줄 뿐 스펙트럼의 형태 정보는 담고 있지 않아서) 제외하는 경우가 많습니다. </p>
<p>또한 부수적으로 <strong>상관관계 제거(de-correlation)</strong> 효과도 있습니다. 인접한 Mel 필터 대역끼리는 삼각형 필터가 서로 겹치기 때문에 에너지가 상관(correlation)되어 있는데, DCT는 직교 변환(orthogonal transform)이므로 변환 후 계수들이 서로 독립적이 됩니다. 덕분에 이후 GMM 등에서 대각 공분산 행렬만으로도 효과적인 모델링이 가능해집니다.</p>
<p>여기까지의 결과물이 바로 <strong>MFCC(Mel-Frequency Cepstral Coefficients)</strong>입니다.</p>
<blockquote>
<p><strong>왜 하위 계수만 쓰나?</strong>
위 Cepstrum 그림에서 볼 수 있듯이, 낮은 quefrency 영역에는 스펙트럼의 완만한 변동 성분, 즉 spectral envelope가 주로 나타나며, 이는 성도의 공명 특성과 밀접하게 관련됩니다. 반면 높은 quefrency 영역에는 스펙트럼의 빠른 주기적 변동 성분이 나타나고, 여기에는 pitch period 및 이에 따른 조화구조(harmonic structure) 정보가 반영됩니다.
음성 인식에서 중요한 것은 화자의 높낮이 자체보다 음소를 구별하는 성도 필터의 특성, 즉 formant를 포함한 spectral envelope입니다. 같은 음소는 피치가 달라져도 동일한 음소로 인식되어야 하므로, 음성 인식용 특징에서는 pitch보다 envelope 정보가 더 필요합니다.
화자 인식이나 화자 분리에서도 성도의 길이, 구강 및 비강 구조와 같은 화자 고유의 생리적 특성이 spectral envelope에 반영되므로, 이는 비교적 안정적인 화자 구분 단서로 활용될 수 있습니다. 다만 pitch 역시 화자 특성을 일부 담고 있어 완전히 불필요한 정보는 아니지만, 발화 상황, 감정, 억양, 문맥에 따라 변동성이 크기 때문에 단독으로는 안정적인 특징이라 보기 어렵습니다.
이러한 이유로 MFCC는 cepstral 계수 중 저차 계수, 즉 주로 spectral envelope를 반영하는 성분을 중심으로 사용하여 성도 정보를 강조하고, pitch와 관련된 고차 quefrency 성분은 상대적으로 억제합니다. 필요에 따라서는 pitch 정보가 별도의 F0 특징으로 추가되어 보완적으로 사용됩니다.</p>
</blockquote>
<hr>
<p>지금까지 화자 분리의 기본이 되는 음성 특징 추출, 그 중 MFCC에 대해 알아보았습니다. 다음 글에서는 이 MFCC를 입력으로 사용하여 화자를 구분하는 임베딩 기법인 i-vector와 x-vector에 대해 다루겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] Emotion Concepts and their Function in a Large Language Model]]></title>
            <link>https://velog.io/@sujin-koo/Paper-Review-Emotion-Concepts-and-their-Function-in-a-Large-Language-Model</link>
            <guid>https://velog.io/@sujin-koo/Paper-Review-Emotion-Concepts-and-their-Function-in-a-Large-Language-Model</guid>
            <pubDate>Wed, 08 Apr 2026 01:39:09 GMT</pubDate>
            <description><![CDATA[<p><a href="https://transformer-circuits.pub/2026/emotions/index.html">https://transformer-circuits.pub/2026/emotions/index.html</a>
<a href="https://www.anthropic.com/research/emotion-concepts-function">https://www.anthropic.com/research/emotion-concepts-function</a></p>
<p>작성중..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[chown – 파일 소유자 변경]]></title>
            <link>https://velog.io/@sujin-koo/chown-%ED%8C%8C%EC%9D%BC-%EC%86%8C%EC%9C%A0%EC%9E%90-%EB%B3%80%EA%B2%BD</link>
            <guid>https://velog.io/@sujin-koo/chown-%ED%8C%8C%EC%9D%BC-%EC%86%8C%EC%9C%A0%EC%9E%90-%EB%B3%80%EA%B2%BD</guid>
            <pubDate>Tue, 07 Apr 2026 06:07:56 GMT</pubDate>
            <description><![CDATA[<h3 id="chown--파일-소유자-변경">chown – 파일 소유자 변경</h3>
<p>✔️ 기본 개념
chown은 파일이나 디렉토리의 소유자(owner)와 그룹(group) 을 변경하는 명령어이다.</p>
<p>✔️ 사용 예시
sudo chown -R [소유자]:[그룹] [대상 디렉토리]</p>
<p>✔️ 의미
sudo : 관리자 권한으로 실행
chown : 소유자 변경
-R : 하위 디렉토리까지 재귀적으로 적용</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[kaldi 세팅하기]]></title>
            <link>https://velog.io/@sujin-koo/kaldi-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@sujin-koo/kaldi-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 06 Apr 2026 01:19:27 GMT</pubDate>
            <description><![CDATA[<p>kaldi 세팅하기..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[구글 클라우드에서 GPU 세팅하는 법]]></title>
            <link>https://velog.io/@sujin-koo/%EA%B5%AC%EA%B8%80-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%EC%97%90%EC%84%9C-GPU-%EC%84%B8%ED%8C%85%ED%95%98%EB%8A%94-%EB%B2%95</link>
            <guid>https://velog.io/@sujin-koo/%EA%B5%AC%EA%B8%80-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%EC%97%90%EC%84%9C-GPU-%EC%84%B8%ED%8C%85%ED%95%98%EB%8A%94-%EB%B2%95</guid>
            <pubDate>Thu, 02 Apr 2026 08:00:43 GMT</pubDate>
            <description><![CDATA[<p>작성중...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] – Qwen3-TTS]]></title>
            <link>https://velog.io/@sujin-koo/Paper-Review-Qwen3-TTS</link>
            <guid>https://velog.io/@sujin-koo/Paper-Review-Qwen3-TTS</guid>
            <pubDate>Thu, 02 Apr 2026 07:35:55 GMT</pubDate>
            <description><![CDATA[<p>작성중...</p>
<hr>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/bbeb3ef5-8563-490f-b209-3e5fb07f68ba/image.jpg" alt=""></p>
<p>#Streaming_TTS</p>
<hr>
<h2 id="✔️-배경">✔️ 배경</h2>
<p>텍스트를 자연스러운 음성으로 변환하는 기술, 즉 TTS(Text-to-Speech)는 AGI(범용 인공지능)로 가는 길에서 핵심 역량 중 하나로 꼽힙니다. 최근 몇 년간 대규모 데이터셋으로 학습된 신경망 기반 TTS 모델들은 불과 몇 초의 참조 음성만으로도 고품질 음성을 합성해내는 놀라운 능력을 보여주고 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/9441a945-64d7-47a0-934b-8d7cd9859c00/image.png" alt=""></p>
<p>Qwen3-TTS는 Qwen 시리즈에서 최초로 선보이는 TTS 모델입니다. 이 논문은 단순히 목소리를 합성하는 수준을 넘어, 다국어 지원(10개 언어), 3초 음성 클로닝, 자연어 명령을 통한 세밀한 음성 제어, 초저지연 스트리밍이라는 네 가지 핵심 역량을 하나의 프레임워크에 통합한 모델 패밀리를 제안합니다. 그리고 500만 시간이 넘는 음성 데이터로 학습되었다는 점에서, 지금까지 공개된 TTS 모델 중 가장 대규모 학습 기반 중 하나입니다.</p>
<p>최근 TTS 분야에서는 이산적 음성 토큰화(discrete speech tokenization)와 자기회귀 언어 모델링(autoregressive language modeling)의 결합이 큰 주목을 받고 있습니다. 이 방식은 음성 신호를 숫자 코드 시퀀스로 변환한 뒤, 마치 텍스트를 생성하듯 다음 코드를 예측하는 방식으로 음성을 합성합니다. 기존 연속적(continuous) 표현 방식 대비 안정성이 크게 개선되면서도 자연스러움과 인간 유사성을 유지하는 장점이 있습니다. Qwen3-TTS는 이 흐름 위에서, 음성 특징이나 텍스트 지시에 따른 세밀한 운율·스타일 제어까지 가능하게 하여 가상 비서, 자동 콘텐츠 생성 등 다양한 응용 분야의 길을 열어줍니다.</p>
<hr>
<h2 id="✔️-paper-info">✔️ Paper Info</h2>
<ul>
<li><strong>Title</strong>: <a href="https://arxiv.org/pdf/2601.15621">Qwen3-TTS Technical Report</a></li>
<li><strong>Authors</strong>: Hangrui Hu, Xinfa Zhu, Ting He, Dake Guo, Bin Zhang, Xiong Wang, Zhifang Guo, Ziyue Jiang, Hongkun Hao, Zishan Guo, Xinyu Zhang, Pei Zhang, Baosong Yang, Jin Xu, Jingren Zhou, Junyang Lin</li>
<li><strong>Affiliation</strong>: Qwen Team (Alibaba Group)</li>
<li><strong>Conference</strong>: </li>
<li><strong>Keywords</strong>: Text-to-Speech, Speech Tokenizer, Voice Cloning, Streaming Synthesis, Multilingual TTS, Controllable Generation, Multi-Token Prediction, Dual-Track LM Architecture</li>
</ul>
<hr>
<h2 id="✔️-main-problem-and-key-approach">✔️ Main Problem and Key Approach</h2>
<h3 id="기존-tts의-한계">기존 TTS의 한계</h3>
<p>현재 TTS 기술은 크게 세 가지 도전 과제를 안고 있습니다.</p>
<p><strong>첫째, 의미와 음향 사이의 트레이드오프 문제입니다.</strong> 음성을 이산 토큰으로 변환하는 토크나이저 설계에서, 순수한 의미 토크나이저(semantic tokenizer)는 &quot;무슨 말인지&quot;는 잘 포착하지만 음색이나 감정 같은 표현력이 부족합니다. 반대로 순수한 음향 토크나이저(acoustic tokenizer)는 너무 많은 저수준 디테일을 담아서 언어 모델이 다루기 어렵고, 긴 시퀀스에서 오류가 누적됩니다.</p>
<blockquote>
<p><strong>토크나이저란?</strong> 연속적인 음성 신호를 이산적인(discrete) 토큰(숫자 코드 시퀀스)으로 변환해주는 모듈입니다. 텍스트를 단어나 서브워드 단위로 쪼개는 것처럼, 음성도 일정한 단위로 쪼개서 언어 모델이 처리할 수 있는 형태로 만드는 것이죠.</p>
</blockquote>
<p><strong>둘째, 실시간 스트리밍의 어려움입니다.</strong> 기존 모델들은 텍스트를 전부 처리한 후에 음성을 생성하거나, 스트리밍을 지원하더라도 첫 패킷 지연(first-packet latency)이 높아 실시간 대화형 응용에 부적합합니다. 특히 DiT(Diffusion Transformer) 같은 복잡한 디코더를 쓰면 품질은 좋지만 지연이 커지는 딜레마가 있습니다.</p>
<p><strong>셋째, 제어 가능성과 다국어 지원의 통합입니다.</strong> 음성 클로닝, 음성 설계(자연어로 새 목소리 생성), 스타일 편집, 다국어 합성을 하나의 프레임워크에서 동시에 지원하는 모델은 거의 없었습니다.</p>
<h3 id="qwen3-tts의-핵심-접근-방식">Qwen3-TTS의 핵심 접근 방식</h3>
<p>이 문제들에 대한 Qwen3-TTS의 해법은 <strong>이중 토크나이저 + 이중 트랙 LM 아키텍처</strong>라는 설계 철학으로 요약됩니다.</p>
<p><strong>1) 두 종류의 토크나이저를 동시 개발합니다.</strong> 의미와 음향 정보를 통합한 25Hz 단일 코드북 토크나이저와, 초저지연 스트리밍에 최적화된 12Hz 다중 코드북 토크나이저를 각각 개발하여 응용 시나리오에 따라 선택할 수 있게 합니다.</p>
<p><strong>2) 이중 트랙(Dual-Track) LM 아키텍처를 채택합니다.</strong> 텍스트 토큰과 음향 토큰을 채널 축으로 연결하여, 텍스트가 들어올 때마다 즉시 음향 토큰을 예측하는 스트리밍 구조를 구현합니다. 다중 코드북의 경우 MTP(Multi-Token Prediction) 모듈로 모든 잔여 코드북을 동시 예측하여 지연을 최소화합니다.</p>
<p><strong>3) ChatML 형식 기반의 통합된 제어 체계를 구축합니다.</strong> 음성 클로닝, 음성 설계, 스타일 편집을 모두 자연어 지시로 통합하며, 확률적으로 활성화되는 사고 패턴(thinking pattern)을 도입하여 복잡한 지시에 대한 추종 능력을 강화합니다.</p>
<p><strong>4) 대규모 데이터와 체계적 학습 전략을 결합합니다.</strong> 500만 시간 이상의 다국어 음성 데이터로 3단계 사전학습을 수행한 뒤, DPO와 GSPO를 포함한 3단계 후학습으로 인간 선호도에 맞추어 품질과 안정성을 끌어올립니다.</p>
<hr>
<h2 id="✔️-architecture--method">✔️ Architecture &amp; Method</h2>
<h3 id="1-모델-패밀리-구성">1. 모델 패밀리 구성</h3>
<p>Qwen3-TTS는 단일 모델이 아니라 <strong>10개의 모델 변형</strong>으로 구성된 패밀리입니다. 이 모델들은 토크나이저(12Hz / 25Hz), 모델 크기(0.6B / 1.7B), 그리고 기능 특화(Base / VoiceDesign / VoiceEditing / CustomVoice) 세 축으로 분류됩니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/9b36ecd2-dd97-498a-adc7-8bae31671005/image.png" alt=""></p>
<ul>
<li><strong>Base</strong>: 기본 모델. 스트리밍, 다국어, 음성 클로닝을 지원합니다.</li>
<li><strong>VoiceDesign / VoiceEditing</strong>: 자연어 설명 기반으로 새 목소리를 &quot;설계&quot;하거나, 기존 목소리 속성을 &quot;편집&quot;하는 기능 특화 모델입니다.</li>
<li><strong>CustomVoice</strong>: 특정 화자에 대해 파인 튜닝(fine-tuning)된 모델로, 해당 화자의 목소리로 다국어 음성을 생성할 수 있습니다.</li>
</ul>
<hr>
<h3 id="2-음성-토크나이저-qwen-tts-tokenizer">2. 음성 토크나이저 (Qwen-TTS-Tokenizer)</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/7e5bdbce-06e8-4624-b0b2-5e0fea5bbc3e/image.png" alt=""></p>
<p>TTS 시스템의 핵심은 음성을 어떻게 표현하느냐에 있습니다. Qwen3-TTS는 이를 위해 서로 다른 설계 철학을 가진 두 가지 토크나이저를 개발했습니다.</p>
<h4 id="2-1-qwen-tts-tokenizer-25hz-의미-중심의-단일-코드북">2-1. Qwen-TTS-Tokenizer-25Hz: 의미 중심의 단일 코드북</h4>
<p>이 토크나이저는 기존의 <strong>Qwen2-Audio</strong> 모델을 기반으로 만들어졌으며, 초당 25개의 토큰을 생성하는 <strong>단일 코드북(single-codebook)</strong> 방식입니다. 코드북 크기는 32,768입니다. 학습은 두 단계로 진행됩니다.</p>
<p><strong>Stage 1 (ASR 지도학습)</strong>: Qwen2-Audio를 자동 음성 인식(ASR) 과제에 대해 추가 사전학습합니다. 이때 오디오 인코더 중간에 리샘플링(resampling) 레이어와 벡터 양자화(VQ) 레이어를 삽입합니다. 이 과정을 통해 음성에서 &quot;무슨 말을 하는지&quot;라는 의미 정보가 토큰에 잘 담기게 됩니다.</p>
<p><strong>Stage 2 (음향 정보 주입)</strong>: 전체 모델을 파인 튜닝하면서 컨볼루션 기반 <strong>멜-스펙트로그램(mel-spectrogram) 디코더</strong>를 추가합니다. 이 디코더는 오디오 토큰으로부터 멜-스펙트로그램을 복원하도록 학습되며, 이를 통해 토큰에 음향적(acoustic) 정보도 함께 주입됩니다. 의미적 충실도(semantic fidelity)와 음향적 풍부함(acoustic richness) 사이의 의도적인 트레이드오프를 반영한 설계입니다.</p>
<blockquote>
<p><strong>코드북(Codebook)과 벡터 양자화(VQ)란?</strong> 코드북은 일종의 &quot;음성 사전&quot;입니다. 연속적인 음성 신호의 한 프레임(짧은 시간 조각)을 가장 가까운 &quot;대표 벡터&quot;로 매핑하는 과정을 벡터 양자화(VQ)라고 하며, 이 대표 벡터들의 모음이 코드북입니다. 단일 코드북은 하나의 사전만 쓰고, 다중 코드북(RVQ)은 첫 번째 사전에서 대략적으로 표현한 뒤 남은 오차를 두 번째, 세 번째 사전으로 점진 보정하는 방식입니다.</p>
</blockquote>
<blockquote>
<p><strong>멜-스펙트로그램이란?</strong> 음성 신호를 시간-주파수 영역에서 표현한 2D 이미지 같은 것입니다. 가로축은 시간, 세로축은 주파수(인간 청각 특성을 반영한 멜 스케일), 각 점의 밝기는 해당 시간-주파수의 에너지 크기를 나타냅니다.</p>
</blockquote>
<p><strong>스트리밍 디토크나이저: 블록 단위 DiT + BigVGAN</strong></p>
<p>생성된 코드 시퀀스를 실제 음성 파형으로 바꾸기 위해, <strong>DiT(Diffusion Transformer)</strong>와 <strong>Flow Matching</strong>을 결합한 방식을 사용합니다.</p>
<p>스트리밍을 지원하기 위해, 인접한 코드들을 고정 길이의 <strong>블록</strong>으로 묶고 슬라이딩 윈도우 블록 어텐션(sliding-window block attention)을 적용합니다. DiT의 수용 범위(receptive field)는 총 4블록으로 제한됩니다: 현재 블록 + 3블록 과거(lookback) + 1블록 미래(lookahead). 이렇게 해야 무한히 긴 시퀀스에서도 메모리가 폭발하지 않으면서 충분한 맥락을 유지할 수 있습니다. DiT가 생성한 멜-스펙트로그램은 수정된 <strong>BigVGAN</strong> 보코더를 통해 최종 음성 파형으로 변환되며, BigVGAN에도 동일한 청크 방식 처리를 적용하여 스트리밍 파형 합성을 지원합니다.</p>
<blockquote>
<p><strong>Flow Matching이란?</strong> 확산 모델(Diffusion Model)의 변형으로, 노이즈에서 데이터로의 변환 경로를 직선에 가깝게 학습시켜 더 효율적인 생성을 가능하게 하는 기법입니다.</p>
</blockquote>
<p><strong>구체적인 스트리밍 동작 방식</strong>: 청크 크기 8 설정 기준으로, LM이 16개 토큰을 생성해야 DiT가 첫 8-토큰 멜 청크를 만들 수 있습니다(1블록 lookahead 때문). 25Hz 토큰 속도에서 토큰 1개 = 40ms이므로, 한 패킷 = 320ms의 멜 콘텐츠입니다. BigVGAN 보코더는 추가로 130ms의 우측 컨텍스트를 필요로 합니다. 따라서 첫 패킷에는 약 <strong>190ms 분량의 오디오</strong>가 포함되며, 정상 상태 스트리밍에서는 LM이 8개 토큰을 생성할 때마다 320ms 분량의 오디오 패킷이 합성됩니다.</p>
<h4 id="2-2-qwen-tts-tokenizer-12hz-초저지연을-위한-다중-코드북">2-2. Qwen-TTS-Tokenizer-12Hz: 초저지연을 위한 다중 코드북</h4>
<p>이 토크나이저는 Mimi 아키텍처의 <strong>의미-음향 분리 양자화(semantic-acoustic disentangled quantization)</strong> 전략에서 영감을 받았습니다. 초당 12.5개의 토큰을 생성하며, 코드북 크기 2,048, 총 16개 레이어로 구성됩니다. 음성을 두 개의 이산 코드 시퀀스로 분해합니다:</p>
<ol>
<li><strong>의미 코드북(Semantic Codebook)</strong>: 고수준 의미 내용을 포착. <strong>WavLM</strong>이 교사(teacher) 역할을 하여 첫 번째 의미 코드북 레이어가 의미적으로 정렬된 특징을 학습하도록 안내합니다.</li>
<li><strong>음향 코드북(Acoustic Codebook)</strong>: 음향 세부 사항, 운율(prosody) 등을 모델링. <strong>15개 레이어의 잔여 벡터 양자화(RVQ)</strong> 모듈로 구성되어, 의미 코드북이 포착하지 못한 디테일을 점진적으로 보정합니다.</li>
</ol>
<p>학습은 <strong>GAN(Generative Adversarial Network) 기반 프레임워크</strong>를 사용합니다. 생성기(generator)는 원시 파형에서 직접 특징을 추출하고 양자화하며, 판별기(discriminator)는 복원된 음성의 자연스러움과 충실도를 개선합니다. 추가로 <strong>다중 스케일 멜-스펙트로그램 재구성 손실</strong>(multi-scale mel-spectrogram reconstruction loss)을 사용하여 시간-주파수 일관성을 확보합니다.</p>
<p><strong>스트리밍 지원의 핵심 — 완전 인과적(Causal) 설계</strong>: 인코더와 디코더 모두 <strong>미래 프레임을 전혀 참조하지 않고</strong> 현재까지의 입력만으로 토큰을 생성하고 음성을 복원합니다. 이것이 25Hz 토크나이저(1블록 lookahead 필요)와의 결정적 차이점입니다.</p>
<blockquote>
<p><strong>인과적(Causal)이란?</strong> 시간 순서상 미래 정보를 사용하지 않는 설계입니다. 현재 시점 t에서의 출력은 시점 1, 2, ..., t까지의 입력에만 의존합니다. 미래 정보 없이 즉시 처리할 수 있어 스트리밍에 필수적입니다.</p>
</blockquote>
<p><strong>12Hz의 스트리밍 동작</strong>: 순수 좌측 컨텍스트(left-context only) 코덱 디코더를 사용하므로, 필요한 토큰이 생성되자마자 즉시 파형을 방출할 수 있습니다. 12.5Hz에서 토큰 1개 = 80ms 분량의 오디오. 스케줄링 오버헤드를 줄이기 위해 <strong>4개 토큰 = 1 음성 패킷(320ms)</strong>으로 정의합니다. 이 경량 설계 덕분에 높은 동시 접속(concurrency) 환경에서도 낮은 RTF를 유지합니다.</p>
<hr>
<h3 id="3-qwen3-tts-전체-아키텍처">3. Qwen3-TTS 전체 아키텍처</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/f81430f2-0992-49b5-b05d-3d3262c193f4/image.png" alt=""></p>
<h4 id="3-1-이중-트랙dual-track-설계">3-1. 이중 트랙(Dual-Track) 설계</h4>
<p>Qwen3-TTS는 <strong>Qwen3 LM 패밀리</strong>를 백본으로 활용합니다. 전체 구조는 다음과 같습니다:</p>
<ol>
<li><strong>입력 처리</strong>: 텍스트는 표준 Qwen 토크나이저로, 음성은 Qwen-TTS-Tokenizer로 인코딩됩니다.</li>
<li><strong>화자 정체성 제어</strong>: 학습 가능한 화자 인코더(speaker encoder)를 백본과 함께 <strong>공동 학습(jointly train)</strong>하여 정밀한 화자 정체성 제어를 가능하게 합니다.</li>
<li><strong>이중 트랙 표현</strong>: 실시간 합성을 위해, 텍스트 토큰과 음향 토큰을 <strong>채널 축(channel axis)</strong>을 따라 연결(concatenate)합니다. 텍스트 토큰을 받으면 모델은 즉시 대응하는 음향 토큰을 예측하고, 이를 <strong>Code2Wav 모듈</strong>이 파형으로 변환합니다.</li>
</ol>
<p>이것은 &quot;텍스트를 먼저 다 읽고, 그 다음 음성을 생성한다&quot;는 순차적 방식이 아니라, <strong>텍스트가 들어올 때마다 즉시 음성이 나가는</strong> 진정한 스트리밍 구조입니다.</p>
<h4 id="3-2-25hz-변형의-예측-방식">3-2. 25Hz 변형의 예측 방식</h4>
<p>25Hz 변형은 단일 수준(single-level) 음성 토큰을 사용합니다. 백본이 텍스트 특징과 이전 음성 토큰을 통합한 후, <strong>선형 헤드(linear head)</strong>를 통해 현재 음성 토큰을 예측합니다. 생성된 시퀀스는 청크 단위 DiT 모듈에 의해 고충실도 파형으로 복원됩니다.</p>
<h4 id="3-3-12hz-변형의-예측-방식--mtp-모듈">3-3. 12Hz 변형의 예측 방식 — MTP 모듈</h4>
<p>12Hz 변형은 RVQ 토큰(16개 코드북 레이어)을 다루기 때문에 더 복잡한 예측 구조가 필요합니다. <strong>계층적 예측 체계(hierarchical prediction scheme)</strong>를 채택합니다:</p>
<ol>
<li><strong>백본</strong>: 집계된 코드북 특징을 입력받아 <strong>0번째 코드북</strong>(의미 코드북)을 예측합니다.</li>
<li><strong>MTP(Multi-Token Prediction) 모듈</strong>: 나머지 모든 <strong>잔여 코드북(1~15번)</strong>을 한 번에 생성합니다.</li>
</ol>
<p>이 전략은 복잡한 음향 세부 사항을 포착하면서도, <strong>단일 프레임 즉시 생성(single-frame instant generation)</strong>을 가능하게 하여 지연을 최소화합니다. MTP는 원래 LLM에서 다음 토큰 여러 개를 동시에 예측하는 기법으로 제안되었는데, 여기서는 다중 코드북의 여러 레이어를 동시에 예측하는 데 활용됩니다. 이를 통해 음성 일관성(vocal consistency)과 표현력(expressivity)을 크게 향상시킵니다.</p>
<hr>
<h3 id="4-학습-전략-3단계-사전학습--3단계-후학습">4. 학습 전략: 3단계 사전학습 + 3단계 후학습</h3>
<p>모든 데이터는 <strong>ChatML 형식</strong>으로 포맷팅되어 입력 표준화와 제어 가능한 음성 생성을 지원합니다.</p>
<h4 id="4-1-사전학습-pre-training">4-1. 사전학습 (Pre-training)</h4>
<p><strong>S1 — 일반 단계(General Stage)</strong>: 500만 시간 이상의 다국어 음성 데이터로 학습합니다. 이 단계에서 다국어 텍스트 표현에서 음성으로의 <strong>단조 매핑(monotonic mapping)</strong>을 확립하고, 모델의 일반적인 능력을 구축합니다.</p>
<blockquote>
<p><strong>단조 매핑이란?</strong> 텍스트의 순서와 음성의 순서가 일관되게 대응되도록 하는 것입니다. &quot;안녕하세요&quot;의 &quot;안&quot; → &quot;녕&quot; → &quot;하&quot; → &quot;세&quot; → &quot;요&quot; 순서가 음성에서도 그대로 유지되도록 학습한다는 의미입니다.</p>
</blockquote>
<p><strong>S2 — 고품질 단계(High-Quality Stage)</strong>: 전용 파이프라인으로 데이터 품질을 계층화하고, 고품질 데이터만으로 연속 사전학습(CPT)을 수행합니다. 이 단계는 S1에서 노이즈 데이터로 인해 발생한 <strong>환각(hallucination)</strong> — 원래 텍스트에 없는 내용을 말하거나, 있는 내용을 빼먹는 현상 — 을 완화하고 생성 음성의 품질을 크게 향상시킵니다.</p>
<p><strong>S3 — 장문맥 단계(Long-Context Stage)</strong>: 최대 토큰 길이를 <strong>8,192 → 32,768</strong>로 확장하고, 학습 데이터에서 긴 음성 샘플의 비율을 높입니다. 이를 통해 모델이 긴 입력이나 복잡한 입력을 처리하고, 맥락에 적절한 음성을 생성하는 능력이 향상됩니다.</p>
<h4 id="4-2-후학습-post-training">4-2. 후학습 (Post-training)</h4>
<p>사전학습이 끝난 모델을 더 인간적이고 안정적으로 만들기 위한 3단계 후학습이 진행됩니다.</p>
<p><strong>1단계 — DPO(Direct Preference Optimization)</strong>: 인간 피드백을 기반으로 다국어 음성 샘플의 <strong>선호도 쌍(preference pair)</strong>을 구성합니다. &quot;이 두 음성 중 어느 것이 더 자연스러운가?&quot;라는 인간의 판단을 모델에 반영하는 것입니다. DPO는 기존 RLHF와 달리 별도의 보상 모델 없이 직접 정책을 최적화할 수 있어 더 안정적입니다.</p>
<p><strong>2단계 — 규칙 기반 보상 + GSPO</strong>: 규칙 기반 보상(rule-based rewards)을 사용하고 GSPO 알고리즘을 통해 모델의 능력과 안정성을 과제 전반에 걸쳐 종합적으로 향상시킵니다.</p>
<p><strong>3단계 — 경량 화자 파인 튜닝</strong>: 베이스 모델 위에 경량(lightweight) 화자 파인 튜닝을 수행하여, 특정 목소리를 채택하면서도 자연스러움, 표현력, 제어 가능성을 더욱 개선합니다.</p>
<hr>
<h3 id="5-주요-기능-features">5. 주요 기능 (Features)</h3>
<h4 id="5-1-음성-클로닝-voice-cloning">5-1. 음성 클로닝 (Voice Cloning)</h4>
<p>Qwen3-TTS는 두 가지 방식으로 목표 음성을 클로닝합니다:</p>
<ul>
<li><strong>화자 임베딩 기반</strong>: 참조 음성에서 화자 임베딩(speaker embedding)을 추출하여 <strong>실시간 클로닝</strong>을 수행합니다. 빠르지만 운율(prosody) 보존에는 한계가 있을 수 있습니다.</li>
<li><strong>인컨텍스트 러닝(In-Context Learning) 기반</strong>: 텍스트-음성 쌍을 제공하여 문맥 학습 방식으로 클로닝합니다. <strong>운율을 더 잘 보존</strong>하지만 추가 컨텍스트가 필요합니다.</li>
</ul>
<h4 id="5-2-음성-설계-voice-design">5-2. 음성 설계 (Voice Design)</h4>
<p>Qwen3 텍스트 모델 기반으로 구축되었기 때문에, 강력한 텍스트 이해 능력을 상속받습니다. &quot;따뜻하고 신뢰감 있는 중저음의 남성 목소리&quot;와 같은 자연어 설명을 제공하면, 모델이 해당 설명에 맞는 <strong>완전히 새로운 목소리를 생성</strong>할 수 있습니다. 복잡한 설명에 대한 지시 따르기 능력을 향상시키기 위해, 학습 중에 <strong>확률적으로 활성화되는 사고 패턴(probabilistically activated thinking pattern)</strong>을 도입했습니다.</p>
<h4 id="5-3-세밀한-제어-fine-grained-control">5-3. 세밀한 제어 (Fine-grained Control)</h4>
<p>음성 설계 능력을 기반으로, 사전 정의된 목소리에 원하는 스타일을 적용하는 것도 가능합니다. 예를 들어, 특정 화자의 목소리를 유지하면서 &quot;뉴스 앵커 톤으로 전달해 주세요&quot;와 같은 스타일 변경 지시를 따를 수 있습니다.</p>
<hr>
<h3 id="6-효율성-지연-시간과-스트리밍-성능">6. 효율성: 지연 시간과 스트리밍 성능</h3>
<blockquote>
<p><strong>First-Packet Latency</strong>: 입력을 받은 후 첫 번째 오디오 조각이 나올 때까지의 시간. 작을수록 사용자가 &quot;바로 대답한다&quot;고 느낍니다.
<strong>RTF(Real-Time Factor)</strong>: 1초 분량의 오디오를 생성하는 데 걸리는 실제 시간의 비율. RTF &lt; 1이면 실시간보다 빠르게 생성 가능합니다.</p>
</blockquote>
<p>모든 수치는 vLLM 엔진(V0 백엔드)에서 torch.compile + CUDA Graph 가속을 적용하여 단일 컴퓨팅 자원에서 측정한 엔드투엔드 지연입니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/5fc0469f-0722-41a5-80af-da4805817a41/image.png" alt=""></p>
<p><strong>핵심 관찰</strong>:</p>
<ul>
<li>12Hz 변형이 첫 패킷 지연에서 압도적으로 빠른 이유: 인과적 디코더 덕분에 미래 토큰을 기다릴 필요가 없기 때문입니다.</li>
<li>12Hz 토크나이저의 디코드 시간이 <strong>4~5ms로 일정</strong>한 반면, 25Hz는 25~147ms(동시접속에 따라 변동)입니다. 경량 인과적 ConvNet이 DiT + BigVGAN 파이프라인보다 훨씬 가볍고 <strong>배치 처리에 친화적(batch-friendly)</strong>입니다.</li>
<li>동시접속 6에서도 12Hz 토크나이저 디코드 시간은 거의 변하지 않습니다.</li>
</ul>
<hr>
<h2 id="✔️-dataset--evaluation">✔️ Dataset &amp; Evaluation</h2>
<h3 id="학습-데이터">학습 데이터</h3>
<ul>
<li><strong>규모</strong>: 500만 시간 이상의 음성 데이터</li>
<li><strong>언어</strong>: 10개 언어 (중국어, 영어, 독일어, 이탈리아어, 포르투갈어, 스페인어, 일본어, 한국어, 프랑스어, 러시아어)</li>
<li><strong>품질 관리</strong>: S2 고품질 단계에서 전용 파이프라인으로 데이터 품질 계층화 후 고품질 데이터만 사용</li>
</ul>
<h3 id="평가-벤치마크-및-지표">평가 벤치마크 및 지표</h3>
<p><strong>토크나이저 평가</strong>:</p>
<ul>
<li><strong>25Hz</strong>: CommonVoice(C.V.)와 Fleurs 벤치마크의 영어·중국어 서브셋에서 ASR WER 측정. S3 Tokenizer 시리즈와 비교.</li>
<li><strong>12Hz</strong>: LibriSpeech test-clean(2,620 발화)에서 음성 재구성 품질 측정. PESQ(WB/NB), STOI, UTMOS, SIM(WavLM 기반 화자 유사도).</li>
</ul>
<p><strong>음성 생성 평가 — 6가지 시나리오</strong>:</p>
<table>
<thead>
<tr>
<th>시나리오</th>
<th>벤치마크</th>
<th>주요 지표</th>
<th>비교 대상</th>
</tr>
</thead>
<tbody><tr>
<td>제로샷 음성 생성</td>
<td>Seed-TTS test set</td>
<td>WER↓</td>
<td>Seed-TTS, CosyVoice 3, MiniMax 등</td>
</tr>
<tr>
<td>다국어 음성 생성</td>
<td>TTS multilingual test set</td>
<td>WER↓, SIM↑</td>
<td>MiniMax-Speech, ElevenLabs</td>
</tr>
<tr>
<td>교차 언어 음성 생성</td>
<td>CV3-Eval</td>
<td>WER/CER↓</td>
<td>CosyVoice 시리즈</td>
</tr>
<tr>
<td>제어 가능한 음성 생성</td>
<td>InstructTTSEval</td>
<td>APS↑, DSD↑, RP↑</td>
<td>GPT-4o-mini-tts, Gemini, Hume 등</td>
</tr>
<tr>
<td>대상 화자 다국어 생성</td>
<td>TTS multilingual test set</td>
<td>WER↓</td>
<td>GPT-4o-Audio-Preview</td>
</tr>
<tr>
<td>장문 음성 생성</td>
<td>내부 데이터셋 (100개 × 2언어)</td>
<td>WER↓</td>
<td>Higgs-Audio-v2, VibeVoice, VoxCPM</td>
</tr>
</tbody></table>
<p><strong>지표 설명</strong>:</p>
<ul>
<li><strong>WER(Word Error Rate)</strong>: 합성 음성을 ASR로 텍스트 변환 후 원본과 비교한 오류율. 낮을수록 좋음.</li>
<li><strong>CER(Character Error Rate)</strong>: 문자 단위 오류율. 중국어 등 비알파벳 언어에 사용.</li>
<li><strong>SIM(Speaker Similarity)</strong>: 화자 유사도. WavLM 기반 코사인 유사도. 높을수록 좋음.</li>
<li><strong>PESQ</strong>: 음성 품질의 객관적 측정 (WB=광대역, NB=협대역).</li>
<li><strong>STOI</strong>: 음성 명료도 (0~1, 높을수록 좋음).</li>
<li><strong>UTMOS</strong>: MOS(평균 의견 점수) 자동 추정. 인간이 느끼는 자연스러움을 예측.</li>
<li><strong>APS(Attribute Perception and Synthesis accuracy)</strong>: 속성 인식·합성 정확도.</li>
<li><strong>DSD(Description-Speech Consistency)</strong>: 설명과 음성 간 일관성.</li>
<li><strong>RP(Response Precision)</strong>: 응답 정밀도.</li>
</ul>
<hr>
<h2 id="✔️-results">✔️ Results</h2>
<h3 id="1-토크나이저-평가-결과">1. 토크나이저 평가 결과</h3>
<h4 id="25hz-토크나이저--asr-성능">25Hz 토크나이저 — ASR 성능</h4>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/37437b53-c766-47dd-aeaf-3c41e1f61aad/image.png" alt=""></p>
<ul>
<li>S1 단계의 25Hz 토크나이저가 대부분의 데이터셋에서 S3 Tokenizer와 동등하거나 더 낮은 WER 달성</li>
<li>S2 단계에서 ASR 성능이 약간 하락 → <strong>의도된 트레이드오프</strong>: 음향 정보가 추가되면서 순수 의미적 변별력이 감소하지만, 하류 TTS 과제에는 이로움</li>
</ul>
<h4 id="12hz-토크나이저--음성-재구성-librispeech-test-clean">12Hz 토크나이저 — 음성 재구성 (LibriSpeech test-clean)</h4>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/7fb9b197-33c5-49cc-9185-465ad1ae9ddf/image.png" alt=""></p>
<ul>
<li><strong>모든 지표에서 SOTA 달성</strong>, 특히 SIM(화자 유사도) 0.87 → <strong>0.95</strong>로의 대폭 도약</li>
<li>12.5Hz라는 낮은 프레임 레이트에서 이 성능 → <strong>품질과 효율성 양쪽 모두에서의 돌파구</strong></li>
</ul>
<hr>
<h3 id="2-제로샷-음성-생성-seed-tts-test-set">2. 제로샷 음성 생성 (Seed-TTS test set)</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/cb634dea-a86c-4781-997a-529eb47e4d6d/image.png" alt=""></p>
<p><strong>핵심 발견 3가지</strong>:</p>
<ol>
<li>다양한 음향 데이터로의 사전학습과 CPT 덕분에 <strong>다국어에서 고르게 강건한 성능</strong></li>
<li><strong>12Hz 변형이 25Hz보다 일관되게 더 낮은 WER</strong> → 더 거친 시간 해상도가 장기 의존성 모델링에 유리</li>
<li><strong>0.6B → 1.7B 스케일링이 일관된 성능 향상</strong> 제공</li>
</ol>
<hr>
<h3 id="3-다국어-음성-생성-tts-multilingual-test-set">3. 다국어 음성 생성 (TTS multilingual test set)</h3>
<p><strong>콘텐츠 일관성 (WER↓) — 주요 결과 발췌</strong>:</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/8f2aa700-d6e8-4306-812a-f82b3f059752/image.png" alt=""></p>
<ul>
<li>10개 언어 중 <strong>6개에서 최저 WER</strong>, 나머지 4개에서도 SOTA 수준 경쟁력</li>
<li>특히 ElevenLabs의 중국어 WER 16.026 대비 Qwen3-TTS의 0.928은 압도적 차이</li>
</ul>
<p><strong>화자 유사도 (SIM↑)</strong>: <strong>모든 10개 언어에서 최고 화자 유사도 달성</strong>. MiniMax-Speech와 ElevenLabs를 전 언어에서 일관 능가.</p>
<hr>
<h3 id="4-교차-언어-음성-생성-cv3-eval">4. 교차 언어 음성 생성 (CV3-Eval)</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/00b684d3-98c1-4bd6-8451-c2ee501ddd1e/image.png" alt=""></p>
<ul>
<li><strong>zh→ko에서 에러율 66% 감소</strong> (4.82 vs 14.4) — 가장 눈에 띄는 교차 언어 일반화 성과</li>
<li>CosyVoice2는 여러 쌍에서 불안정(ja→zh 48.1)한 반면, Qwen3-TTS는 <strong>모든 방향에서 일관되게 낮은 에러율</strong> 유지</li>
</ul>
<hr>
<h3 id="5-제어-가능한-음성-생성-instructttseval">5. 제어 가능한 음성 생성 (InstructTTSEval)</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/65505a69-5152-49d2-afb6-9d4fc6ef2e65/image.png" alt=""></p>
<h4 id="음성-설계voice-designcreation">음성 설계(Voice Design/Creation)</h4>
<ul>
<li>오픈소스 모델 중 <strong>SOTA</strong>, 상용 시스템 Hume보다 DSD·RP에서 우수</li>
</ul>
<h4 id="대상-화자-편집target-speaker-editing">대상 화자 편집(Target Speaker Editing)</h4>
<ul>
<li>Qwen3-TTS가 <strong>GPT-4o-mini-tts를 모든 지표에서 크게 능가</strong> (중국어 APS +28%p)</li>
<li>Gemini가 상한선이지만, Qwen3-TTS도 경쟁력 있는 성능 시현</li>
</ul>
<hr>
<h3 id="6-대상-화자-다국어-생성-tts-multilingual-test-set">6. 대상 화자 다국어 생성 (TTS multilingual test set)</h3>
<p>Aiden Voice에 파인 튜닝한 Qwen3-TTS vs GPT-4o-Audio-Preview(Ballad Voice):</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/e29581d9-3a7e-49fb-a11e-8b6d808127d9/image.png" alt=""></p>
<ul>
<li><strong>단일 언어(monolingual) 파인 튜닝 데이터로만 학습했음에도</strong> 10개 언어 중 7개에서 GPT-4o 능가</li>
<li>도전적 언어에서 특히 큰 차이: 한국어(1.74 vs 2.76), 중국어(0.90 vs 3.52)</li>
</ul>
<hr>
<h3 id="7-장문-음성-생성-내부-데이터셋-2002000-단어-10분-이상">7. 장문 음성 생성 (내부 데이터셋, 200~2000 단어, 10분 이상)</h3>
<p><img src="blob:https://velog.io/fad822fb-395b-4ce5-aca5-ef2056f3eb50" alt="업로드중.."></p>
<ul>
<li><strong>25Hz 변형이 양쪽 언어 모두에서 최저 WER</strong> 달성</li>
<li>VibeVoice는 중국어에서 WER 22.6으로 심각한 성능 저하, Higgs-Audio-v2는 청크 경계 아티팩트 문제</li>
<li>Qwen3-TTS는 전체 길이에 걸쳐 <strong>끊김 없는 일관된 운율</strong> 생성</li>
</ul>
<p><strong>흥미로운 발견</strong>: 장문에서는 <strong>25Hz &gt; 12Hz</strong>. 의미 토큰이 장기 시퀀스 안정성 유지에 유리할 수 있음 → 두 토크나이저가 서로 다른 강점을 가진다는 증거.</p>
<hr>
<h3 id="종합-시사점">종합 시사점</h3>
<p><strong>두 토크나이저의 상보적 관계</strong>: 이 논문의 핵심 설계 결정 중 하나는 단일 토크나이저를 고르는 대신 두 개를 모두 개발하고 공개한 것입니다.</p>
<ul>
<li><strong>12Hz</strong>: 제로샷 클로닝, 다국어 생성, 교차 언어 전이에서 우수. 초저지연(97ms) 스트리밍에 최적. 화자 유사도 최고.</li>
<li><strong>25Hz</strong>: 장문 생성에서 더 안정적. Qwen-Audio 에코시스템 통합에 유리. 음성 편집(VoiceEditing) 기능 지원.</li>
</ul>
<p><strong>스케일의 힘</strong>: 500만 시간의 학습 데이터가 다국어 성능, 교차 언어 일반화, 제로샷 클로닝의 기반. 단일 언어 파인 튜닝만으로도 10개 언어로 일반화되는 것은 사전학습의 다국어 표현 능력이 충분히 강력하다는 증거입니다.</p>
<p><strong>LLM 기반 TTS의 방향성</strong>: 음성 합성을 언어 모델링 과제로 프레이밍하고, ChatML 형식, 자연어 지시, 확률적 사고 패턴 등을 통해 LLM의 텍스트 이해·생성 능력을 음성 도메인에 전이. TTS와 LLM이 궁극적으로 하나의 통합 모델로 수렴할 것이라는 업계 방향성과 맞닿아 있습니다.</p>
<hr>
<h2 id="✔️-resources">✔️ Resources</h2>
<ul>
<li><a href="https://arxiv.org/abs/2601.15621">🧾 Paper</a></li>
<li><a href="https://github.com/QwenLM/Qwen3-TTS">💻 Official Github Page</a></li>
<li><a href="https://huggingface.co/collections/Qwen/qwen3-tts">🤗 HuggingFace Collection</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] – StreamFlow: Streaming Audio Generation from
Discrete Tokens via Streaming Flow Matching]]></title>
            <link>https://velog.io/@sujin-koo/Paper-Review-StreamFlow-Streaming-Audio-Generation-fromDiscrete-Tokens-via-Streaming-Flow-Matching</link>
            <guid>https://velog.io/@sujin-koo/Paper-Review-StreamFlow-Streaming-Audio-Generation-fromDiscrete-Tokens-via-Streaming-Flow-Matching</guid>
            <pubDate>Tue, 31 Mar 2026 02:15:39 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/sujin-koo/post/5be8b4ef-2e72-449c-a42c-c8f5536967d7/image.png" alt=""></p>
<p>#streaming_decoder(≈vocoder)</p>
<hr>
<h2 id="✔️-배경">✔️ 배경</h2>
<p>최근 많은 기업들이 <strong>실시간 음성 대화 서비스</strong>를 만들겠다는 목표를 내세우고 있습니다. 구글은 말하는 즉시 다른 언어로 통역해주는 <a href="https://www.youtube.com/watch?v=xdPIwgDriTg">실시간 음성 번역</a>을 선보였고, 프랑스 연구팀이 만든 <a href="https://arxiv.org/abs/2410.00037">Moshi</a>는 사람처럼 말을 주고받으며 심지어 상대방 말 중간에 끼어들 수도 있는 양방향(full-duplex) 대화 시스템을 공개했습니다. 음성 AI의 패러다임이 근본적으로 바뀌고 있는 것이죠.</p>
<p>그런데 &quot;실시간 음성 대화&quot;라는 한마디 안에는 사실 여러 기술 방식이 숨어 있습니다. 논문 리뷰에 앞서, 현재 음성 AI가 어떤 구조로 동작하는지 세 가지 방식을 비교하면서 살펴보겠습니다.</p>
<hr>
<h4 id="방식-1-stt-→-llm-→-tts-전통적인-파이프라인">방식 1: STT → LLM → TTS (전통적인 파이프라인)</h4>
<p>가장 이해하기 쉬운 구조입니다. 세 단계를 순서대로 거칩니다.</p>
<ol>
<li><strong>STT (Speech-to-Text):</strong> 사용자의 음성을 텍스트로 변환합니다. &quot;오늘 날씨 어때?&quot;라고 말하면, 이 단계에서 글자로 바꿔줍니다.</li>
<li><strong>LLM (Large Language Model):</strong> 변환된 텍스트를 AI가 읽고, 답변 텍스트를 생성합니다. ChatGPT 같은 대형 언어 모델이 여기에 해당합니다.</li>
<li><strong>TTS (Text-to-Speech):</strong> AI가 만든 답변 텍스트를 다시 사람 목소리로 읽어줍니다.</li>
</ol>
<p>이 방식의 장점은 각 단계가 독립적이라 개발하고 교체하기 쉽다는 것입니다. 하지만 치명적인 단점이 있습니다. <strong>AI가 답변 텍스트를 전부 다 만들 때까지 기다린 후에야 음성 변환이 시작됩니다.</strong> 긴 답변이라면 사용자는 몇 초간 침묵을 견뎌야 하죠. </p>
<hr>
<h4 id="방식-2-stt-→-llm-→-streaming-tts-스트리밍-음성-합성">방식 2: STT → LLM → Streaming TTS (스트리밍 음성 합성)</h4>
<p>위 문제를 해결하기 위해 등장한 방식이 <strong>스트리밍 TTS</strong>입니다.</p>
<p>핵심 아이디어는 간단합니다. LLM이 답변 텍스트를 <strong>한 글자, 한 단어씩 만들어내는 즉시</strong> TTS가 바로바로 음성으로 변환하기 시작하는 것입니다. 전체 문장이 완성될 때까지 기다리지 않습니다.</p>
<p>스트리밍 방식은 사용자 입장에서는 질문하자마자 거의 곧바로 음성 답변이 흘러나오기 시작하므로, 훨씬 자연스러운 대화 경험을 얻을 수 있습니다.</p>
<p>다만 이 방식에도 기술적 어려움이 있습니다. TTS 엔진이 아직 생성되지 않은 뒤쪽 문맥을 모른 채 음성을 만들어야 하기 때문에, 억양이나 발음의 자연스러움이 떨어질 수 있습니다. 문장 전체를 보고 만드는 것과 앞부분만 보고 만드는 것의 품질 차이가 존재하는 것이죠.</p>
<hr>
<h4 id="방식-3-speech-to-speech-음성-직통-방식">방식 3: Speech-to-Speech (음성 직통 방식)</h4>
<p>마지막 방식은 최근 활발히 연구되고 있는 분야 입니다. 중간에 텍스트를 거치지 않고, <strong>음성이 들어오면 곧바로 음성으로 대답하는 모델</strong>입니다.</p>
<p>기존 방식이 &quot;듣기 → 받아적기 → 생각하기 → 글쓰기 → 낭독하기&quot;였다면, Speech-to-Speech는 사람의 뇌처럼 &quot;듣기 → 바로 말하기&quot;에 가깝습니다. 텍스트 변환이라는 중간 단계가 사라지니 속도가 빨라지는 것은 물론이고, 말투, 감정, 억양같은 비언어적 정보까지 더 잘 살릴 수 있습니다.</p>
<p>앞서 언급한 구글의 실시간 번역이나 Moshi의 양방향 대화가 바로 이 방식을 지향합니다. 특히 Moshi는 사람의 대화처럼 상대가 말하는 중에도 반응할 수 있는 <strong>full-duplex</strong> 통신을 구현했는데, 이는 기존의 &quot;한 명이 말하면 다른 쪽은 듣기만 하는&quot; 구조에서 크게 벗어난 것입니다.</p>
<hr>
<h4 id="세-방식-한눈에-비교">세 방식 한눈에 비교</h4>
<table>
<thead>
<tr>
<th>구분</th>
<th>STT → LLM → TTS</th>
<th>STT → LLM → Streaming TTS</th>
<th>Speech-to-Speech</th>
</tr>
</thead>
<tbody><tr>
<td>응답 속도</td>
<td>느림 (전부 생성 후 변환)</td>
<td>빠름 (생성과 동시에 변환)</td>
<td>가장 빠름 (텍스트 단계 없음)</td>
</tr>
<tr>
<td>음성 품질</td>
<td>높음 (전체 문맥 활용)</td>
<td>약간 저하 가능</td>
<td>약간 저하 가능</td>
</tr>
<tr>
<td>감정·억양 전달</td>
<td>제한적</td>
<td>제한적</td>
<td>유리함</td>
</tr>
<tr>
<td>구조 복잡도</td>
<td>단순 (부품 교체 쉬움)</td>
<td>보통</td>
<td>복잡 (통합 모델 필요)</td>
</tr>
<tr>
<td>대표 사례</td>
<td>현재 많은 상용 서비스</td>
<td>현재 많은 상용 서비스</td>
<td>구글 번역, Moshi</td>
</tr>
</tbody></table>
<hr>
<h4 id="그래서-핵심-기술-과제는-무엇인가">그래서 핵심 기술 과제는 무엇인가?</h4>
<p>위의 어떤 방식을 쓰든, 결국 마지막에는 AI 내부의 숫자 데이터(discrete token)를 사람이 들을 수 있는 소리 파형(waveform)으로 변환하는 <strong>디코더</strong>가 필요합니다. 그리고 실시간 대화를 위해서는 이 디코더가 즉각적으로 동작해야 합니다.</p>
<p>여기서 근본적인 딜레마가 발생합니다.</p>
<blockquote>
<p><strong>품질을 높이려면</strong> 전체 데이터를 한꺼번에 봐야 합니다. 문장 전체의 흐름을 파악해야 자연스러운 억양을 만들 수 있으니까요.</p>
<p><strong>속도를 높이려면</strong> 데이터가 들어오는 즉시 음성을 만들어야 합니다.</p>
</blockquote>
<p>현재 대부분의 스트리밍 디코더는 <strong>causal convolution</strong>(이전 정보만 참고하고 미래 정보는 보지 않는 구조)을 사용하는데, 이 방식은 빠르지만 전체를 보고 만드는 방식에 비해 음질이 떨어지는 것이 불가피합니다. </p>
<hr>
<h4 id="flow-matching-그게-뭔가요">Flow Matching, 그게 뭔가요?</h4>
<p>그러면 위에서 말한 디코더에는 어떤 기술이 사용될까요? 최근 음성 합성 분야에서는 <strong>Flow Matching</strong>이라는 기법이 최종 음성을 만들어내는 핵심 기술로 자리 잡고 있습니다. 이 기술을 이해하고, 스트리밍 환경에 맞게 개선할 수 있다면 실시간 음성 서비스가 가능해집니다. 바로 그것을 해결한 것이 오늘 리뷰할 <strong>StreamFlow</strong>입니다.</p>
<p>그러므로 StreamFlow를 이해하려면 먼저 그 기반 기술인 Flow Matching을 알아야 합니다. 핵심 아이디어는 생각보다 단순합니다. 노이즈(잡음)로 가득 찬 상태에서 출발해서, 깨끗한 데이터에 도달하는 &quot;길&quot;을 학습하는 것입니다.</p>
<p>좀 더 풀어서 설명하겠습니다. AI가 음성을 생성할 때, 처음에는 아무 의미 없는 잡음에서 시작합니다. 여기서 &quot;이 잡음을 어느 방향으로, 얼마나 움직이면 진짜 음성에 가까워질까?&quot;를 알려주는 것이 <strong>velocity field(속도장)</strong>입니다. 내비게이션이 &quot;여기서 북쪽으로 가세요&quot;라고 안내하듯, velocity field가 &quot;이 잡음을 이 방향으로 바꾸세요&quot;라고 알려주는 것이라고 생각하면 됩니다. AI는 이 안내를 따라 한 걸음씩 이동하면서(이 과정을 수학적으로는 ODE를 푼다고 합니다), 최종적으로 자연스러운 음성 데이터를 만들어냅니다.</p>
<h4 id="기존-cfm의-한계-왜-스트리밍이-안-되었을까">기존 CFM의 한계: 왜 스트리밍이 안 되었을까?</h4>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/fdbd5c6d-63f5-46e7-8456-83884dfad730/image.png" alt="">
문제는 기존의 Conditional Flow Matching(CFM)이 <strong>전체 시퀀스를 한꺼번에 처리하는 구조</strong>라는 점입니다.</p>
<p>CFM에서는 잡음에서 깨끗한 음성으로 바꾸는 과정을 시간 단계(timestep)로 나눕니다. t=0이 &quot;완전한 잡음&quot;, t=1이 &quot;완성된 음성&quot;이라고 할 때, <strong>문장의 모든 부분이 동시에 처리됩니다</strong>. 즉, 문장의 앞부분이든 뒷부분이든 동시에 t=0에서 출발해서, 동시에 t=1에 도착합니다.</p>
<p>이것이 왜 문제가 되냐면, 스트리밍에서는 앞부분을 먼저 완성해서 내보내야 하기 때문입니다. 하지만 기존 구조에서는 앞부분만 먼저 t=1(완성)에 도달하게 하는 것이 원리적으로 불가능합니다. 마치 단체 마라톤에서 모든 주자가 반드시 동시에 출발하고 동시에 결승선을 통과해야 하는 규칙이 있는 것과 같습니다. 빠른 주자가 먼저 골인하는 것을 허용하지 않는 것이죠. 이는 음성이나 비디오처럼 시간 순서대로 흘러나와야 하는 스트리밍 상황에서는 치명적인 제약이 됩니다.</p>
<p>물론 우회 방법이 아예 없는 것은 아닙니다. 음성을 여러 덩어리(청크)로 잘라서 각각 따로 생성하는 방식을 쓸 수도 있습니다. 하지만 이 경우 덩어리와 덩어리가 이어지는 경계에서 소리가 뚝 끊기거나 부자연스러워지는 문제가 생기고, 청크를 나누고 합치는 과정에서 추가적인 지연도 발생합니다.</p>
<h4 id="streamflow">StreamFlow</h4>
<p>StreamFlow는 바로 이 구조적 제약 자체를 근본적으로 재설계합니다. 모든 부분이 같은 시간표를 따를 필요 없이, 앞부분은 먼저 완성하고 뒷부분은 나중에 완성할 수 있도록 시간 축의 구조를 바꾼 것입니다.
다시 마라톤 비유로 돌아가면, StreamFlow는 &quot;출발 시간을 주자마다 다르게 해도 되고, 먼저 준비된 주자는 먼저 결승선을 통과해도 된다&quot;는 새로운 규칙을 도입한 것입니다. 덕분에 CFM 특유의 높은 음질은 그대로 유지하면서도, 토큰(데이터 조각)이 하나씩 들어올 때마다 바로바로 음성을 생성할 수 있게 됩니다.</p>
<hr>
<p>서론이 길었는데... 본격적으로 논문을 리뷰하도록 하겠습니다.</p>
<hr>
<h2 id="✔️-paper-info">✔️ Paper Info</h2>
<ul>
<li><p>Title: <a href="https://neurips.cc/virtual/2025/loc/san-diego/poster/120212">StreamFlow: Streaming Audio Generation from
Discrete Tokens via Streaming Flow Matching</a></p>
</li>
<li><p>Authors: Ha-Yeong Choi · Sang-Hoon Lee</p>
</li>
<li><p>Affiliation: KT, 아주대</p>
</li>
<li><p>Conference: NeurIPS 2025</p>
</li>
<li><p>Keywords: Streaming flow matching, real-time audio generation, discrete tokens, diffusion transformer, Scale-DiT, neural audio codec, waveform generation, causal noising, EnCodec, Mimi</p>
</li>
</ul>
<hr>
<h2 id="✔️-main-problem-and-key-approach">✔️ Main Problem and Key Approach</h2>
<p>위에서 말했듯이, 기존 Flow Matching 모델은 오디오를 생성할 때 전체 시퀀스를 한꺼번에 처리해야 해서, 실시간 스트리밍이 불가능했습니다. StreamFlow는 이 문제를 해결하기 위해 <strong>Streaming Flow Matching(SFM)</strong>이라는 새로운 프레임워크를 제안합니다.</p>
<p>뒤에서 설명하겠지만 미리 말씀 드리자면, 핵심 아이디어는 시퀀스의 각 위치마다 서로 다른 (noise) timestep을 부여하는 것입니다. 이미 생성된 앞부분은 깨끗한 상태로 두고, 새로 생성할 뒷부분에만 점진적으로 노이즈를 줄여나가는 방식입니다. 덕분에 토큰이 하나씩 들어올 때마다 바로바로 오디오를 생성할 수 있습니다.</p>
<p>여기에 Scale-DiT라는 새로운 Transformer 구조도 함께 제안하는데, 고해상도 파형을 학습할 때 생기는 불안정성을 파라미터 증가 없이 해결합니다. 결과적으로, 실시간 스트리밍 모델임에도 기존 병렬 생성 모델보다 더 좋은 음질을 달성했고, Moshi의 디코더를 대체하는 데도 성공했습니다.</p>
<h4 id="⭐-요약-tldr">⭐ 요약 TL;DR</h4>
<ul>
<li>Causal denoising training framework로 스트리밍 생성 능력 확보</li>
<li>Scale-DiT로 고해상도 파형 학습 안정화</li>
<li>EnCodec과 Mimi 토큰으로 실험, 스트리밍임에도 병렬 모델 능가</li>
<li>Full-duplex model(Moshi)에서 Mimi decoder 대신 활용 가능</li>
</ul>
<hr>
<h2 id="✔️-architecture--mehod">✔️ Architecture &amp; Mehod</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/ec4fd972-0756-448f-8831-78068c533ea5/image.png" alt=""></p>
<h3 id="streaming-flow-matching">Streaming Flow Matching</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/995435df-90d7-43e3-ae79-a2a0319520b2/image.png" alt=""></p>
<p>StreamFlow의 가장 핵심적인 발상은 <strong>시퀀스 내 위치마다 서로 다른 CFM timestep을 할당하는 것</strong>입니다.</p>
<h4 id="data-stream">Data Stream</h4>
<p>SFM은 입력 시퀀스 x를 여러 개의 <strong>data stream</strong>으로 분할합니다. 각 stream은 두 가지 수치로 정의됩니다: streaming window size <strong>Ls</strong>(새로 생성할 프레임 수)와 context prompt ratio <strong>γ</strong>(과거 문맥의 비율)입니다. 전체 길이는 <code>L = Lc + Ls</code>이고, 여기서 <code>Lc = γ · Ls</code>입니다.</p>
<p>실제 설정에서는 Ls=8토큰, γ=3이므로 Lc=24토큰입니다. 즉 모델은 한 번에 24개의 과거 토큰을 참조하면서 8개의 새 토큰을 생성하는 것입니다.</p>
<p>각 data stream은 두 영역으로 나뉩니다.</p>
<p>첫 번째는 <strong>Context Prompt(문맥 프롬프트)</strong>입니다. 이미 생성이 완료된 과거 프레임들로, timestep이 <strong>t=1로 고정</strong>되어 깨끗한 데이터 상태를 유지합니다. 쉽게 말해 &quot;이미 완성된 앞부분&quot;입니다.</p>
<p>두 번째는 <strong>Streaming Window(스트리밍 창)</strong>입니다. 새로 생성할 프레임들로, timestep이 <strong>t=1에서 t=0으로 점진적으로 감소</strong>합니다. 수식으로는 <code>t = 1 − λ, λ ∈ [0, 1]</code>입니다. 과거에 가까운 프레임은 거의 완성된 상태(t≈1)이고, 미래로 갈수록 아직 노이즈가 많은 상태(t≈0)입니다.</p>
<p>이 구조 덕분에 모델은 <strong>한 번의 계산(forward pass)</strong>으로 streaming window 내의 여러 시간 단계에 대한 velocity field를 동시에 추정할 수 있습니다. 기존 CFM이 &quot;전체를 동시에, 같은 속도로&quot; 정제했다면, StreamFlow는 &quot;앞부분은 거의 완성, 뒷부분은 아직 노이즈&quot;라는 비대칭 구조를 학습하는 것입니다.</p>
<p>새로운 토큰이 들어오면, 직전에 생성한 프레임을 context prompt 쪽으로 밀어 넣고 새로운 streaming window를 열면 됩니다. Transformer의 in-context learning 능력 덕분에 과거 context로부터 장기적인 의존성을 자연스럽게 활용할 수 있습니다.</p>
<hr>
<h3 id="causal-noising">Causal Noising</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/411538e6-dddb-4373-9849-56cdf9623fc4/image.png" alt=""></p>
<p>스트리밍 생성에서 가장 주의해야 할 점이 있습니다. <strong>미래 정보가 현재 생성에 영향을 미치면 안 된다</strong>는 것입니다. 아직 도착하지 않은 토큰의 내용을 미리 알고 음성을 만들면, 실제 스트리밍 상황에서는 해당 정보가 없기 때문에 품질이 급격히 떨어지게 됩니다.</p>
<p>StreamFlow는 <strong>causal noising</strong>을 통해 이 문제를 해결합니다.</p>
<h4 id="경로">경로</h4>
<p>각 stream k에서, 초기 상태 x₀⁽ᵏ⁾는 가우시안 노이즈 N(0, I)(완전한 잡음)이고, 목표 데이터 x₁⁽ᵏ⁾은 깨끗한 원본 음성입니다. 이 둘 사이의 보간 경로(interpolation path)는 다음과 같이 정의됩니다:</p>
<p><code>xₜ⁽ᵏ⁾ = (1 − t) · x₀⁽ᵏ⁾ + t · x₁⁽ᵏ⁾</code> ... (Eq.5)</p>
<p>직관적으로 이해하면 이렇습니다. <strong>t=0이면 100% 잡음</strong>, <strong>t=1이면 100% 깨끗한 데이터</strong>, <strong>t=0.5이면 잡음과 데이터가 반반</strong> 섞인 상태입니다. Streaming window 내에서 t가 1에서 0으로 점진적으로 감소하도록 설정하면, 앞쪽 프레임은 거의 깨끗하고 뒤쪽 프레임은 잡음이 많은 상태가 자연스럽게 만들어집니다.</p>
<h4 id="training-objective">Training Objective</h4>
<p>SFM의 학습 목표는 <strong>이상적인 velocity field u⁽ᵏ⁾</strong>를 예측하는 것입니다. 이 velocity field는 보간 경로 xₜ⁽ᵏ⁾의 시간 미분으로, 매우 단순한 형태가 됩니다:</p>
<p><code>uₜ⁽ᵏ⁾ = dx⁽ᵏ⁾/dt = x₁⁽ᵏ⁾ − x₀⁽ᵏ⁾</code> ... (Eq.6)</p>
<p>즉, &quot;깨끗한 데이터에서 잡음을 빼면, 잡음에서 데이터로 가는 방향이 나온다&quot;는 것입니다. 내비게이션 비유로 돌아가면, 출발지(잡음)와 목적지(깨끗한 데이터)를 알면 이동 방향이 자동으로 결정되는 것과 같습니다.</p>
<p>최종 loss function은 모델이 예측한 velocity field v⁽ᵏ⁾와 이상적인 velocity field u⁽ᵏ⁾의 차이를 최소화하는 것입니다:</p>
<p><code>L_SFM(θ) = Σₖ E[ ‖ v⁽ᵏ⁾(x̃ₜ⁽ᵏ⁾; c⁽ᵏ⁻¹⁾; θ) − (x₁⁽ᵏ⁾ − x₀⁽ᵏ⁾) ‖² ]</code> ... (Eq.7)</p>
<p>여기서 x̃ₜ⁽ᵏ⁾는 <strong>causal noising이 적용된 보간 상태</strong>(앞쪽은 깨끗하고 뒤쪽은 노이즈가 많은 비대칭 상태)이고, c⁽ᵏ⁻¹⁾는 <strong>이전 stream에서 생성된 context prompt</strong>입니다. 모델은 이 context를 참조하면서 현재 stream의 velocity field를 예측합니다.</p>
<p>쉽게 말해, &quot;과거에 생성한 음성(context)을 참고하면서, 현재 노이즈 상태에서 깨끗한 음성으로 가는 방향을 맞춰라&quot;는 것이 이 loss의 의미입니다.</p>
<hr>
<h3 id="scale-dit">Scale-DiT</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/7069ef00-d5be-43af-8e8c-566b4221268f/image.png" alt=""></p>
<p>고해상도 음성 파형(24kHz)을 Diffusion Transformer(DiT)로 직접 모델링하면 학습이 불안정해지는 문제가 있습니다. 해상도가 높을수록 모델이 다뤄야 할 정보의 세밀함이 극적으로 증가하기 때문입니다. StreamFlow는 이 문제를 해결하기 위해 <strong>Scale-DiT</strong>라는 새로운 블록 구조를 제안합니다.</p>
<h4 id="전체-흐름을-먼저-봅니다">전체 흐름을 먼저 봅니다</h4>
<p>Scale-DiT 블록 하나는 크게 <strong>MHSA</strong>(Multi-Head Self-Attention) 단계와 <strong>FFN</strong>(Feed-Forward Network) 단계를 거칩니다. 각 단계마다 동일한 패턴이 반복됩니다: &quot;AdaLN으로 정규화 → 연산 수행 → Scale-DiT 방식으로 잔차 연결&quot;. 하나씩 살펴보겠습니다.</p>
<h4 id="mhsa-단계">MHSA 단계</h4>
<p><strong>Step 1 — AdaLN (Adaptive Layer Normalization):</strong></p>
<p>입력 x를 먼저 Layer Normalization(σ)으로 정규화한 뒤, 학습 가능한 스케일(γ₁)과 시프트(β₁) 파라미터를 적용합니다.</p>
<p><code>x̂ = σ(x) · (1 + γ₁) + β₁</code> ... (Eq.8)</p>
<p>여기서 γ₁과 β₁은 timestep t로부터 MLP를 통해 생성되는 조건부 파라미터입니다. 즉, &quot;지금이 노이즈 제거 과정에서 어느 단계인지&quot;에 따라 정규화 방식이 달라집니다.</p>
<p><strong>Step 2 — Attention 연산:</strong></p>
<p>정규화된 x̂를 Multi-Head Self-Attention에 통과시키고, gating factor α₁을 곱합니다.</p>
<p><code>A = α₁ · MHSA(x̂)</code> ... (Eq.9)</p>
<p>α₁도 timestep에서 생성되는 학습 가능한 값으로, attention 출력의 크기를 조절하는 역할을 합니다.</p>
<p><strong>Step 3 — Scale-DiT 잔차 연결 (핵심 차이점):</strong></p>
<p>여기서 기존 DiT와 Scale-DiT가 갈라집니다.</p>
<p>기존 vanilla DiT의 잔차 연결: <code>x ← x + A</code></p>
<p>Scale-DiT의 잔차 연결: <code>x ← x + ρ₁ · σ(A − x)</code> ... (Eq.10)</p>
<p>단순히 A를 더하는 대신, 세 가지 과정을 거칩니다. 첫째, attention 출력 A와 현재 feature x의 <strong>차이(A − x)</strong>를 계산합니다. 둘째, 이 차이를 <strong>LayerNorm(σ)으로 정규화</strong>하여 값이 극단적으로 커지거나 작아지는 것을 방지합니다. 셋째, 학습 가능한 <strong>adaptive scaling rate ρ₁</strong>(10⁻⁴에서 1 사이로 제한)로 업데이트 크기를 조절합니다.</p>
<h4 id="ffn-단계">FFN 단계</h4>
<p>MHSA 단계와 완전히 동일한 패턴이 반복됩니다.</p>
<p><code>x̂ = σ(x) · (1 + γ₂) + β₂</code> ... (Eq.11) — 두 번째 AdaLN</p>
<p><code>F = α₂ · FFN(x̂)</code> ... (Eq.12) — FFN 연산 + gating</p>
<p><code>x ← x + ρ₂ · σ(F − x)</code> ... (Eq.13) — Scale-DiT 잔차 연결 (별도의 ρ₂ 사용)</p>
<h4 id="왜-이렇게-하면-좋은가">왜 이렇게 하면 좋은가?</h4>
<p>한번에 A를 다 넣는 것이 아니라, 그 차이를 일정한 범위로 조절한 뒤, 소량씩 추가하는 방식입니다. 이렇게 하면 값이 급격히 변해서 망치는 일을 방지할 수 있습니다.</p>
<p>이 설계의 효과는 두 가지입니다. 첫째, 차이(A − x 또는 F − x)를 LayerNorm으로 정규화함으로써 gradient가 극단적으로 커지는 것을 방지합니다. 둘째, ρ₁과 ρ₂가 학습 초기에 매우 작은 값(10⁻⁴ 근처)에서 시작하므로, residual 업데이트가 점진적으로 이루어져 최적화가 안정적입니다. 추가 파라미터는 ρ₁과 ρ₂ 단 두 개뿐이므로 모델 크기는 사실상 동일합니다.</p>
<hr>
<h3 id="linear-reshape-transformation">Linear-Reshape Transformation</h3>
<p>이 부분을 이해하려면 먼저 왜 음성 데이터를 쪼개서 사용하는 지부터 알아야 합니다.</p>
<p>24kHz 음성은 <strong>1초에 24,000개의 숫자</strong>로 이루어져 있습니다. 이 긴 1차원 숫자열을 그대로 모델에 넣으면 처리가 너무 무겁기 때문에, 적절한 단위로 묶어서 다루기 쉬운 형태로 바꿔주는 과정이 필요합니다. 이 변환 방식에 따라 스트리밍 가능 여부가 결정됩니다.</p>
<h4 id="기존-방식-stft-short-time-fourier-transform">기존 방식: STFT (Short-Time Fourier Transform)</h4>
<p>기존 모델들은 STFT를 사용합니다. STFT는 음성 신호를 짧은 구간(window)으로 잘라서 각 구간의 주파수 성분을 분석하는 방식입니다.</p>
<p>문제는 이 &quot;분석 창(window)&quot;의 크기가 &quot;이동 간격(hop size)&quot;보다 크다는 점입니다. 구체적인 숫자로 설명하겠습니다. StreamFlow에서 hop size는 160이고, STFT의 window size는 640입니다. 즉, 160칸씩 이동하면서 640칸짜리 창으로 분석하는 것입니다.</p>
<p>이것이 왜 스트리밍에서 문제가 되냐면, 현재 위치에서 분석하려면 <strong>앞으로 480개(640-160)의 데이터가 더 필요</strong>하기 때문입니다. 아직 도착하지 않은 미래 데이터를 봐야 한다는 뜻이죠. 또한 CFM처럼 여러 번 반복(multi-step sampling)하는 모델에서는 매 step마다 STFT를 다시 계산해야 해서 연산 비용도 커집니다.</p>
<h4 id="streamflow의-방식-linear-reshape">StreamFlow의 방식: Linear-Reshape</h4>
<p>StreamFlow는 이 대신 훨씬 단순한 <strong>linear-reshape 변환</strong>을 채택합니다. 과정은 두 단계입니다.</p>
<p><strong>1단계 — Reshape:</strong> 1차원 음성 파형을 hop size(h=160) 기준으로 잘라서 2차원 표 형태로 재배열합니다. 예를 들어, 길이 1,600의 음성 신호가 있다면 이것을 160개씩 10묶음으로 잘라 10행 × 160열의 2차원 텐서로 만드는 것입니다.</p>
<pre><code>원본 (1차원):  [s₁, s₂, s₃, ... s₁₅₉, s₁₆₀, s₁₆₁, ... s₃₂₀, s₃₂₁, ...]

Reshape (2차원):
  행1: [s₁,   s₂,   ... s₁₆₀]     ← 토큰 1에 대응
  행2: [s₁₆₁, s₁₆₂, ... s₃₂₀]     ← 토큰 2에 대응
  행3: [s₃₂₁, s₃₂₂, ... s₄₈₀]     ← 토큰 3에 대응
  ...</code></pre><p><strong>2단계 — Linear Projection:</strong> 각 행(160차원)을 linear layer를 통해 모델이 사용하는 feature 차원(예: 1024차원)으로 변환합니다.</p>
<p>핵심은 <strong>각 행이 정확히 자기 자신의 160개 샘플만 참조한다</strong>는 점입니다. 앞 행도, 뒷 행도 볼 필요가 없습니다. 따라서 미래 프레임을 전혀 참조하지 않고, 매 sampling step마다 STFT를 재계산할 필요도 없어서 스트리밍 추론에서 훨씬 효율적입니다.</p>
<p>다만 병렬 생성(한꺼번에 전체를 만드는 경우)에서는 STFT/iSTFT가 더 좋은 성능을 보이므로, 논문에서는 병렬 모델에는 STFT, 스트리밍 모델에는 linear-reshape를 사용합니다.</p>
<hr>
<h3 id="2단계-학습">2단계 학습</h3>
<p>StreamFlow는 한 번에 모든 것을 학습하지 않고 <strong>2단계</strong>로 나눠서 학습합니다.</p>
<h4 id="1단계--sfm-사전학습">1단계 — SFM 사전학습</h4>
<p>앞에서 설명한 Streaming Flow Matching 목적함수로 모델을 학습합니다. 이 단계에서 스트리밍 생성의 기본 능력이 형성됩니다. 이 사전학습이 왜 중요하냐면, 이 단계 없이 바로 2단계(적대적 학습)를 시도하면 ODE sampling 초기 단계에서 discriminator collapse(판별기 붕괴)가 발생하여 학습 자체가 실패하기 때문입니다.</p>
<h4 id="2단계--adversarial-fine-tuning적대적-미세조정">2단계 — Adversarial Fine-tuning(적대적 미세조정)</h4>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/40deb712-dc9a-4e7a-a505-b04f2441c5e8/image.png" alt=""></p>
<p>사전학습된 모델을 MPD, MS-STFTD, MS-SB-CQTD 등 다양한 discriminator(판별기)로 미세조정합니다. 판별기란 &quot;이 음성이 진짜인지 가짜인지&quot;를 판단하는 모델로, 생성 모델이 판별기를 속일 수 있을 만큼 좋은 음성을 만들도록 경쟁시키는 방식입니다.</p>
<p>이 2단계 미세조정을 겨우 0.25M steps만 수행해도 PESQ(음성 품질 점수)와 UTMOS(자연스러움 점수)가 꽤 향상됩니다.</p>
<ul>
<li><p>Discriminator collapse란: GAN 학습에서 생성 모델이 초기에 너무 형편없는 출력을 내놓으면, 판별 모델이 너무 쉽게 진짜/가짜를 구분해버려서 생성 모델에게 유용한 피드백(gradient)을 줄 수 없게 되는 현상입니다. 결과적으로 생성 모델의 학습이 멈추거나 극소수 패턴만 반복 생성하게 됩니다.</p>
</li>
<li><p>StreamFlow에서의 해법: SFM 사전학습으로 생성 모델이 먼저 괜찮은 수준의 음성을 만들 수 있게 한 뒤 적대적 학습을 시작하므로, 판별 모델이 유의미한 피드백을 줄 수 있는 균형 상태에서 학습이 진행됩니다.</p>
</li>
</ul>
<hr>
<h3 id="추론">추론</h3>
<p>학습이 끝난 후, 실제로 음성을 실시간 생성할 때의 동작을 단계별로 설명하겠습니다.</p>
<h4 id="step-1--첫-번째-토큰-도착-첫-stream-생성">Step 1 — 첫 번째 토큰 도착, 첫 stream 생성</h4>
<p>LLM에서 첫 번째 토큰이 들어옵니다. 아직 과거에 생성한 음성이 없으므로, context prompt 없이 streaming window만으로 음성 프레임을 생성합니다. 8개의 프레임이 만들어지고, 이 중 앞쪽 프레임(t≈1에 가까운, 가장 깨끗한 것)을 스피커로 출력합니다.</p>
<h4 id="step-2--causal-shift-생성된-프레임을-과거로-편입">Step 2 — Causal Shift, 생성된 프레임을 과거로 편입</h4>
<p>방금 생성한 프레임들을 <strong>context prompt 쪽으로 밀어 넣습니다.</strong> 이것이 causal shift 연산입니다. 즉, &quot;방금 만든 음성&quot;이 &quot;이미 완성된 과거 음성&quot;으로 바뀌게 되는 것입니다. 이제 모델은 다음 stream을 생성할 때 이 과거 음성을 참고자료로 활용할 수 있습니다.</p>
<h4 id="step-3--다음-토큰-도착-반복">Step 3 — 다음 토큰 도착, 반복</h4>
<p>새 토큰이 들어오면, Step 2에서 축적된 context prompt(최대 24토큰 분량)를 시퀀스 앞에 붙이고, 새로운 streaming window를 열어 다음 프레임을 생성합니다. 모델은 앞에 붙은 과거 음성을 참고해서 자연스럽게 이어지는 음성을 만들어냅니다. (Transformer의 <strong>in-context learning</strong> — 별도의 추가 학습 없이, 입력으로 주어진 과거 데이터의 패턴을 파악해서 활용)</p>
<h2 id="✔️-dataset--evaluation">✔️ Dataset &amp; Evaluation</h2>
<h3 id="training-set">Training Set</h3>
<table>
<thead>
<tr>
<th>항목</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>데이터셋</td>
<td>LibriTTS (고품질 영어 낭독체)</td>
</tr>
<tr>
<td>샘플링 레이트</td>
<td>24,000 Hz</td>
</tr>
<tr>
<td>음성 토크나이저</td>
<td>EnCodec, Mimi (둘 다 causal conv 기반, 스트리밍 가능)</td>
</tr>
<tr>
<td>RVQ 코드북 수</td>
<td>8개</td>
</tr>
</tbody></table>
<p>모든 모델은 LibriTTS로 학습했습니다. EnCodec과 Mimi 모두 causal convolutional layer로 구성되어 있어 스트리밍 인코딩/디코딩이 가능합니다.</p>
<h4 id="학습-설정">학습 설정</h4>
<table>
<thead>
<tr>
<th>단계</th>
<th>Learning Rate</th>
<th>Batch Size</th>
<th>Steps</th>
<th>Segment Size</th>
<th>GPU</th>
</tr>
</thead>
<tbody><tr>
<td>1단계 (SFM 사전학습)</td>
<td>2×10⁻⁴</td>
<td>512</td>
<td>1M</td>
<td>10,240 frames</td>
<td>A6000 ×4</td>
</tr>
<tr>
<td>2단계 (Adversarial FT)</td>
<td>2×10⁻⁵</td>
<td>64</td>
<td>0.25M</td>
<td>20,480 frames</td>
<td>A6000 ×4</td>
</tr>
</tbody></table>
<p>1단계에서 스트리밍 생성의 기본 능력을 형성하고, 2단계에서 다중 판별기(MPD, MS-STFTD, MS-SB-CQTD)를 활용한 적대적 미세조정으로 음질을 끌어올리는 구조입니다.</p>
<h3 id="test-set">Test Set</h3>
<table>
<thead>
<tr>
<th>데이터셋</th>
<th>용도</th>
<th>구성</th>
</tr>
</thead>
<tbody><tr>
<td>LibriTTS-dev (clean + test)</td>
<td>개발 단계 검증, Ablation 실험</td>
<td>LibriTTS 내부 분할</td>
</tr>
<tr>
<td>Universal Speech Test Set</td>
<td>범용 성능 평가</td>
<td>Expresso, HiFiTTS, LibriTTS, Aishell3, JVS, CML-TTS에서 총 300샘플</td>
</tr>
</tbody></table>
<h3 id="evaluation-metrics">Evaluation Metrics</h3>
<table>
<thead>
<tr>
<th>지표</th>
<th>정식 명칭</th>
<th>측정 대상</th>
<th>방향</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>WER / CER</td>
<td>Word / Character Error Rate</td>
<td>음성 인식 정확도</td>
<td>↓ 낮을수록 좋음</td>
<td>생성 음성의 인식 정확도를 측정합니다</td>
</tr>
<tr>
<td>M-STFT</td>
<td>Multi-resolution STFT distance</td>
<td>스펙트럼 유사도</td>
<td>↓ 낮을수록 좋음</td>
<td>여러 해상도에서 원본과 생성 음성의 주파수 거리를 측정합니다</td>
</tr>
<tr>
<td>PESQ</td>
<td>Perceptual Evaluation of Speech Quality</td>
<td>음성 품질</td>
<td>↑ 높을수록 좋음</td>
<td>사람의 청각 특성을 반영한 품질 점수입니다. 16kHz 다운샘플링 후 측정합니다</td>
</tr>
<tr>
<td>Periodicity</td>
<td>Periodicity RMSE</td>
<td>주기성 오류</td>
<td>↓ 낮을수록 좋음</td>
<td>생성 음성이 원본의 주기적 패턴을 얼마나 정확히 재현하는지 측정합니다</td>
</tr>
<tr>
<td>V/UV F1</td>
<td>Voiced/Unvoiced F1 Score</td>
<td>유성음/무성음 분류</td>
<td>↑ 높을수록 좋음</td>
<td>유성음과 무성음 구간을 정확히 구분하는지 평가합니다</td>
</tr>
<tr>
<td>UTMOS</td>
<td>UTokyo-SaruLab MOS Predictor</td>
<td>자연스러움</td>
<td>↑ 높을수록 좋음</td>
<td>참조 음성 없이 자연스러움을 예측하는 neural MOS 모델입니다</td>
</tr>
<tr>
<td>MOS</td>
<td>Mean Opinion Score</td>
<td>주관적 음질</td>
<td>↑ 높을수록 좋음</td>
<td>Amazon MTurk에서 20명의 원어민 평가자가 5점 척도로 직접 평가한 점수입니다</td>
</tr>
</tbody></table>
<hr>
<h2 id="✔️-results">✔️ Results</h2>
<h3 id="encodec-토큰-복원">EnCodec 토큰 복원</h3>
<p>가장 주목할 만한 결과는 <strong>스트리밍 모델이 기존 병렬 모델을 능가한다</strong>는 점입니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/3678c081-5f9b-49e7-83ba-8079c485a787/image.png" alt=""></p>
<p>StreamFlow-Base(175M, 스트리밍)는 PESQ 3.335, MOS 4.03으로, 병렬 모델인 Vocos, RFWave, MBD를 모두 상회합니다.</p>
<h3 id="mimi-토큰-복원과-moshi-통합">Mimi 토큰 복원과 Moshi 통합</h3>
<p>Moshi의 Mimi decoder를 StreamFlow로 교체하는 실험도 수행했습니다. LLM 출력은 동일하게 유지한 채 디코더만 교체한 결과입니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/1072a494-0da1-4583-9643-69b1bb17d87e/image.png" alt=""></p>
<p>디코더 하나만 바꿔도 WER과 UTMOS가 모두 개선되었습니다. 기존 시스템에 바로 끼워 넣을 수 있는 실용성이 입증된 결과입니다.</p>
<p>하나 의문인 점은... RTF 값이 원래 저렇게 높나요???</p>
<h3 id="ablation">Ablation</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/7536a6d7-e0f3-4e8a-bde7-3a827b10e849/image.png" alt=""></p>
<p>각 구성 요소의 기여를 간단히 요약하면 다음과 같습니다.</p>
<ul>
<li><p><strong>In-Context Learning</strong>: 생성된 샘플을 프롬프트로 붙이면 성능 향상.</p>
</li>
<li><p><strong>Adversarial Fine-tuning</strong>: SFM 사전학습 후 소량의 적대적 미세조정만으로 큰 성능 향상. 2단계 학습의 효율성 입증.</p>
</li>
<li><p><strong>SFM Pre-training</strong>: 가장 핵심. 없으면 스트리밍 생성 능력 미형성 → discriminator collapse</p>
</li>
<li><p><strong>Scale-DiT</strong>: vanilla DiT 대비 성능 향상 + 학습 안정화.</p>
</li>
<li><p><strong>RoPE</strong>: 스트리밍 생성에 필수. 없으면 위치 정보 학습 실패.</p>
</li>
<li><p><strong>Linear-Reshape Transformatio</strong>n: 병렬은 STFT/iSTFT가 우수하나 스트리밍에 부적합. 병렬 → STFT/iSTFT, 스트리밍 → linear-reshape 사용.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/cba2a7f3-a10d-49ef-a7a6-53ffe857598b/image.png" alt=""></p>
<ul>
<li><strong>Scalability</strong>: Tiny(11M) → Small(44M) → Base(175M)로 모델 크기를 키울수록 모든 평가 지표에서 일관되게 성능이 향상</li>
</ul>
<hr>
<h2 id="✔️-resources">✔️ Resources</h2>
<ul>
<li><a href="https://arxiv.org/pdf/2601.15621">🧾 Paper</a></li>
<li><a href="https://streamflow25.github.io/demo/">🎧 Official Demo Page</a></li>
<li><a href="https://github.com/gladia-research-group/loopgen">💻 Official Github Page</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[DNS/URGENT 챌린지]]></title>
            <link>https://velog.io/@sujin-koo/DNS-URGENT-%EC%B1%8C%EB%A6%B0%EC%A7%80</link>
            <guid>https://velog.io/@sujin-koo/DNS-URGENT-%EC%B1%8C%EB%A6%B0%EC%A7%80</guid>
            <pubDate>Tue, 24 Mar 2026 07:56:37 GMT</pubDate>
            <description><![CDATA[<h1 id="dns-챌린지와-urgent-챌린지-소개">DNS 챌린지와 URGENT 챌린지 소개</h1>
<p>오늘은 음성 향상 분야의 대표적인 두 대회, <strong>DNS 챌린지</strong>와 <strong>URGENT 챌린지</strong>에 대해 소개해 드리겠습니다.</p>
<p>두 대회 모두 잡음이나 왜곡이 섞인 환경에서도 사람이 듣기 좋은, 혹은 후속 작업에 유리한 깨끗한 음성을 만들어내는 기술을 겨루는 대회입니다.</p>
<p>다만 초점이 조금 다릅니다. <strong>DNS 챌린지</strong>는 노이즈 제거(enhancement<em>)에 좀 더 초점을 맞추고 있으며, 여기에 더해 fullband 처리, 개인화, 간섭 화자 억제, 실시간 처리 제약 등이 핵심 과제입니다. 반면 *</em>URGENT 챌린지<strong>는 &#39;범용(universal) 음성 향상&#39;을 내세우며, 다양한 유형의 노이즈, 여러 가지 입력 샘플링레이트, 대규모·다언어 데이터를 결합해 **하나의 모델이 여러 조건을 통합적으로 처리</strong>하도록 요구하는 대회입니다.</p>
<blockquote>
<p><strong>용어 설명</strong></p>
<ul>
<li><em>Enhancement(음성 향상)</em>: 잡음, 울림 등이 섞인 음성 신호에서 불필요한 성분을 제거하거나 줄여, 원래 깨끗한 음성에 가깝게 복원하는 기술을 말합니다.</li>
<li><em>Narrowband</em>: 샘플링레이트 8kHz로, 약 4kHz까지의 주파수만 담을 수 있는 가장 낮은 음질 대역입니다. 일반 유선 전화 통화가 대표적인 예로, 상대방 목소리는 알아들을 수 있지만 소리가 답답하고 뭉개지는 느낌이 납니다.</li>
<li><em>Wideband</em>: 샘플링레이트 16kHz로, 약 8kHz까지의 주파수를 담습니다. HD Voice 통화나 화상회의 음질이 여기에 해당하며, Narrowband보다 목소리가 한결 선명하고 자연스럽습니다.</li>
<li><em>Fullband</em>: 샘플링레이트 48kHz로, 약 24kHz까지의 주파수를 담아 사람이 들을 수 있는 거의 모든 소리를 표현할 수 있습니다. 음악 스트리밍이나 고품질 녹음에 사용되는 수준으로, 가장 풍부하고 자연스러운 음질을 제공합니다.</li>
<li><em>간섭 화자(Interfering Talker)</em>: 내가 듣고 싶은 사람의 목소리 외에, 배경에서 동시에 말하는 다른 사람의 목소리를 가리킵니다. 카페에서 대화할 때 옆 테이블 사람의 말소리가 섞이는 상황을 떠올리시면 됩니다.</li>
<li><em>샘플링레이트(Sampling Rate)</em>: 음성 신호를 디지털로 변환할 때, 1초에 몇 번 소리를 측정(샘플링)하는지를 나타내는 수치입니다. 예를 들어 48kHz는 1초에 48,000번, 16kHz는 16,000번 측정합니다. 숫자가 높을수록 원래 소리에 가까운 품질을 얻을 수 있습니다.</li>
</ul>
</blockquote>
<hr>
<h2 id="dns-챌린지">DNS 챌린지</h2>
<h3 id="dns-챌린지란">DNS 챌린지란?</h3>
<blockquote>
<p>깃허브: <a href="https://github.com/microsoft/dns-challenge">https://github.com/microsoft/dns-challenge</a></p>
</blockquote>
<p>DNS는 <strong>Deep Noise Suppression Challenge</strong>의 약자입니다. Microsoft에서 주최하는 이 대회는 주로 단일 채널* 환경에서의 음성 향상을 다루며, 단순한 잡음 제거(denoising<em>)를 넘어 잔향 제거(dereverberation</em>), 나아가 최근에는 동시 발화 및 간섭 화자 억제까지 포함하여 <strong>&quot;사람이 듣기에 좋은 음성 품질&quot;</strong>을 만드는 데 집중하고 있습니다.</p>
<blockquote>
<p><strong>용어 설명</strong></p>
<ul>
<li><em>단일 채널(Single Channel)</em>: 마이크 하나로 녹음된 음성을 의미합니다. 마이크가 여러 개인 경우(다채널)와 달리, 방향 정보 등을 활용하기 어려워 잡음 제거가 더 까다롭습니다.</li>
<li><em>Denoising(잡음 제거)</em>: 음성에 섞여 있는 환경 소음(에어컨 소리, 키보드 소리, 도로 소음 등)을 걸러내는 과정입니다.</li>
<li><em>Dereverberation(잔향 제거)</em>: 방 안에서 소리가 벽에 반사되어 생기는 울림(잔향)을 줄이는 기술입니다. 넓은 강당에서 말할 때 &quot;웅웅&quot; 울리는 느낌이 잔향의 대표적인 예입니다.</li>
</ul>
</blockquote>
<h3 id="데이터셋-종류">데이터셋 종류</h3>
<p>DNS 챌린지(5th, ICASSP 2023 기준)는 Wideband(16kHz)와 Fullband(48kHz) 두 가지 시나리오에 대해 데이터를 제공하며, 전체 데이터는 압축 해제 시 약 1TB 규모입니다. DNS5부터는 Fullband(48kHz)가 주력이며, 두 트랙(Track 1: 헤드셋, Track 2: 스피커폰) 모두 Fullband 데이터셋을 사용합니다.</p>
<h4 id="깨끗한-음성clean-speech-데이터">깨끗한 음성(Clean Speech) 데이터</h4>
<p><strong>Fullband(48kHz) — 총 약 827GB</strong></p>
<table>
<thead>
<tr>
<th>데이터셋</th>
<th>내용</th>
<th>용량</th>
</tr>
</thead>
<tbody><tr>
<td>Read Speech</td>
<td>영어 낭독 음성 (LibriVox 오디오북 기반)</td>
<td>299GB</td>
</tr>
<tr>
<td>German Speech</td>
<td>독일어 음성</td>
<td>319GB</td>
</tr>
<tr>
<td>French Speech</td>
<td>프랑스어 음성</td>
<td>62GB</td>
</tr>
<tr>
<td>Spanish Speech</td>
<td>스페인어 음성</td>
<td>65GB</td>
</tr>
<tr>
<td>Italian Speech</td>
<td>이탈리아어 음성</td>
<td>42GB</td>
</tr>
<tr>
<td>Russian Speech</td>
<td>러시아어 음성</td>
<td>12GB</td>
</tr>
<tr>
<td>Emotional Speech</td>
<td>울음, 소리 지르기, 웃음, 노래 등 감정 표현 음성</td>
<td>2.4GB</td>
</tr>
<tr>
<td>VCTK</td>
<td>다화자(110명) 뉴스 낭독 음성</td>
<td>27GB</td>
</tr>
<tr>
<td>VocalSet</td>
<td>전문 성악가들의 노래 음성</td>
<td>974MB</td>
</tr>
</tbody></table>
<p><strong>Wideband(16kHz) — 총 약 229GB</strong> (DNS3 기준)</p>
<table>
<thead>
<tr>
<th>데이터셋</th>
<th>내용</th>
<th>용량</th>
</tr>
</thead>
<tbody><tr>
<td>Read Speech</td>
<td>영어 낭독 음성 (약 562시간)</td>
<td>-</td>
</tr>
<tr>
<td>Singing Voice</td>
<td>노래 음성 (약 8.8시간)</td>
<td>-</td>
</tr>
<tr>
<td>Emotional Speech</td>
<td>6가지 감정(분노, 혐오, 공포, 행복, 중립, 슬픔) × 4단계 강도 (약 3.6시간)</td>
<td>-</td>
</tr>
<tr>
<td>Mandarin Speech</td>
<td>중국어 만다린 음성 (약 185시간)</td>
<td>-</td>
</tr>
<tr>
<td>다국어 음성</td>
<td>프랑스어, 독일어, 이탈리아어, 러시아어, 스페인어</td>
<td>-</td>
</tr>
<tr>
<td>전체 Clean Speech</td>
<td>약 760시간 (DNS2 대비 50% 증가)</td>
<td>204GB</td>
</tr>
</tbody></table>
<p>DNS5에서는 개인화(Personalized) DNS 모델 개발을 위해, DNSMOS P.835 OVRL 점수가 4.25 이상인 고품질 음성만 선별하여 제공합니다. 총 3,230명의 화자에 대해 화자별 ID 정보가 제공되며, 각 화자당 2.5분의 등록(enrollment) 음성이 포함됩니다.</p>
<h4 id="잡음noise-데이터--총-약-181시간-150개-클래스-약-62000-클립">잡음(Noise) 데이터 — 총 약 181시간, 150개 클래스, 약 62,000 클립</h4>
<p>잡음 데이터는 세 가지 출처에서 수집됩니다.</p>
<p><strong>Audioset</strong>: YouTube 동영상에서 추출한 약 200만 개의 사람 레이블 10초 음성 클립 모음(약 600개 오디오 이벤트 클래스)에서 선별합니다. 원본 Audioset은 음악·말소리 같은 클래스가 100만 개 이상인 반면, 칫솔질·삐걱거림 같은 클래스는 200개 미만으로 불균형하기 때문에, 클래스당 최소 500개 클립이 되도록 샘플링을 조정했습니다. 또한, 음성 활동 탐지기(VAD*)를 사용하여 사람 말소리가 포함된 클립을 모두 제거했습니다.</p>
<p><strong>Freesound</strong>: CC0 라이선스(저작권 제한 없음)의 다양한 환경음 클립에서 약 10,000개를 추가로 수집했습니다.</p>
<p><strong>DEMAND (Diverse Environments Multi-channel Acoustic Noise Database)</strong>: 공원, 카페, 지하철역, 세탁실, 사무실 등 다양한 실제 환경에서 다채널로 녹음된 잡음 데이터베이스입니다.</p>
<p>세 출처를 합산하면 약 150개 잡음 클래스, 62,000개 클립, 총 181시간입니다. VoIP(인터넷 통화) 환경에 자주 등장하는 잡음 유형 위주로 선별되었습니다. Fullband 잡음 데이터(noise_fullband)는 별도로 약 58GB 규모로 제공됩니다.</p>
<blockquote>
<p><strong>용어 설명</strong></p>
<ul>
<li><em>VAD(Voice Activity Detection, 음성 활동 탐지)</em>: 오디오 신호에서 사람의 말소리가 있는 구간과 없는 구간을 자동으로 구분하는 기술입니다. 여기서는 잡음 데이터에 사람 말소리가 섞여 들어가는 것을 방지하기 위해 사용되었습니다.</li>
</ul>
</blockquote>
<h4 id="방-임펄스-응답rir-데이터">방 임펄스 응답(RIR*) 데이터</h4>
<p><strong>Wideband</strong>: SLR26(2.1GB)과 SLR28(2.3GB)을 합쳐 약 4.3GB, 총 118,000개 이상의 실제·합성 RIR 샘플이 포함됩니다. 각 RIR에 대해 잔향 시간(RT60<em>)과 명료도(C50</em>) 파라미터가 함께 제공됩니다.</p>
<p><strong>Fullband</strong>: 약 5.9GB 규모의 RIR 데이터가 제공됩니다.</p>
<blockquote>
<p><strong>용어 설명</strong></p>
<ul>
<li><em>RIR(Room Impulse Response, 방 임펄스 응답)</em>: 특정 공간에서 소리가 벽, 천장, 바닥 등에 반사되어 마이크에 도달하는 패턴을 기록한 것입니다. 이 데이터를 깨끗한 음성에 적용하면, 마치 그 공간에서 녹음한 것처럼 울림이 있는 음성을 만들어낼 수 있습니다.</li>
<li><em>RT60(잔향 시간)</em>: 소리가 발생한 뒤, 음량이 60dB(원래의 1/1000) 줄어들 때까지 걸리는 시간입니다. RT60이 길수록 울림이 오래 남는 공간(큰 강당, 성당 등)이고, 짧을수록 울림이 적은 공간(방음실 등)입니다.</li>
<li><em>C50(명료도)</em>: 음원이 발생한 후 처음 50ms 이내에 도착하는 소리와 그 이후에 도착하는 반사음의 에너지 비율입니다. 값이 높을수록 말소리가 선명하게 들립니다.</li>
</ul>
</blockquote>
<h4 id="테스트셋">테스트셋</h4>
<p>개발용 테스트셋(dev testset)과 블라인드 테스트셋(blind testset)이 별도로 제공됩니다. 블라인드 테스트셋은 크라우드소싱과 Microsoft 내부에서 다양한 디바이스(모바일/데스크톱), 다양한 음향 환경에서 실제 녹음한 데이터를 포함합니다. 영어 외에도 포르투갈어, 러시아어, 스페인어(비성조), 만다린, 광동어, 펀자브어, 베트남어(성조) 등 다국어 테스트 클립이 포함됩니다. 또한 감정 음성(행복, 슬픔, 분노, 소리 지르기, 울음, 웃음)과 부수언어적 발화(헛기침, &quot;음&quot;, 한숨, 신음 등)도 평가 대상에 포함됩니다.</p>
<h3 id="평가-metric-종류">평가 Metric 종류</h3>
<p>DNS 챌린지는 주관적 평가를 핵심으로 삼으면서, 객관적 보조 지표를 함께 활용합니다.</p>
<p><strong>ITU-T P.835 주관적 평가 (핵심 평가)</strong>: 실제 사람이 음성을 듣고 1~5점 척도로 세 가지 측면을 평가합니다. SIG(음성 자체의 품질), BAK(배경 잡음의 억제 정도), OVRL(전체적인 음질)이며, 최종 순위는 OVRL을 기준으로 결정됩니다.</p>
<p><strong>DNSMOS P.835 (비침습적* 객관적 평가)</strong>: P.835 주관 평가를 딥러닝으로 자동 예측하는 메트릭입니다. 깨끗한 원본 음성 없이도 SIG, BAK, OVRL 세 점수를 추정할 수 있어, 참가자들이 개발 과정에서 빠르게 모델 성능을 확인하는 데 사용합니다.</p>
<p><strong>WAcc (Word Accuracy, 단어 정확도)</strong>: 음성 향상 처리가 음성 인식(ASR*) 성능에 미치는 영향을 측정합니다. 잡음을 너무 과하게 제거하면 음성까지 왜곡되어 인식 정확도가 떨어질 수 있기 때문에, 이를 확인하기 위한 보조 지표입니다.</p>
<blockquote>
<p><strong>용어 설명</strong></p>
<ul>
<li><em>비침습적(Non-intrusive) 메트릭</em>: 깨끗한 원본 음성(참조 신호)이 없어도 품질을 측정할 수 있는 평가 방식입니다. 반대로 PESQ처럼 원본이 필요한 방식을 &#39;침습적(Intrusive) 메트릭&#39;이라고 합니다. 실제 녹음 환경에서는 깨끗한 원본을 구하기 어렵기 때문에, 비침습적 메트릭이 실용적입니다.</li>
<li><em>ASR(Automatic Speech Recognition, 자동 음성 인식)</em>: 사람의 말소리를 컴퓨터가 자동으로 텍스트로 변환하는 기술입니다. Siri, 구글 어시스턴트 등이 대표적인 예입니다.</li>
</ul>
</blockquote>
<hr>
<h2 id="urgent-챌린지">URGENT 챌린지</h2>
<h3 id="urgent-챌린지란">URGENT 챌린지란?</h3>
<blockquote>
<p>깃허브: <a href="https://github.com/urgent-challenge">https://github.com/urgent-challenge</a></p>
</blockquote>
<p>URGENT는 <strong>Universality, Robustness, and Generalizability for EnhancemeNT</strong>의 약자로, &quot;범용 음성 향상&quot;을 목표로 하는 대회입니다. 하나의 시스템이 다양한 왜곡 유형(잡음, 잔향, 클리핑, 대역폭 제한, 코덱 왜곡, 패킷 손실, 바람 잡음 등)과 다양한 입력 포맷(서로 다른 샘플링레이트)을 <strong>단일 프레임워크로 통합 처리</strong>할 수 있는지를 겨루는 대회입니다.</p>
<blockquote>
<p><strong>용어 설명</strong></p>
<ul>
<li><em>클리핑(Clipping)</em>: 녹음 시 소리가 장비가 처리할 수 있는 최대 범위를 넘어서면, 신호의 꼭대기 부분이 잘려나가는 현상입니다. 마이크에 너무 가까이서 크게 말하면 소리가 &quot;찢어지는&quot; 느낌이 나는 것이 클리핑의 대표적인 예입니다.</li>
<li><em>대역폭 제한(Bandwidth Limitation)</em>: 전송할 수 있는 주파수 범위가 제한되는 것을 말합니다. 예를 들어 일반 전화는 약 300Hz ~ 3,400Hz만 전달하기 때문에, 사람 목소리의 높은 주파수나 낮은 주파수가 잘리면서 음질이 떨어집니다.</li>
<li><em>코덱(Codec)</em>: 음성 데이터를 압축·해제하는 알고리즘입니다. MP3, AAC, Opus 등이 대표적이며, 압축 과정에서 원래 음질이 일부 손실될 수 있습니다.</li>
<li><em>패킷 손실(Packet Loss)</em>: 인터넷 통화(VoIP 등)에서 데이터가 작은 묶음(패킷)으로 전송되는데, 네트워크 문제로 일부 패킷이 도착하지 못하는 현상입니다. 화상 회의 중 상대방 목소리가 끊기는 현상이 패킷 손실의 대표적인 예입니다.</li>
</ul>
</blockquote>
<h3 id="데이터셋-종류-1">데이터셋 종류</h3>
<p>URGENT 2024 챌린지의 학습 및 검증 데이터는 모두 공개 코퍼스*를 기반으로 시뮬레이션하여 생성됩니다. 참가자 간 공정한 비교를 위해, 지정된 데이터만 사용하도록 엄격히 제한한 점이 DNS 챌린지와의 큰 차이점입니다.</p>
<h4 id="음성speech-데이터--큐레이션-후-총-약-1300시간">음성(Speech) 데이터 — 큐레이션 후 총 약 1,300시간</h4>
<table>
<thead>
<tr>
<th>코퍼스</th>
<th>내용</th>
<th>샘플링레이트</th>
<th>규모</th>
</tr>
</thead>
<tbody><tr>
<td>DNS5 LibriVox</td>
<td>LibriVox 오디오북 기반 영어 음성</td>
<td>8~48kHz (대역폭 재추정 후)</td>
<td>약 350시간</td>
</tr>
<tr>
<td>LibriTTS</td>
<td>LibriSpeech에서 파생된 낭독 음성 (TTS 연구용)</td>
<td>8~24kHz (대역폭 재추정 후)</td>
<td>약 200시간</td>
</tr>
<tr>
<td>CommonVoice 11.0 (영어)</td>
<td>크라우드소싱으로 수집된 다양한 화자의 영어 음성</td>
<td>8~48kHz (대역폭 재추정 후)</td>
<td>약 550시간</td>
</tr>
<tr>
<td>VCTK</td>
<td>110명 화자의 뉴스 문장 낭독 음성</td>
<td>48kHz</td>
<td>약 80시간</td>
</tr>
<tr>
<td>WSJ</td>
<td>Wall Street Journal 뉴스 원고 낭독 음성</td>
<td>16kHz</td>
<td>약 85시간</td>
</tr>
</tbody></table>
<p>URGENT 챌린지는 다양한 샘플링레이트(8k, 16k, 22.05k, 24k, 32k, 44.1k, 48kHz)의 입력을 하나의 모델로 처리해야 하므로, 각 코퍼스의 <strong>실제 유효 대역폭</strong>을 에너지 기반 알고리즘으로 재추정합니다. 예를 들어 DNS5 LibriVox의 약 50%는 공칭(파일에 표시된 스펙) 48kHz이지만 실제 유효 대역폭은 32kHz였고, LibriTTS의 약 25%도 공칭 24kHz보다 낮은 대역폭을 가지고 있었습니다. 이 재추정 과정을 통해 각 샘플이 실제 담고 있는 주파수 대역에 맞는 샘플링레이트로 재조정됩니다.</p>
<h4 id="잡음noise-데이터--총-약-250시간">잡음(Noise) 데이터 — 총 약 250시간</h4>
<table>
<thead>
<tr>
<th>코퍼스</th>
<th>내용</th>
<th>샘플링레이트</th>
<th>규모</th>
</tr>
</thead>
<tbody><tr>
<td>Audioset + Freesound (DNS5)</td>
<td>YouTube에서 추출한 환경음 + CC0 라이선스 환경음. 약 150개 잡음 클래스, 62,000개 클립. 음악, 교통소음, 기계음, 자연음 등</td>
<td>8~48kHz</td>
<td>약 180시간</td>
</tr>
<tr>
<td>WHAM!</td>
<td>도시 환경(거리, 카페, 레스토랑 등)에서 실제 녹음한 잡음</td>
<td>48kHz</td>
<td>약 70시간</td>
</tr>
</tbody></table>
<h4 id="방-임펄스-응답rir-데이터-1">방 임펄스 응답(RIR) 데이터</h4>
<p>DNS5 챌린지에서 시뮬레이션된 RIR 데이터를 기본으로 활용합니다. 참가자들이 RIR-Generator, pyroomacoustics, gpuRIR 같은 도구를 이용해 직접 추가 RIR을 생성하는 것도 허용됩니다.</p>
<h4 id="왜곡distortion-유형">왜곡(Distortion) 유형</h4>
<p>학습 데이터를 생성할 때, 다음 4가지 왜곡을 다양한 조합과 강도로 적용합니다. SNR 범위는 -5dB ~ 20dB로 설정됩니다.</p>
<table>
<thead>
<tr>
<th>왜곡 유형</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>잡음 추가(Additive Noise)</td>
<td>위의 잡음 데이터를 다양한 SNR로 깨끗한 음성에 혼합</td>
</tr>
<tr>
<td>잔향(Reverberation)</td>
<td>RIR을 깨끗한 음성에 적용하여 공간 울림 효과 부여</td>
</tr>
<tr>
<td>클리핑(Clipping)</td>
<td>음성 신호의 피크를 인위적으로 잘라내어 왜곡 생성</td>
</tr>
<tr>
<td>대역폭 제한(Bandwidth Limitation)</td>
<td>고주파·저주파를 잘라내어 전화 통화와 유사한 제한된 음질로 변환</td>
</tr>
</tbody></table>
<h4 id="테스트셋-1">테스트셋</h4>
<table>
<thead>
<tr>
<th>테스트셋</th>
<th>샘플 수</th>
<th>특징</th>
</tr>
</thead>
<tbody><tr>
<td>검증(Validation)</td>
<td>1,000개 (약 1.5시간)</td>
<td>시뮬레이션 데이터. 깨끗한 음성과 잡음 음성 쌍 + SNR, 왜곡 설정, 전사(transcript) 등 메타 정보 포함</td>
</tr>
<tr>
<td>비블라인드(Non-blind) 테스트</td>
<td>-</td>
<td>시뮬레이션 데이터. 모든 객관적 메트릭으로 평가</td>
</tr>
<tr>
<td>블라인드(Blind) 테스트</td>
<td>1,000개</td>
<td>시뮬레이션 데이터 + 실제 녹음 데이터 혼합. 실제 녹음 부분은 CommonVoice, LibriTTS, VCTK의 테스트 파티션 및 YouTube 크리에이티브 커먼즈 팟캐스트 등에서 수집. 실제 녹음에는 DEMAND, TUT Urban Acoustic Scenes 등 학습에 포함되지 않은 잡음 코퍼스와 SLR28, MYRiAD v2 등의 실제 녹음 RIR을 사용</td>
</tr>
</tbody></table>
<blockquote>
<p><strong>용어 설명</strong></p>
<ul>
<li><em>코퍼스(Corpus)</em>: 연구나 학습에 사용하기 위해 체계적으로 수집·정리된 대규모 데이터 모음을 말합니다. 음성 분야에서는 녹음된 음성 파일들의 집합을 가리킵니다.</li>
<li><em>SNR(Signal-to-Noise Ratio, 신호 대 잡음비)</em>: 원하는 신호(음성)와 잡음의 크기 비율을 데시벨(dB)로 나타낸 값입니다. SNR이 높을수록 잡음에 비해 음성이 크고 깨끗하게 들리며, 낮을수록 잡음이 심한 환경을 의미합니다.</li>
</ul>
</blockquote>
<h3 id="평가-metric-종류-1">평가 Metric 종류</h3>
<p>URGENT 챌린지는 DNS 챌린지와 달리, <strong>5가지 카테고리의 13개 메트릭</strong>을 종합적으로 활용하여 순위를 매기는 것이 가장 큰 특징입니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/0c11a03d-2176-4431-8c67-23e30ea9a507/image.png" alt=""></p>
<p><strong>비침습적 음성 향상(SE) 메트릭</strong>: DNSMOS(SIG/BAK/OVRL 점수 예측)와 NISQA*(전반적 음질, 잡음감, 색채감, 불연속성, 음량 등을 예측)를 사용합니다. 원본 음성 없이 품질을 추정할 수 있어 실제 녹음 데이터에도 적용 가능합니다.</p>
<p><strong>침습적 음성 향상(SE) 메트릭</strong>: POLQA<em>, PESQ</em>(음성 품질), ESTOI<em>(음성 명료도), SDR</em>(신호 왜곡비), MCD*(멜 켑스트럼 왜곡), LSD(로그 스펙트럼 거리) 등을 사용합니다. 원본 깨끗한 음성과 비교하여 정밀하게 측정합니다.</p>
<p><strong>다운스트림 작업 독립 메트릭</strong>: LPS(Levenshtein Phone Similarity)와 SpeechBERTScore를 사용합니다. 특정 언어나 화자에 의존하지 않고, 음성의 음소* 수준 충실도를 평가합니다.</p>
<p><strong>다운스트림 작업 의존 메트릭</strong>: SpkSim(화자 유사도)과 WAcc(단어 정확도)로, 향상된 음성이 화자 인식이나 음성 인식 같은 후속 작업에 얼마나 유용한지를 측정합니다.</p>
<p><strong>주관적 메트릭</strong>: 최종 블라인드 테스트 단계에서 ITU-T P.808 기준에 따라 크라우드소싱<em>으로 MOS</em>(평균 의견 점수)를 수집합니다. 300개 샘플 서브셋에 대해 8명의 평가자가 점수를 매깁니다.</p>
<blockquote>
<p><strong>용어 설명</strong></p>
<ul>
<li><em>NISQA(Non-Intrusive Speech Quality Assessment)</em>: 원본 음성 없이 음질을 다차원(잡음감, 색채감, 불연속성, 음량)으로 평가하는 딥러닝 기반 메트릭입니다.</li>
<li><em>PESQ(Perceptual Evaluation of Speech Quality)</em>: 전화 통화 품질 평가를 위해 개발된 국제 표준(ITU-T P.862) 메트릭으로, 원본 음성과 처리된 음성을 비교해 사람이 느끼는 음질 차이를 수치화합니다.</li>
<li><em>POLQA(Perceptual Objective Listening Quality Analysis)</em>: PESQ의 후속 표준(ITU-T P.863)으로, 더 넓은 네트워크 환경(HD Voice, VoIP 등)에서의 음질 평가를 지원합니다.</li>
<li><em>ESTOI(Extended Short-Time Objective Intelligibility)</em>: 잡음 환경에서 음성이 얼마나 알아듣기 쉬운지(명료도)를 측정하는 메트릭입니다.</li>
<li><em>SDR(Signal-to-Distortion Ratio)</em>: 원본 신호 대비 왜곡의 비율을 데시벨로 나타낸 값입니다. 높을수록 원본에 가깝게 복원되었음을 의미합니다.</li>
<li><em>MCD(Mel Cepstral Distortion)</em>: 원본과 처리된 음성의 멜 켑스트럼* 차이를 측정합니다. 값이 낮을수록 원본에 가까운 음색을 유지했다는 뜻입니다.</li>
<li><em>멜 켑스트럼(Mel Cepstrum)</em>: 사람의 청각 특성을 반영한 주파수 분석 방법으로, 음색의 특징을 수치로 표현한 것입니다.</li>
<li><em>음소(Phoneme)</em>: 언어에서 의미를 구별하는 가장 작은 소리 단위입니다. 예를 들어 &quot;밥&quot;과 &quot;밤&quot;에서 &quot;ㅂ&quot;과 &quot;ㅁ&quot;이 서로 다른 음소입니다.</li>
<li><em>MOS(Mean Opinion Score, 평균 의견 점수)</em>: 여러 사람이 음질을 1~5점으로 평가한 뒤 평균을 낸 점수입니다. 5점이 최고 품질, 1점이 최저 품질을 의미합니다.</li>
<li><em>크라우드소싱(Crowdsourcing)</em>: 불특정 다수의 사람들에게 온라인으로 작업(여기서는 음질 평가)을 분배하여 대규모 데이터를 수집하는 방식입니다. Amazon Mechanical Turk 같은 플랫폼이 대표적입니다.</li>
</ul>
</blockquote>
<hr>
<h2 id="앞으로의-전망">앞으로의 전망</h2>
<p>URGENT 챌린지는 빠르게 진화하고 있습니다. 2024년(1회) 대비 2025년(2회)에서는 왜곡 유형이 4가지에서 7가지(코덱 왜곡, 패킷 손실, 바람 잡음 추가)로 늘어났고, 영어 단일 언어에서 5개 언어(영어, 독일어, 프랑스어, 스페인어, 중국어)로 확장되었습니다. 데이터 규모도 Track 2 기준 약 60,000시간까지 대폭 확대되어, 데이터 스케일링이 음성 향상 성능에 미치는 영향까지 탐색할 수 있게 되었습니다.</p>
<p>2025년 챌린지 결과에서 주목할 만한 점은, 판별적(discriminative) 모델과 생성적(generative) 모델을 결합한 하이브리드 방식이 대세로 떠올랐다는 것입니다. 또한 순수 생성 모델이 언어에 따라 성능 편차를 보이는 현상(언어 의존성)이 새롭게 확인되어, 앞으로 다국어 환경에서의 범용 음성 향상이 중요한 연구 주제가 될 전망입니다.</p>
<p>가장 최신인 URGENT 2026(ICASSP 2026)에서는 한 발 더 나아가, 기존의 음성 향상(SE) 트랙(Track 1)에 더해 <strong>음성 품질 평가(SQA) 트랙(Track 2)</strong>이 새롭게 추가되었습니다. Track 2는 음성을 직접 향상시키는 것이 아니라, SE 시스템이 처리한 음성의 MOS 점수를 정확하게 예측하는 모델을 만드는 과제입니다. &quot;좋은 음성 향상 모델을 만드는 것&quot;뿐 아니라 &quot;음성 품질을 정확하게 자동 측정하는 것&quot;까지 챌린지의 범위가 넓어지고 있는 셈입니다.</p>
<hr>
<h2 id="reference">Reference</h2>
<p>두 챌린지 모두 데이터셋 다운로드 스크립트, 학습 데이터 생성 스크립트, 평가 메트릭 계산 스크립트가 각각의 GitHub 저장소에 공개되어 있습니다. 직접 데이터를 내려받고, 모델을 학습하고, 평가까지 해볼 수 있으니 관심 있으신 분들은 아래 링크를 참고해 주세요.</p>
<ul>
<li><strong>DNS 챌린지</strong>: <a href="https://github.com/microsoft/DNS-Challenge">https://github.com/microsoft/DNS-Challenge</a></li>
<li><strong>URGENT 2024 챌린지</strong>: <a href="https://github.com/urgent-challenge/urgent2024_challenge">https://github.com/urgent-challenge/urgent2024_challenge</a></li>
<li><strong>URGENT 2025 챌린지</strong>: <a href="https://github.com/urgent-challenge/urgent2025_challenge">https://github.com/urgent-challenge/urgent2025_challenge</a></li>
<li><strong>URGENT 2026 챌린지</strong>: 
<a href="https://github.com/urgent-challenge/urgent2026_challenge_track1">https://github.com/urgent-challenge/urgent2026_challenge_track1</a>
<a href="https://github.com/urgent-challenge/urgent2026_challenge_track2">https://github.com/urgent-challenge/urgent2026_challenge_track2</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[온디바이스 AI]]></title>
            <link>https://velog.io/@sujin-koo/%EC%98%A8%EB%94%94%EB%B0%94%EC%9D%B4%EC%8A%A4-AI</link>
            <guid>https://velog.io/@sujin-koo/%EC%98%A8%EB%94%94%EB%B0%94%EC%9D%B4%EC%8A%A4-AI</guid>
            <pubDate>Sun, 22 Mar 2026 12:38:44 GMT</pubDate>
            <description><![CDATA[<p>오늘은 온디바이스에 대해서 가볍게 적어보려고 한다. 인터넷 자료에 의지를 많이 했다보니 내용 검증은 더 필요하다ㅎ;; 아무튼... 온디바이스 AI는 클라우드 서버 대신 기기 내부에서 AI 추론을 수행하는 방식이다. 보안, 지연시간, 오프라인 가용성, 비용 측면에서 이점이 있으며, 이를 실현하기 위해 양자화(Quantization), 병렬 연산(Parallel Computing), 캐시 최적화(Cache Optimization) 등이 사용된다. </p>
<hr>
<h3 id="온디바이스-ai">온디바이스 AI</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/9eb55b18-6d01-4a79-bd71-4b4c848b23cc/image.png" alt="">
(이미지출처: <a href="http://tech.kobeta.com/%EC%83%88%EB%A1%9C%EC%9A%B4-ai-%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84%EC%9D%98-%EC%8B%9C%EC%9E%91-%EC%98%A8%EB%94%94%EB%B0%94%EC%9D%B4%EC%8A%A4-ai/">http://tech.kobeta.com/새로운-ai-패러다임의-시작-온디바이스-ai/</a>)</p>
<p>온디바이스(On-device) AI는 말 그대로 기기(device) 내부에서 AI 모델의 추론(inference)을 수행하는 구조를 뜻한다.
기존의 일반적인 AI 서비스 구조는 클라우드 기반이다. 사용자가 입력을 보내면 데이터가 인터넷을 통해 원격 서버로 전송되고, 서버에서 모델이 추론을 수행한 뒤 결과를 다시 사용자에게 반환한다. ChatGPT, Gemini, Copilot 등 대부분의 생성형 AI 서비스가 이 방식으로 동작한다. 서버 측에 수천억 개의 파라미터를 가진 대규모 언어 모델(LLM)을 올려놓고, 수만 개의 GPU가 연산을 처리하는 구조다.
온디바이스 AI는 이 과정을 기기 내부의 하드웨어 자원만으로 대체한다. 모델이 스마트폰이나 노트북의 NPU(Neural Processing Unit), GPU, CPU 위에서 직접 실행되며, 데이터가 기기 밖으로 나가지 않는다.</p>
<hr>
<h3 id="온디바이스-ai가-필요한-이유">온디바이스 AI가 필요한 이유</h3>
<p>온디바이스 AI가 주목받는 이유는 크게 네 가지로 정리할 수 있다.</p>
<h4 id="보안과-프라이버시">보안과 프라이버시.</h4>
<p>데이터가 기기 밖으로 전송되지 않으므로, 네트워크 구간에서 발생할 수 있는 유출 위험이 원천적으로 제거된다. 얼굴 인식, 음성 데이터, 건강 정보 등 민감한 개인정보를 다루는 서비스에서 이 점은 특히 중요하다. 기존 클라우드 AI에서는 아무리 암호화를 적용해도 ‘전송’이라는 행위 자체가 기기 내부에서만 처리하는 것에 비해 취약할 수 밖에 없다.</p>
<h4 id="저지연성low-latency">저지연성(Low Latency).</h4>
<p>클라우드 기반 추론에서는 네트워크 왕복 시간이 불가피하게 발생한다. 서버 측 연산이 아무리 빨라도 물리적 거리에 의한 지연은 제거할 수 없다. 온디바이스 추론은 이 네트워크 지연을 최대한 줄인다. 실시간 카메라 필터, 음성 인식, AR 같은 서비스에서 체감 차이가 크다.</p>
<h4 id="오프라인-가용성">오프라인 가용성.</h4>
<p>네트워크 연결 없이도 AI 기능이 작동한다. 항공기 내, 지하 터널, 통신 인프라가 부족한 지역에서도 동일한 수준의 서비스를 제공할 수 있다.</p>
<h4 id="비용-구조의-변화">비용 구조의 변화.</h4>
<p>클라우드 AI는 사용량에 비례하여 서버 비용이 증가한다. 수많은 사람들이 동시에 요청을 보내면 GPU 클러스터 운영 비용은 천문학적으로 불어난다. 기기 측에서 추론을 처리하면 서비스 제공자의 인프라 부담이 크게 줄어든다.</p>
<hr>
<h3 id="제한된-자원에서-모델을-돌리는-법">제한된 자원에서 모델을 돌리는 법</h3>
<p>클라우드 서버에는 수많은 RAM과 연산 코어들이 있다. 반면 스마트폰의 메모리는 몇 GB 수준이고, 연산 능력도 비교할 수 없이 작다. 이 간극을 메우기 위해 세 가지 방향의 최적화가 필요하다.
(1) 계산량 자체를 줄이고 — 양자화(Quantization)
(2) 주어진 연산 자원을 최대한 활용하고 — 병렬화(Parallelization)
(3) 메모리 접근 병목을 해소한다 — 캐시 최적화(Cache Optimization)
이 세 가지는 독립적으로 작동하는 것이 아니라, 서로 맞물려 하나의 추론 파이프라인을 구성한다. 하나씩 살펴보자.</p>
<hr>
<h3 id="양자화quantization--정밀도를-낮춰-계산을-줄인다">양자화(Quantization) — 정밀도를 낮춰 계산을 줄인다</h3>
<p>*<em>개념. *</em>AI 모델의 가중치(weight)는 기본적으로 32비트 부동소수점(FP32) 형식으로 저장된다. 양자화는 이 가중치의 숫자 표현을 더 낮은 비트 수로 변환하는 기술이다. FP32 → INT8(8비트 정수)로 변환하면 가중치 하나당 메모리 사용량이 4바이트에서 1바이트로 줄어든다. 최근에는 INT4, 심지어 INT2까지 적용하는 연구도 활발하다.</p>
<p>*<em>쉽게 말하면. *</em>소수점 이하 열 자리까지 기록하던 성적표를 반올림해서 정수로만 적는 것과 비슷하다. 98.37254901을 98로 표기해도 석차를 매기는 데는 거의 영향이 없다. 약간의 정밀도를 포기하는 대신, 저장 공간과 계산량을 4배 이상 절약할 수 있다.</p>
<p>*<em>기술적 디테일. *</em>양자화에는 크게 두 가지 방식이 있다. PTQ(Post-Training Quantization)는 이미 학습이 끝난 모델에 사후 적용하는 방식으로, 별도의 재학습 없이 빠르게 적용할 수 있다. QAT(Quantization-Aware Training)는 학습 과정에서부터 양자화 오차를 반영하여 훈련하는 방식으로, 정확도 손실이 더 적다. 일반적으로 FP32 → INT8 변환 시 정확도 손실은 1–2% 이내로 보고된다.</p>
<p>+) 양자화와 함께 쓰이는 보조 기법들에는 pruning과 KD가 있다.</p>
<h4 id="가지치기pruning">가지치기(Pruning).</h4>
<p>모델의 뉴런 연결(시냅스) 중 출력에 미치는 영향이 작은 것들을 제거하는 기법이다. 가중치의 절대값이 특정 임곗값 이하인 연결을 0으로 만들면, 해당 연산을 건너뛸 수 있다. 비구조적 가지치기(Unstructured Pruning)는 개별 가중치 단위로 제거하고, 구조적 가지치기(Structured Pruning)는 필터나 채널 단위로 제거해 실제 하드웨어 가속의 이점을 얻기 쉽다.</p>
<h4 id="지식-증류knowledge-distillation">지식 증류(Knowledge Distillation).</h4>
<p>대규모 ‘교사(Teacher)’ 모델의 출력 분포를 작은 ‘학생(Student)’ 모델이 학습하는 방식이다. 학생 모델은 정답 레이블뿐 아니라 교사 모델이 출력하는 확률 분포(soft label)를 함께 학습하기 때문에, 단독으로 학습할 때보다 더 높은 성능을 낼 수 있다. Google의 DistilBERT가 대표적인 사례로, 원본 BERT 대비 파라미터 수를 40% 줄이면서도 성능의 97%를 유지한다.</p>
<hr>
<h3 id="병렬화parallel-computing--동시에-계산해서-속도를-높인다">병렬화(Parallel Computing) — 동시에 계산해서 속도를 높인다</h3>
<p>*<em>개념. *</em>하나의 큰 연산을 여러 조각으로 나누어 여러 프로세서가 동시에 처리하는 기술이다. 딥러닝 추론의 핵심 연산인 행렬 곱셈은 본질적으로 같은 패턴의 곱셈과 덧셈을 반복하는 구조이므로, 병렬화에 매우 적합하다.</p>
<p>*<em>쉽게 말하면. *</em>혼자서 100개의 일을 하는 것보다 4명이 25개의 일을 동시에 하는 것이 빠르다.</p>
<h4 id="데이터-병렬성-simd">데이터 병렬성: SIMD</h4>
<p>SIMD(Single Instruction, Multiple Data)는 하나의 명령어로 여러 데이터를 동시에 처리하는 방식이다. 예를 들어 128비트 벡터 레지스터에 32비트 부동소수점 4개를 적재하면, 하나의 덧셈 명령으로 4개의 덧셈을 동시에 수행할 수 있다. ARM 프로세서의 NEON(128비트), x86의 AVX(256비트), AVX-512(512비트)가 대표적인 SIMD 명령어 세트다. 모바일 기기의 ARM 칩에서는 NEON이 온디바이스 AI 추론의 핵심 가속기 역할을 한다.</p>
<h4 id="작업-병렬성-multi-threading">작업 병렬성: Multi-threading</h4>
<p>최신 모바일 SoC(System on Chip)는 보통 4–8개의 CPU 코어를 탑재한다. 멀티스레딩은 이 코어들에 서로 다른 연산 블록을 할당하여 동시에 처리하는 방식이다. C/C++ 환경에서는 OpenMP, pthreads 등의 라이브러리로 구현한다.</p>
<h4 id="실제-추론에서의-동작-구조">실제 추론에서의 동작 구조</h4>
<p>실제 AI 추론에서는 SIMD와 멀티스레딩이 결합된다. 전형적인 흐름은 다음과 같다.
<strong>Tiling:</strong> 큰 행렬을 캐시에 적재 가능한 크기의 작은 타일(tile)로 분할한다.
<strong>Distribution:</strong> 분할된 타일을 각 CPU 코어에 배분한다.
*<em>SIMD Execution: *</em>각 코어는 배정받은 타일 내의 연산을 SIMD 명령어로 4–8개씩 묶어 고속 처리한다.</p>
<h4 id="병렬화의-한계">병렬화의 한계</h4>
<p>이론적으로는 코어가 N개이면 속도도 N배가 되어야 한다. 하지만 현실은 다르다. 세 가지 제약이 존재한다.</p>
<p><strong>오버헤드(Overhead). *<em>작업을 분할하고 결과를 합치는 과정 자체에 비용이 든다. 작업 단위가 너무 작으면 분배 비용이 연산 비용을 초과하여 오히려 성능이 저하된다.
*</em>
경쟁 조건(Race Condition).</strong> 여러 코어가 동일한 메모리 영역에 동시에 쓰기를 시도하면 데이터 정합성 문제가 발생한다. 이를 방지하기 위해 Lock(잠금)을 도입하면, 그만큼 병렬성이 감소한다.</p>
<p>*<em>암달의 법칙(Amdahl’s Law). *</em>프로그램의 일부분은 구조적으로 병렬화가 불가능하다. 전체 코드의 90%를 완벽히 병렬화하더라도, 나머지 10%의 순차 실행 구간이 전체 속도 향상의 상한선을 결정한다. 코어를 무한히 늘려도 이론적 최대 속도 향상은 10배에 그친다.</p>
<hr>
<h3 id="캐시-최적화cache-optimization--메모리-접근-병목을-해소한다">캐시 최적화(Cache Optimization) — 메모리 접근 병목을 해소한다</h3>
<p>*<em>개념. *</em>현대 프로세서에서 연산 속도와 메모리 접근 속도의 차이는 수십~수백 배에 달한다. CPU가 아무리 빠르게 계산해도, 데이터가 제때 공급되지 않으면 유휴 상태(stall)로 대기하게 된다. 캐시 최적화는 CPU에 가까운 고속 캐시 메모리(L1/L2)의 활용률을 극대화하여 이 병목을 줄이는 기술이다.</p>
<p><strong>쉽게 말하면.</strong> 요리할 때 자주 쓰는 재료를 조리대(캐시) 위에 미리 꺼내놓으면 냉장고(메인 메모리)까지 왔다 갔다 하는 시간을 줄일 수 있다. 캐시 최적화는 ‘어떤 재료를 언제, 어떤 순서로 조리대에 올려놓을 것인가’를 설계하는 작업이다.
주요 기법은 세 가지다.</p>
<p>*<em>타일링(Tiling). *</em>큰 행렬 연산을 캐시 크기에 맞는 작은 블록으로 분할하여, 하나의 블록이 캐시에 머무는 동안 관련 연산을 모두 완료한다. 이렇게 하면 동일한 데이터를 메인 메모리에서 반복적으로 불러오는 비용을 제거할 수 있다.</p>
<p>*<em>데이터 레이아웃 최적화(Layout Optimization). *</em>연속으로 접근할 데이터를 메모리 상에서도 연속으로 배치한다. 예를 들어 행렬을 행 우선(row-major)으로 저장할지 열 우선(column-major)으로 저장할지에 따라 캐시 적중률(cache hit rate)이 크게 달라진다.</p>
<p><strong>연산 합치기(Operator Fusion).</strong> 여러 단계로 나뉜 연산(예: 행렬 곱셈 → 활성화 함수 → 정규화)을 하나의 커널로 합쳐서, 중간 결과를 메모리에 쓰고 다시 읽는 과정을 생략한다. TensorFlow Lite나 ONNX Runtime 같은 온디바이스 추론 프레임워크에서 기본적으로 적용하는 최적화 기법이다.</p>
<hr>
<p>앞으로 AI가 서버 중심에서 점점 사용자 기기로 확장되어 간다면, 온디바이스 AI는 그 중심에 자리 잡을 가능성이 크다. 적용 범위 또한 스마트폰에 머물지 않는다. 최근에는 로봇, 자율주행, 드론, 산업용 엣지 장비 등 피지컬 AI(Physical AI) 영역에서 온디바이스 추론의 중요성이 빠르게 커지고 있다. 이러한 시스템들은 실시간으로 주변 환경을 인식하고 즉각적으로 반응해야 하기 때문에, 클라우드를 거치지 않고 기기 내부에서 바로 판단을 내리는 능력이 필수적이다. 이러한 흐름 속에서 온디바이스 AI의 중요성은 앞으로 더욱 커질 것으로 보인다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] FSPEN: An Ultra-Lightweight Network for Real Time Speech Enhancement]]></title>
            <link>https://velog.io/@sujin-koo/Paper-Review-FSPEN-An-Ultra-Lightweight-Network-for-Real-Time-Speech-Enhancement</link>
            <guid>https://velog.io/@sujin-koo/Paper-Review-FSPEN-An-Ultra-Lightweight-Network-for-Real-Time-Speech-Enhancement</guid>
            <pubDate>Thu, 12 Mar 2026 06:01:33 GMT</pubDate>
            <description><![CDATA[<p>출처: <a href="https://research.samsung.com/blog/FSPEN-AN-ULTRA-LIGHTWEIGHT-NETWORK-FOR-REAL-TIME-SPEECH-ENAHNCMENT">https://research.samsung.com/blog/FSPEN-AN-ULTRA-LIGHTWEIGHT-NETWORK-FOR-REAL-TIME-SPEECH-ENAHNCMENT</a></p>
<hr>
<p>최근에 speech enhancement 분야를 보고 있는 중인데, 경량화된 모델의 크기나 퍼포먼스가 궁금해서 찾아보던 중 ICASSP 2024에서 발표된 해당 논문을 읽게 되었다. IEEE 접근이 불가능하여(ㅠㅠ) 삼리에서 작성된 글을 대신하여 읽었다.</p>
<hr>
<h3 id="1-speech-enhancement">1. Speech Enhancement</h3>
<p>speech enhancement 는 보통 음성에서 배경 잡음과 같은 원하지 않는 노이즈를 제거하여 깨끗한 소리를 만드는 task를 의미합니다. 노이즈가 섞여있으면 음성 인식률이 저하되는 등의 문제가 있기 때문에 보통 음성 자체의 품질을 미리 올려놓는 전처리 작업에 많이 활용 됩니다.</p>
<p>이 논문 같은 경우에는 실시간으로 음성 향상 작업을 하기 위해서 경량화된 모델을 만드는 것을 목표로 하였습니다.</p>
<hr>
<h3 id="2-fspen">2. FSPEN</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/a61097c3-27da-487d-9286-0518b2cb1ca0/image.png" alt=""></p>
<p>논문의 주된 방법론은, full band 와 sub band 로 모델 구조를 나눠서 global, local features 를 추출하였고, inter-frame path extension 으로 성능을 높였다고 하네요.</p>
<p>좀 더 자세하게 살펴보자면, 그림에서 보시다시피 모델은 크게 다음의 세 파트로 나뉘어 있습니다.</p>
<ul>
<li>full-band and sub-band encoder</li>
<li>Dual Path enhancer with path Extension (DPE)</li>
<li>full-band and sub-band decoder</li>
</ul>
<p>우선, encoder 에서는 3-layer CNN으로 이루어져 spectrum 의 feature 를 뽑아냅니다.  1x1 convolution 으로 global feature 를 얻을 수 있지만 local 정보들이 흐리게 나타나는 문제가 발생할 수 있습니다. 이를 해결하기 위해서 1-layer CNN을 sub band encoder 로 활용하여 spectrum 을 처리하는데, k개의 frequency bin이 m개의 sub band 로 나눠지고 m개의 sub band 가 다시 또 N 그룹으로 나누어지는 구조입니다. </p>
<p>어렵게 생각할 필요 없이, global feature 는 말 그대로 spectrum 전체를 가지고 처리하여 정보를 뽑고, local feature 는 spectrum 을 주파수 영역을 나눠 (frequency bin 구역들을 나눠) 각각 CNN으로 처리하고 concat 하여 더 세부적인 local feature 를 처리했다고 보시면 됩니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/e41437da-eda1-48ca-a564-ff6787e1764f/image.png" alt=""></p>
<p>중간에 DPE 같은 경우에는, 일반적인 dual path network는 1개의 GRU 가 causal inter-frame 모델링에 자용되고 1개의 BiGRU가 intra-frame 모델링에 사용됩니다. 이 때, 이러한 dual-path network 에 대해서 부가적으로 설명드리자면, Speech enhancement 모델에서 입력은 보통 time × frequency feature map 형태입니다. 그래서 이런 음성 특성을 반영하여 <strong>같은 frame 안에서 frequency 관계 학습하고자 intra-frame modeling을 하고, 시간 방향으로 frame 간 관계 학습하고자 inter-frame modeling을 하는 구조가 Dual-Path Networ</strong>k입니다.</p>
<p>하지만 저자들은 이러한 구조를 개선한 방법론을 제시합니다. 이는 모든 feature를 하나의 GRU로 처리하는 것이 아니라 <strong>그룹으로 나누어 각 그룹에 GRU를 적용</strong>하는 것입니다. </p>
<p>이렇게 하게 되면 당연히 필요한 GRU의 수가 많아지지만 feature dimension 이 줄어들기 때문에 capacity는 높이면서(더 복잡한 speech pattern이 학습 가능해져 성능이 높아지면서) complexity는 유지(모델의 계산 비용은 유지; MACs 유지)할 수 있습니다. 모델 사이즈가 path extension 적용 후 39k에서 79k로 커졌지만 complexity는 89M MACs(모델이 한 번 추론(inference)할 때 필요한 연산량) 라고 합니다. </p>
<p>마지막으로 디코더의 경우에는 full band 디코더는 skip connection으로 full-band encoder랑 연결되어 있고, 3-layer deconvolution이 적용되어 spectrum을 얻고, 추가적인 complexity를 줄이고자 feature의 채널수는 반으로 줄인다고 합니다. sub-band 디코더도 비슷한 구조이지만 FC 레이어를 사용했습니다.</p>
<hr>
<h3 id="실험-및-결과">실험 및 결과</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/4faadae8-daae-4cc3-9d78-71d480a3bea3/image.png" alt=""></p>
<p>디바이스에 적합하게 작은 파라미터와 연산량 가지고 우수한 PESQ, STOI 성능을 보여줍니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/7785adcf-125d-480f-8c24-fb175a62113c/image.png" alt=""></p>
<p>ablation 에서는 DRCRN으로 베이스라인으로 시작하여
DPE와 sub band 모두 각각 성능이 올라가는 것을 볼 수 있으며
GRU 그룹수는 8에서 가장 성능이 좋고 그 이후로는 큰 차이가 없음을 알 수 있습니다.</p>
<hr>
<p>FSPEN 같은 경우에는 워낙 모델의 사이즈와 연산량이 작다보니 실시간 처리와 온디바이스에 적합한 모델입니다. 음성 연구를 하다보면 전체 정보를 그룹으로 나누어 처리하는 아이디어를 많이 적용하곤 하는데, 이 연구에서는 음성의 feature를 여러 그룹으로 나누어 성능을 높인 연구였습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[진폭 변조 스펙트럼 분석]]></title>
            <link>https://velog.io/@sujin-koo/%EC%A7%84%ED%8F%AD-%EB%B3%80%EC%A1%B0-%EC%8A%A4%ED%8E%99%ED%8A%B8%EB%9F%BC-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@sujin-koo/%EC%A7%84%ED%8F%AD-%EB%B3%80%EC%A1%B0-%EC%8A%A4%ED%8E%99%ED%8A%B8%EB%9F%BC-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Sun, 08 Mar 2026 13:55:37 GMT</pubDate>
            <description><![CDATA[<p>출처: <a href="https://www.youtube.com/watch?v=7g1BCQk226A">https://www.youtube.com/watch?v=7g1BCQk226A</a></p>
<hr>
<p>우리가 일상에서 듣는 음성은 단순히 소리의 높낮이나 크기만으로 이루어져 있지 않다. 사람의 말소리에는 언어적 정보(무슨 말을 하는지)뿐 아니라 비언어적 정보(감정, 건강 상태, 환경 등)까지 담겨 있다. 이러한 다양한 정보를 더 깊이 이해하기 위해 연구자들은 오랫동안 음성 신호의 구조를 분석해 왔다. 그중 하나가 바로 <strong>진폭 변조 스펙트럼 분석(Amplitude Modulation Spectral Analysis)</strong>이다.</p>
<hr>
<p>사람의 음성을 자세히 살펴보면, 소리의 세부적인 진동 위에 <strong>천천히 변하는 큰 흐름</strong>이 존재한다. 이를 <strong>엔벨로프(envelope)</strong>라고 부른다.</p>
<p>1930년대 연구자 <strong>Homer Dudley</strong>는 이 느린 변화를 통해서도 음성을 어느 정도 이해할 수 있다는 사실을 보여주었다. 이후 연구들은 다음과 같은 중요한 사실을 발견했다.</p>
<ul>
<li><strong>16Hz 이하의 느린 변조</strong>가 음성 이해에 매우 중요하다. (그래서 보통 speech 에 집중한 연구들은 16k waveform 을 많이 사용하며, 이 외의 여러 소리를 다루는 audio, sound 연구들을 48k waveform 을 많이 사용한다.)</li>
<li>특히 <strong>2–16Hz 범위</strong>가 언어 이해에 핵심적인 영역이다.</li>
<li>약 <strong>4Hz</strong>는 말의 <strong>음절(syllable) 리듬</strong>과 관련된 중요한 주파수이다.</li>
</ul>
<p>즉, 우리가 말을 들을 때 실제로 중요한 것은 단순한 음파가 아니라 <strong>시간에 따라 어떻게 천천히 변화하는지</strong>라는 패턴이다.</p>
<hr>
<h2 id="진폭-변조-스펙트럼">진폭 변조 스펙트럼</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/0a8c6b07-c82f-4d19-bc2f-a3ec5c136881/image.png" alt=""></p>
<p>진폭 변조 스펙트럼은 쉽게 말해 다음 질문에 답하는 도구다.</p>
<blockquote>
<p>“각 주파수 성분이 시간에 따라 <strong>얼마나 빠르게 변하는가?</strong>”</p>
</blockquote>
<p>이를 이해하기 위해 보통 다음과 같은 과정을 거친다.</p>
<ol>
<li><p>먼저 음성을 <strong>스펙트로그램(spectrogram)</strong>으로 변환한다.
→ 시간과 주파수에 따른 소리의 에너지를 나타낸다.</p>
</li>
<li><p>이후 각 주파수 대역에서 <strong>시간 방향으로 또 한 번 분석</strong>을 한다.</p>
</li>
<li><p>그러면 각 주파수 성분이 <strong>얼마나 빠르게 또는 느리게 변하는지</strong>를 나타내는 <strong>변조 스펙트럼</strong>을 얻을 수 있다.</p>
</li>
</ol>
<p>연구에 따르면 <strong>깨끗한 음성의 대부분의 에너지는 1~16Hz 범위의 변조에 존재한다.</strong> 이 분석 방법은 신호 처리를 통해 <strong>노이즈 제거 후 다시 음성을 복원하는 것도 가능</strong>하다는 장점이 있다.</p>
<hr>
<p>또 다른 접근법은 <strong>사람의 청각 시스템을 모방하는 방식</strong>이다.</p>
<p>이 방법은 다음과 같은 구조를 가진다.</p>
<ol>
<li><strong>코클리아(달팽이관) 모델</strong>을 사용해 음성을 여러 주파수 대역으로 분해한다.</li>
<li>각 대역에서 <strong>엔벨로프(진폭 변화)</strong>를 추출한다.</li>
<li>이후 <strong>변조 필터 뱅크</strong>를 적용해 변조 패턴을 분석한다.</li>
</ol>
<p>이 과정을 거치면 <strong>23 × 8 형태의 특징 표현(feature representation)</strong>이 만들어진다.</p>
<p>이 표현을 보면 놀라운 사실을 확인할 수 있다.</p>
<ul>
<li><p><strong>깨끗한 음성</strong>
→ 대부분의 에너지가 <strong>16Hz 이하</strong>, 특히 <strong>4Hz 근처</strong>에 집중됨</p>
</li>
<li><p><strong>환경 영향(예: 잔향)</strong>
→ 다른 변조 대역에서 특징적으로 나타남</p>
</li>
</ul>
<p>즉, <strong>음성과 환경을 분리해서 분석할 수 있다</strong>는 것이다.</p>
<hr>
<p>진폭 변조 스펙트럼 분석은 단순히 음성을 이해하는 도구에 그치지 않는다. 다양한 분야에서 응용되고 있다.</p>
<h3 id="1-음성-품질-평가">1. 음성 품질 평가</h3>
<p>변조 스펙트럼에서 특정 에너지 비율을 계산하면
<strong>참조 음성 없이도 음성 품질을 예측</strong>할 수 있다.</p>
<p>예를 들어</p>
<ul>
<li><strong>Speech to Reverberation Modulation Energy Ratio</strong></li>
</ul>
<p>같은 지표를 사용하면 음성의 <strong>명료도와 품질</strong>을 추정할 수 있다.</p>
<h3 id="2-환경-분석">2. 환경 분석</h3>
<p>변조 스펙트럼은 <strong>실내 음향 환경</strong>을 분석하는 데에도 사용된다.</p>
<p>예를 들어 다음과 같은 정보를 추정할 수 있다.</p>
<ul>
<li>잔향 시간 (Reverberation time)</li>
<li>직접음 대비 반사음 비율 (Direct-to-Reverb Ratio)</li>
</ul>
<p>즉, 음성만으로도 <strong>공간의 특성</strong>을 추정할 수 있다.</p>
<h3 id="3-감정-및-건강-상태-분석">3. 감정 및 건강 상태 분석</h3>
<p>흥미롭게도 감정이나 질병 역시 변조 패턴에 영향을 준다.</p>
<p>예를 들어 연구에서는</p>
<ul>
<li>감정이 담긴 음성</li>
<li>병리적 음성 (예: COVID 관련 음성 변화)</li>
</ul>
<p>이 서로 다른 <strong>변조 스펙트럼 패턴</strong>을 보인다는 것을 발견했다.</p>
<h3 id="4-생태학-연구">4. 생태학 연구</h3>
<p>이 방법은 인간 음성뿐 아니라 <strong>동물 신호</strong>에도 적용된다.</p>
<p>예를 들어 벌집의 소리를 분석하면</p>
<ul>
<li>비 오는 소리</li>
<li>기생충 감염</li>
<li>벌들의 활동 상태</li>
</ul>
<p>등을 구분할 수 있다.</p>
<hr>
<h2 id="최신-연구-ai와의-결합">최신 연구: AI와의 결합</h2>
<p>최근에는 이 분석 방법을 <strong>딥러닝 및 음성 파운데이션 모델</strong>과 결합하려는 연구가 활발하다.</p>
<h3 id="1-modulation-tensor">1. Modulation Tensor</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/41047914-13d4-4223-a613-ca83ea1837d9/image.png" alt=""></p>
<p>기존의 변조 분석을 확장해 <strong>3차원 텐서 형태</strong>로 표현하면
시간에 따른 변화를 더 잘 추적할 수 있다.</p>
<h3 id="2-화자-인식">2. 화자 인식</h3>
<p>변조 특징을 사용하면 <strong>잔향 환경에 덜 민감한 화자 인식 모델</strong>을 만들 수 있다.</p>
<h3 id="3-파운데이션-모델과-결합">3. 파운데이션 모델과 결합</h3>
<p>예를 들어 다음과 같은 모델들과 결합할 수 있다.</p>
<ul>
<li>Wav2Vec</li>
<li>기타 self-supervised speech model</li>
</ul>
<p>이때 변조 특징은 다음과 같은 장점을 가진다.</p>
<ul>
<li><strong>자연 음성과 합성 음성 구분</strong></li>
<li><strong>화자 정보 제거 (privacy preservation)</strong></li>
</ul>
<h3 id="4-딥페이크-음성-탐지">4. 딥페이크 음성 탐지</h3>
<p>합성 음성은 종종 <strong>자연적인 공간 정보나 변조 패턴이 부족</strong>하다.
따라서 변조 스펙트럼 공간에서 <strong>합성 방식마다 다른 흔적</strong>이 나타난다.</p>
<p>이 특성을 이용해 <strong>딥페이크 탐지</strong> 연구도 진행되고 있다.</p>
<h3 id="5-경량-ai-모델">5. 경량 AI 모델</h3>
<p>엣지 디바이스(예: IoT 센서)에서는 작은 모델이 필요하다.
이때 <strong>변조 정보</strong>를 <strong>지식 증류(Knowledge Distillation)</strong> 과정에 활용하면</p>
<ul>
<li>더 작은 모델</li>
<li>더 높은 정확도</li>
</ul>
<p>를 동시에 얻을 수 있다.</p>
<hr>
<p>생물학적 신호는 스펙트럼이 매우 빠르게 변화하기 어렵다는 특성을 갖는다. 반면 합성 신호나 잡음은 이러한 제약이 상대적으로 적다. 이러한 차이 때문에 변조 분석을 통해 자연 신호와 인공 신호를 구별할 수 있으며, 이 원리는 다양한 분야에서 활용되고 있다. 예를 들어 음성 AI, 의료 음성 분석, 딥페이크 탐지, 생태학 신호 분석 등에서 이러한 접근이 사용되고 있다.</p>
<p>진폭 변조 스펙트럼 분석은 오래된 신호 처리 기술처럼 보일 수도 있다. 실제로 최근 음성 연구에서는 mel spectrogram을 제외하면 널리 사용되는 다른 특징 표현을 접하기는 쉽지 않다.하지만 이러한 고전적인 신호 처리 개념들이 여전히 유용한 정보를 담고 있다는 점도 점차 다시 주목받고 있다. 최근에는 self-supervised speech representation이나 파운데이션 모델에서 추출된 특징을 변조 관점에서 분석하거나 보완적으로 활용하려는 시도들도 등장하고 있다.이러한 모습들은 음성 신호의 구조를 더 깊이 이해하고, 합성 음성 탐지나 음성 품질 분석과 같은 문제에서 새로운 가능성을 보여주고 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Accent · Prosody · Emotion · Duration 정리]]></title>
            <link>https://velog.io/@sujin-koo/Accent-Prosody-Emotion-Duration-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@sujin-koo/Accent-Prosody-Emotion-Duration-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 01 Mar 2026 14:50:18 GMT</pubDate>
            <description><![CDATA[<p>예전에 읽었던(2024년도) VC/TTS에서의 Accent / Prosody / Emotion / Duration modeling을 정리하고자 한다.
정리가 덜 돼서 뒤죽박죽...</p>
<hr>
<h2 id="feature를-어떻게-정의하고-모델링할-것인가">Feature를 어떻게 정의하고 모델링할 것인가?</h2>
<p>우선 가장 근본적으로 f0, duration, energy, prosody 등을
어떻게 정의하고, 어떻게 모델링할 것인가?
단순히 predictor를 붙이는 것이 아니라,</p>
<ul>
<li>feature 자체를 정제해서 GT로 사용할 것인지</li>
<li>latent space에서 disentangle해서 사용할 것인지</li>
<li>diffusion/flow 기반 generator에서 implicit하게 학습할 것인지
이 선택에 따라 모델 구조가 완전히 달라진다.</li>
</ul>
<hr>
<h3 id="duration-관련해서">duration 관련해서...</h3>
<h4 id="1-durflex-evc--stylebook-결합-가능성">1) DurFlex-EVC + Stylebook 결합 가능성</h4>
<ul>
<li>stylebook(<a href="https://arxiv.org/abs/2309.02730">https://arxiv.org/abs/2309.02730</a>) + DurFlex-EVC</li>
</ul>
<p>DurFlex-EVC에서는 duration modeling을 위해 cross-attention을 사용한다.
하지만 key, query, value를 target speaker에서 직접 받아오지는 않는다.</p>
<blockquote>
<p>Stylebook의 Dual Attention 구조에서 나온 key, value를
duration attention에 활용할 수 없을까?</p>
</blockquote>
<ul>
<li>Stylebook: content-dependent speaking style modeling</li>
<li>DurFlex-EVC: duration-flexible emotional VC
만약 Stylebook에서 style-aware key/value를 만든 뒤
이를 duration modeling에 활용한다면,
→ 단순 alignment가 아니라
→ style-dependent duration modeling이 가능하지 않을까?</li>
</ul>
<h4 id="2-multi-scale-duration-modeling">2) Multi-scale duration modeling</h4>
<p>duration은 단일 스케일로 보기 어렵다.</p>
<ul>
<li>utterance-level rhythm</li>
<li>word-level timing</li>
<li>phoneme-level duration</li>
<li>frame-level alignment
Multi-scale 구조를 두고,</li>
<li>coarse rhythm은 global embedding으로</li>
<li>fine duration은 diffusion 기반 predictor로
나누어 modeling하는 구조도 가능해 보인다</li>
</ul>
<h4 id="3-voice-conversion에서-semantic-정보-활용-가능할까">3) Voice Conversion에서 Semantic 정보 활용 가능할까?</h4>
<p>TTS는 text가 있으니 semantic 정보를 쉽게 활용할 수 있다.
하지만 VC는 text가 없다.</p>
<p>그렇다면:</p>
<ul>
<li>ASR 기반 PPG</li>
<li>wav2vec2 one-hot text prediction</li>
<li>Sentence-BERT embedding
같은 semantic proxy를 활용할 수 있을까?</li>
</ul>
<p>특히 emphasis modeling에서는
semantic importance가 중요하기 때문에,
VC에서도 semantic-aware prosody modeling이 가능하지 않을까?</p>
<h4 id="4-문장-내-emphasis는-어떻게-결정되는가">4) 문장 내 Emphasis는 어떻게 결정되는가?</h4>
<p>우리가 문장을 읽을 때:</p>
<ul>
<li>중요한 단어는 강세를 두고</li>
<li>덜 중요한 단어는 빠르게 약하게 발음한다
이를 모델링하려면?</li>
<li>attention 기반 weighting</li>
<li>Sentence-BERT + multi-head attention</li>
<li>HyperSum 같은 importance estimation 모델
semantic importance → prosody modulation
이라는 경로를 만들 수 있을 것 같다.</li>
</ul>
<h4 id="5-accent-discriminator-확장-가능성">5) Accent Discriminator 확장 가능성</h4>
<p>Voice-Preserving Zero-Shot Multiple Accent Conversion에서는
accent discriminator가 native vs foreign을 구분한다.
그렇다면,</p>
<blockquote>
<p>source vs target style discriminator가 있다면
학습 안정성이나 disentanglement에 도움이 될까?</p>
</blockquote>
<p>Domain adversarial training 구조로 확장 가능해 보인다.</p>
<h3 id="6-diffusion-based-duration-predictor에-reference-condition-주기">6) Diffusion-based Duration Predictor에 Reference Condition 주기</h3>
<p>diffusion duration predictor를 만들 경우,</p>
<ul>
<li>target reference의 rhythm</li>
<li>speaking rate</li>
<li>emotional tempo
를 condition으로 넣으려면 어떻게 설계해야 할까?
가능한 방법:</li>
<li>conditional noise schedule</li>
<li>cross-attention conditioning</li>
<li>global rhythm embedding injection</li>
</ul>
<h1 id="accent">Accent</h1>
<h3 id="accent-tts">Accent-TTS</h3>
<p>pronounciation input으로 G2P 사용</p>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2312.16850">Accent-VITS: accent transfer for end-to-end TTS</a>(National Conference on Man-Machine Speech Communication, NCMMSC 2023)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/b443ccf5-926c-4a74-ad2d-46544ba86f9e/image.png" alt=""></p>
<ul>
<li>해결해고자한 부분 : accent(phoneme pronunciation pattern and prosody variations) 을 반영하고자 함</li>
<li>method : hierarchical CVAE structure to model accent pronunciation information and acoustic features, respectively, using bottleneck features and mel spectrums as constraints.
Moreover, the text-to-wave mapping in VITS is decomposed into textto-accent and accent-to-wave mappings in Accent-VITS. 
LR은 일반적 Fastspeech, 하지만 phoneme 단위로 duration predict
발음 인코더 모듈은 첫 번째 CVAE 구조의 사전 정규화 항에 사용되는 사전 분포를 예측
phoneme은 G2P 사용</li>
</ul>
<hr>
<h3 id="accent-vc">Accent-VC</h3>
<p>ppg를 input으로 사용</p>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2211.13282">Voice-Preserving Zero-Shot Multiple Accent Conversion</a> (ICASSP 2023)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/b65fb5c2-b6fc-4b42-98fc-0d8d32b2c9fa/image.png" alt=""></p>
<ul>
<li>method
one-hot text prediction(wav2vec2)
pronunciation 에 acoustic feature를 더하고 나면 native or foreign 으로 label 되어 있는 accent discriminator 사용</li>
</ul>
<hr>
<h1 id="prosody">Prosody</h1>
<h3 id="prosody---tts">Prosody - TTS</h3>
<p>*<em>논문제목 : <a href="https://arxiv.org/abs/2306.04301">IST-TTS: Interpretable Style Transfer for Text-to-Speech with ControlVAE and Diffusion Bridge</a>(interspeech 2023) *</em>
<img src="https://velog.velcdn.com/images/sujin-koo/post/4d5d5319-c069-4096-8b61-e1334188b1c9/image.png" alt=""></p>
<ul>
<li>해결해고자한 부분</li>
<li>method
(1) diffusion refiner, (2) diffusion bridge, and (3) ControlVAE.
reference encoder에서 style vector 뽑아냄
acoustic feature는 fastspeech base
mel만 reference encoder에 들어감
ParallelStyleTransfer / Non-ParallelStyleTransfer 나눠서 MOS 평가</li>
</ul>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2305.02269">M2-CTTS: End-to-End Multi-scale Multi-modal Conversational Text-to-Speech Synthesis</a>(ICASSP 2023)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/0f1821d6-b056-4118-b1d2-8562d4d6cdb0/image.png" alt=""></p>
<ul>
<li>method : diffusion based prosody predictor
1) local prosody를 잘 만들어내고자 함 : 보통 utterance(coarse-grained), phoneme(fine-grained) level로 embedding을 뽑고 여기에 speaker embedding을 뽑아서 사용함.
2) Sentence BERT에서 feature + attention : semantic information을 담고 있기 때문에 multi-head attention 을 통해 keyword, emphasis한 부분을 알아내고 이를 prosody modeling에 활용 (보통 우리가 문장을 읽을 때 중요한 부분에 강세를 두고, 필요하지 않은 부분은 빠르고 약하게 발음하는 것 등을 반영하고자 하는 것 같음)</li>
<li>-&gt; 사실 semantic 정보가 반영된 상황에서 word level 이 얼마나 도움될까 싶지만 시도해보는 것은 나쁘지 않을 것 같다.
3) acoustic / textual 정보를 사용함 : text에서도 utterance/phoneme feature 뽑아 사용하고, acoustic에서도 utterance/phoneme feature 뽑아 사용함.
4) flow, ddpm 등 최근 모델들을 써서 prosody predictor를 설계함 : 성능 향상, 다양한 prosody 생성에 도움이 된다고 함.</li>
</ul>
<hr>
<h3 id="prosody---vc">Prosody - VC</h3>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2309.01142">MSM-VC: High-Fidelity Source Style Transfer for Non-Parallel Voice Conversion by Multi-Scale Style Modeling</a>(ACM 2023)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/947aa184-6718-4e9b-8659-75c5fd6850b4/image.png" alt=""></p>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2309.02730">Stylebook: Content-Dependent Speaking Style Modeling for Any-to-Any Voice Conversion using Only Speech Data</a>(아카이브?)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/6fa35a5a-15c8-46bf-9ac6-124054c03dc8/image.png" alt=""></p>
<hr>
<h1 id="emotion">Emotion</h1>
<p>1) 얘도 local prosody를 잘 만들고자 함 : 보통 utterance/phoneme level로 나누어짐</p>
<h3 id="emotion---tts">Emotion - TTS</h3>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2401.08166">ED-TTS: Multi-Scale Emotion Modeling using Cross-Domain Emotion Diarization for Emotional Speech Synthesis</a>(ICASSP 2024)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/0cbfccea-608f-4a08-a558-449e098cfbe6/image.png" alt=""></p>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2305.13831">ZET-Speech: Zero-shot adaptive Emotion-controllable Text-to-Speech Synthesis with Diffusion and Style-based Models</a>(Interspeech 2023)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/9507dfb5-534b-484a-b622-b878e6021ea4/image.png" alt=""></p>
<ul>
<li>해결해고자한 부분 : zero shot Emotional TTS를 만들자</li>
<li>method : Domain adversarial training, guidance method
보통 스타일벡터에 감정 벡터를 더해서 디코더로 보냄 그러나 이러면 화자저보와 감정 정보가 모두 포함되어 있어서 DAT를 통해 reference의 감정 정보를 스타일 벡터에서 분리하고자 함(스타일 벡터가 특정 화자의 음성 스타일을 나타내면서도, 감정 정보는 포함하지 않도록 하는 것) - Emotion classifier의 Gradient Reversal Layer 방법 이용</li>
</ul>
<hr>
<h3 id="emotion---vc">Emotion - VC</h3>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2302.10536">Nonparallel Emotional Voice Conversion For Unseen Speaker-Emotion Pairs Using Dual Domain Adversarial Network &amp; Virtual Domain Pairing</a>(ICASSP 2023)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/f6da2883-4616-43a0-b56d-2bfc2e8e4066/image.png" alt=""></p>
<ul>
<li>method : (baseline: gradTTS)
EmoDiff는 classifier guidance &lt;-- rhythm을 guidance 할 때 응용할 수 있나?
&lt; Overall of ED-TTS &gt;
DDPM 기반의 multi-scale emotional TTS model로써 utterance-level SER(speech emotion recognition)과 frame-level SED(Speech emotion diarization)를 활용하여, emotion의 category와 variation/boundary를 각각 identify
SED model을 통해 frame-level fine-grained emotion label을 예측하여 TTS model training을 supervise</li>
</ul>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2401.08095">DurFlex-EVC: Duration-Flexible Emotional Voice Conversion with Parallel Generation</a>(아카이브)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/f92a9f1f-f76a-45d1-bf5f-dc87acda00d3/image.png" alt=""></p>
<ul>
<li>method : attention 사용
Development of a style autoencoder to enhance style control through decomposition and reassembly of styles. --&gt; MixLM으로 style 제거, CLM으로 style 추가 (emotion 없애고 emotion 추가한다는 의미)
Creation of a unit aligner to model unit durations and generate unit-level context vectors. --&gt; kqv 로 duration attention weight로 활용
1) A feature extractor that adeptly transforms raw audio waveforms into finely processed features.
2) A style autoencoder, facilitating the decomposition of content and style.
3) A unit aligner, responsible for context transformation and meticulous duration modeling.
4) A hierarchical stylization encoder, operating at both unit and frame levels for nuanced stylization.
5) A diffusion-based generator, engineered for the generation of high-quality Mel-spectrograms.
The unit aligner then aggregates contextual information at the frame level through a cross-attention module.
z = input vector to be normalized (hubert features 말하는건가?)
w=original style vector
tilda w = shuffled style vectores
r, b = adaptive parameters
s = speaker vectore (embedding lookup table)
e = emotion vector (embedding lookup table)
Q : output of the style autoencoder
K : learnable embeddings
V : learnable embeddings</li>
</ul>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2312.17508">Attention-based Interactive Disentangling Network for Instance-level Emotional Voice Conversion</a>(Interspeech 2023)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/a552f3fa-06b2-4617-bb67-ee7c781057a6/image.png" alt=""></p>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2403.01494">PAVITS: Exploring Prosody-Aware VITS for End-to-End Emotional Voice Conversion</a>(ICASSP2024)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/250a74df-f94b-4c89-b30c-f00eeaa48c40/image.png" alt=""></p>
<hr>
<h1 id="duration">Duration</h1>
<h3 id="duration---tts">Duration - TTS</h3>
<p>1) 크게 두 방식으로 나눠짐 : glowTTS의 MAS(GT=dynamic programming alignment) &amp; FastSpeech의 duration predictor + LR(GT=MFA) </p>
<p><strong>논문제목 : <a href="http://www.interspeech2020.org/uploadfile/pdf/Wed-1-3-8.pdf">DurIAN: Duration informed attention net work for speech</a> synthesis(Interspeech 2020)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/20efa063-a499-44a7-bd94-f0751ed7209e/image.png" alt=""></p>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2309.12792">DurIAN-E: Duration Informed Attention Network For Expressive Text-to-Speech Synthesis</a>(아카이브?)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/f45d9d7f-fe23-411d-8b53-cfc4ebdb89ef/image.png" alt=""></p>
<ul>
<li>method : AdaIN으로 Speaker에 따라 duration 조절
multi-speaker나 zero-shot으로 확장한건가?
1) the proposed DurIAN-E uti lizes multiple stacked SwishRNN-based Transformer blocks as linguistic encoders.
2) Style-Adaptive Instance Normaliza tion (SAIN) layers are exploited into frame-level encoders to improve the modeling ability of expressiveness.
3) A denoiser incorporating both denoising diffusion probabilistic model (DDPM) for mel-spectrograms and SAIN modules is con ducted to further improve the synthetic speech quality and expressiveness
At present, there are two main stream approaches to model the speaking style information: one uses pre-defined categorical style labels as the global control condition of TTS systems to denote different speak ing styles [5, 6] and the other imitates the speaking style given a reference speech [7, 8].
variance predictors -&gt; FastSpeech2 논문에서 가져옴 : phoneme-level duration, pitch, pitch range predictors가 있음, ground truth 값은 training 때 inputs으로 사용되고 variance predictor를 학습시키는데도 사용됨. inference 단계에서는 predictor에서 예측한 값 사용</li>
</ul>
<hr>
<h3 id="duration---vc">Duration - VC</h3>
<p>attention 사용</p>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2401.08095">DurFlex-EVC: Duration-Flexible Emotional Voice Conversion with Parallel Generation</a>(아카이브)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/b4ac7851-722e-44a1-831e-b0b0e415413a/image.png" alt=""></p>
<ul>
<li>해결해고자한 부분 : parallel 모델에서 duration control 하는 것</li>
<li>method : MixLN으로 style 제거, CLN으로 style 추가, kqv 로 duration attention weight로 활용</li>
</ul>
<p><strong>논문제목 : <a href="https://ieeexplore.ieee.org/document/9729483">Duration Controllable Voice Conversion via Phoneme-Based Information Bottleneck</a>(2022 ACM)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/72cb9421-9bab-4333-843e-3b28c07c43af/image.png" alt=""></p>
<p><strong>논문제목 : <a href="https://arxiv.org/abs/2306.10588">DuTa-VC: A Duration-aware Typical-to-atypical Voice Conversion Approach with Diffusion Probabilistic Model</a>(Interspeech 2023)</strong>
<img src="https://velog.velcdn.com/images/sujin-koo/post/940406b1-5c06-49f0-ac83-a4b80d6fec4d/image.png" alt=""></p>
<hr>
<p>+)
Urhythmic(rhythm modeling for voice conversion) 은 hubert feature에서 duration을 예측해서 hubert feature를 interpolation 해주는 방식으로 진행
AutoPST : “Global rhythm style transfer without text transcriptions,” in ICML, 2021.
UnsupSeg : “Investigation into target speaking rate adaptation for voice conversion,” in Interspeech, 2022.
DISSC : “Speaking style conversion with discrete self supervised units,” arXiv preprint arXiv:2212.09730, 2022</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] GLASS Flows]]></title>
            <link>https://velog.io/@sujin-koo/Paper-Review-GLASS-Flows-kz7d3w93</link>
            <guid>https://velog.io/@sujin-koo/Paper-Review-GLASS-Flows-kz7d3w93</guid>
            <pubDate>Sun, 22 Feb 2026 21:37:48 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>GLASS Flows: Transition Sampling for Alignment of Flow and Diffusion Models<br><a href="https://arxiv.org/abs/2509.25170">https://arxiv.org/abs/2509.25170</a></p>
</blockquote>
<p>생성 모델을 쓰다 보면, 학습이 끝난 뒤에도 결과물의 품질을 더 끌어올리고 싶은 순간이 온다. 추가 학습 없이 샘플링 단계에서 reward를 반영해 더 좋은 이미지를 뽑아내는 방법, 즉 test-time reward alignment이 그 해결책이 될 수 있다.</p>
<p>이전에 리뷰했던 SMC(Sequential Monte Carlo) 기반 방법이 대표적이다. Diffusion 모델이 이미지를 만들어가는 과정에서 여러 후보를 동시에 추적하고, reward가 높은 쪽에 가중치를 실어주며 점차 원하는 분포로 수렴시킨다. 매 단계에서 여러 갈래의 가능한 미래를 확률적으로 탐색할 수 있다는 게 핵심이다.</p>
<p>문제는 flow matching 기반 ODE 모델을 쓸 때다. Flow matching은 초기 노이즈에서 데이터까지의 경로를 ODE로 정의하기 때문에, 한번 출발하면 도착지가 하나로 정해진다. SMC가 작동하려면 지금 여기서 어디로 갈 수 있는지에 대한 확률적 답이 필요한데, ODE는 그 답이 언제나 하나뿐이다. SMC를 그대로 가져다 쓸 수가 없는 것이다.</p>
<p>GLASS Flows는 바로 이 문제를 해결한 논문이다.</p>
<hr>
<h2 id="background">Background</h2>
<p>배경을 좀 더 풀어보자.</p>
<p>생성 모델은 보통 학습 데이터의 분포 $p_{\text{data}}$에서 샘플을 뽑도록 훈련된다. 하지만 우리가 진짜 원하는 건 단순히 그럴듯한 이미지가 아니라, 특정 기준(reward)을 잘 만족하는 이미지다. 수식으로 쓰면 목표 분포는 이렇다:</p>
<p>$$p^r(z) \propto p_{\text{data}}(z) \cdot \exp(r(z))$$</p>
<p>데이터 분포에서 reward가 높은 영역을 더 강조한 형태다. 이 분포에서 직접 샘플링하기는 어렵고, 그래서 SMC나 search 같은 알고리즘이 등장한다.</p>
<p>이런 알고리즘들에는 공통적으로 transition kernel이 필요하다. 쉽게 말해, 지금 상태 $x_t$에서 다음 시점 $t&#39;$에 어디로 갈 수 있는지를 확률적으로 알려주는 일종의 지도다. SMC는 이 지도를 가지고 여러 후보를 동시에 펼친 다음, reward가 높은 쪽을 살린다. Search도 마찬가지다. 확률적 전이가 없으면 이 알고리즘들은 아예 돌아가지 않는다.</p>
<p>그런데 실전에서 배포되는 모델 대부분은 속도를 위해 ODE 샘플링을 쓴다. ODE는 빠르지만 확률적 전이가 없고, SDE는 확률적 전이가 있지만 느리다. Reward alignment를 적용하려면 느린 SDE로 돌아가야 하니, 성능을 높이자고 효율을 깎는 꼴이 된다.</p>
<hr>
<h2 id="ode의-확률성은-어디에-있는가">ODE의 확률성은 어디에 있는가</h2>
<p>GLASS의 아이디어를 이해하려면, 먼저 기존 ODE 기반 flow matching에서 확률성이 정확히 어디서 생기는지를 짚고 넘어갈 필요가 있다.</p>
<p>Flow matching은 가우시안 노이즈 $x_0$에서 출발해 깨끗한 데이터 $x_1$까지 ODE를 따라 흘러간다. 이때 확률성이 부여되는 순간은 딱 하나, 맨 처음 $x_0$를 가우시안 분포에서 랜덤하게 뽑는 그 지점뿐이다. 일단 $x_0$가 정해지고 나면, 이후 경로 $x_{0.1} \to x_{0.2} \to \cdots \to x_1$은 전부 결정론적으로 고정된다. 같은 $x_0$에서는 언제나 같은 $x_1$이 나온다.</p>
<p>그런데 reward alignment를 하려면 이야기가 달라진다. 우리가 원하는 건 $x_0$에서 $x_1$까지의 전체 경로를 한 번에 결정하는 게 아니라, 중간중간 개입해서 reward가 높은 방향으로 경로를 틀어주는 것이다. 예를 들어 $x_{0.2}$까지 왔을 때, 여기서 $x_{0.3}$으로 넘어가는 여러 후보를 만들고 reward를 기준으로 좋은 후보를 골라야 한다. 그러려면 $x_{0.2} \to x_{0.3}$ 구간에서도 확률적으로 여러 갈래가 존재해야 하는데, 기존 ODE에서는 $x_0$가 정해지면 $x_{0.2}$와 $x_{0.3}$도 하나로 고정되니 후보를 만들 수가 없다.</p>
<hr>
<h2 id="glass-flows">GLASS Flows</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/00aee929-95c4-49e6-89b7-67bc0711d128/image.png" alt=""></p>
<p>GLASS의 해법은 발상의 전환에 가깝다. $x_{0.2} \to x_{0.3}$ 같은 중간 구간의 전이를, 그 자체로 하나의 작은 flow matching 문제로 다시 세우는 것이다.</p>
<p>구체적으로 보자. $x_{0.2}$에서 $x_{0.3}$으로 보내고 싶다고 하자. GLASS는 이 구간을 위한 별도의 inner flow matching을 만든다. 이 inner flow에서는 $x_{0.2}$에 해당하는 새로운 시작점을 $\tilde{x}<em>0$로, $x</em>{0.3}$에 해당하는 도착점을 $\tilde{x}_1$로 놓는다. 그러면 이 작은 flow matching 안에서도 원래 flow matching과 똑같은 구조가 성립한다. $\tilde{x}_0$를 가우시안에서 랜덤하게 뽑는 순간 확률성이 생기고, 이후는 ODE를 따라 결정론적으로 $\tilde{x}_1$에 도착한다.</p>
<p>결국 원래 flow matching에서 확률성이 맨 처음 $x_0$ 샘플링에서만 생기는 것과 같은 원리를, 중간 구간에도 반복 적용하는 것이다. $x_{0.2} \to x_{0.3}$ 구간의 inner flow에서 초기 노이즈를 랜덤하게 뽑으면, 같은 $x_{0.2}$에서 출발하더라도 매번 다른 $x_{0.3}$에 도착할 수 있다. 이렇게 되면 중간 전이마다 여러 후보가 만들어지고, SMC가 작동할 수 있는 조건이 갖춰진다.</p>
<p>그리고 이 inner flow matching 모델을 처음부터 새로 학습할 필요가 없다. 통계학의 충분통계량(sufficient statistic) 개념을 활용한 변환을 거치면, 이미 훈련된 기존 flow matching 모델을 그대로 재활용할 수 있다. 이름의 GLASS가 Gaussian Latent Sufficient Statistic의 약자인 이유다.</p>
<p>한편, GLASS는 두 시점의 상태 $(X_t, X_{t&#39;})$를 하나의 결합 분포(joint distribution)로 먼저 정의하고, 여기서 조건부 분포 $p(x_{t&#39;} \mid x_t)$를 도출하는 방식을 취한다. 결합 분포가 각 시점의 marginal을 정확히 재현하도록 설계되어 있기 때문에, 전이를 아무리 확률적으로 만들어도 전체 분포 구조가 깨지지 않는다. 두 시점 간의 상관 정도를 조절하면, 거의 결정론적인 전이부터 강하게 확률적인 전이까지 연속적으로 조절할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/0029b1f5-32cd-4f67-9717-f7958735a253/image.png" alt=""></p>
<p>GLASS의 구조를 정리하면:</p>
<ol>
<li>기존 flow matching 모델에서 FM denoiser를 가져온다.</li>
<li>충분통계량 기반 변환을 통해 GLASS denoiser를 구성한다.</li>
<li>여기서 GLASS velocity field를 정의해 inner ODE를 만든다.</li>
<li>Inner ODE의 초기 조건을 랜덤 샘플링해서 확률적 전이를 수행한다.</li>
</ol>
<p>ODE의 계산 효율성은 유지하면서, 중간 전이마다 확률성을 부여하는 구조가 완성된다.</p>
<hr>
<p>Flow matching 모델에 test-time alignment을 적용하고 싶었지만 ODE의 결정론적 구조 때문에 막혀 있던 입장에서, GLASS는 꽤 직접적인 답을 주는 논문이었다. 이를 통해 ODE를 포기하지 않고도 확률적 전이를 만들 수 있고, 기존 모델을 재학습 없이 변환만으로 쓸 수 있다. </p>
]]></description>
        </item>
    </channel>
</rss>