<?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, 30 Aug 2026 14:36:27 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[[Paper Review] Emotional Paralinguistics를 활용한 Spoken Dialogue 연구 2편]]></title>
            <link>https://velog.io/@sujin-koo/Paper-Review-Emotional-Paralinguistics%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-Spoken-Dialogue-%EC%97%B0%EA%B5%AC-2%ED%8E%B8</link>
            <guid>https://velog.io/@sujin-koo/Paper-Review-Emotional-Paralinguistics%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-Spoken-Dialogue-%EC%97%B0%EA%B5%AC-2%ED%8E%B8</guid>
            <pubDate>Sun, 30 Aug 2026 14:36:27 GMT</pubDate>
            <description><![CDATA[<p>최근에는 감정, 억양, 말투와 같은 반언어적(paralinguistic) 정보를 대화 모델에 활용하는 연구들을 계속 살펴보고 있습니다. 이번 글에서는 그중 최근에 읽었던 두 편의 연구를 간단히 소개해보려고 합니다.</p>
<h3 id="1-exploring-emotional-nuances-in-spoken-dialogue">1. Exploring Emotional Nuances in Spoken Dialogue</h3>
<p><a href="https://aclanthology.org/2026.iwsds-1.9/">https://aclanthology.org/2026.iwsds-1.9/</a></p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/27d43258-f094-4591-81d5-b2014fc61d3b/image.png" alt=""></p>
<p><strong>IWSDS 2026</strong></p>
<p>첫 번째 논문은 <strong>같은 문장이라도 사용자의 음성 감정에 따라 적절한 응답이 달라질 수 있다</strong>는 점에 초점을 맞춘 연구입니다. (모델 연구라기보다는 데이터셋 + 벤치마크 + 전용 detector를 제안한 논문)</p>
<p>이를 위해 149개의 문장을 <strong>5개 감정 × 6명의 화자</strong>가 발화한 <strong>Paraling-Dial</strong> 데이터셋을 구축했고, 사용자 음성과 후보 응답 사이의 감정적 적절성을 <strong>Matched / Mismatched</strong>로 판별하는 <strong>Emotional Dialogue Breakdown Detection</strong> benchmark를 제안했습니다.</p>
<p>구체적으로는 <strong>utterance audio와 response sentence의 pair를 입력으로 받아 Matched / Mismatched를 예측하는 binary classification task</strong>로 정의되어 있습니다.</p>
<p><strong>Utterance Audio + Response Sentence → Matched / Mismatched</strong></p>
<p>기존 <strong>Qwen2-Audio가 이 task에서 약 50%로 거의 random 수준의 성능을 보였다</strong>고 말합니다.</p>
<p>저자들은 이를 해결하기 위해 <strong>감정을 text interpretation을 조절하는 control signal로 사용하는 FiLM 기반 detector</strong>를 제안했습니다.</p>
<p>즉, 먼저 사용자 음성에서 emotion을 추정하고, 그 emotion 정보를 이용해 text representation 자체를 조절한 뒤 Matched / Mismatched를 판단하는 방식입니다.</p>
<p>그 결과,</p>
<ul>
<li>Gold emotion label을 사용했을 때: <strong>93.8%</strong></li>
<li>Predicted emotion label을 사용했을 때: <strong>91.2%</strong></li>
</ul>
<p>의 성능을 보였다고 하네요.</p>
<hr>
<h3 id="2-joyai-talker">2. JoyAI-Talker</h3>
<p><strong>Full-Duplex Speech Interactive Large Model Built for Empathetic Voice Agents</strong></p>
<p><a href="https://arxiv.org/pdf/2608.01119">https://arxiv.org/pdf/2608.01119</a></p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/0920d1c4-ab0b-40c4-a1b3-376e210f2abf/image.png" alt=""></p>
<p>두 번째는 <strong>JoyAI-Talker</strong>라는 full-duplex 음성 대화 모델입니다.</p>
<p>이 모델은 full-duplex 음성 대화를 크게 <strong>언제 말할지, 무슨 말을 할지, 어떻게 말할지</strong>의 세 가지 역할로 나누어서 처리합니다.</p>
<ul>
<li><strong>Joy-Duplex - 언제 말할지:</strong> partial / complete / backchannel / accept / reject 상태를 판단하면서 turn-taking을 제어합니다.</li>
<li><strong>Thinker - 무슨 말을 할지:</strong> 사용자 음성의 감정과 대화 맥락을 이해하고, response text와 speaking instruction을 생성합니다.</li>
<li><strong>Talker - 어떻게 말할지:</strong> emotion, speaking rate, loudness, timbre뿐 아니라 sigh, laughter 같은 표현까지 조절하면서 실제 음성을 생성합니다.</li>
</ul>
<p>전체적인 흐름은 다음과 같습니다.</p>
<p><strong>User Speech → Joy-Duplex → Thinker → Talker</strong></p>
<p>이 모델은 <strong>사용자의 감정을 인식하는 데서 끝나는 것이 아니라, 그 정보를 답변의 내용(content)과 발화 스타일(style) 모두에 반영</strong>합니다.</p>
<p>예를 들어 사용자가 낙담한 상태라면 단순히 <code>sad</code> 같은 emotion label을 예측하는 데서 끝나는 것이 아니라, Thinker에서는 그 감정과 상황에 맞는 <strong>response content</strong>를 생성하고, Talker에서는 실제 음성의 emotion이나 speaking rate, loudness 등의 <strong>speaking style</strong>까지 그에 맞게 조절하는 식입니다.</p>
<p>이 때 Thinker가 반드시 명시적인 speaking instruction을 전달해야만 Talker가 적절한 스타일을 생성하는 것은 아닙니다. Talker 자체도 <strong>linguistic / semantic context를 기반으로 적절한 speaking style을 어느 정도 자체적으로 추론할 수 있도록</strong> 설계되어 있습니다.</p>
<p>학습 쪽의 경우 SFT 단계에서는 empathetic speech dialogue뿐 아니라 text SFT prompt를 자체 TTS로 음성화한 synthetic S2T 데이터도 활용하고, 이후 DPO에서는 SFT 모델이 생성한 여러 응답을 LLM judge와 rule-based judge로 평가해 preferred / rejected pair를 만들어 학습합니다.</p>
<p>또 emotion이나 말투의 다양성을 확보하기 위해 영화, TV, conversational media 등에서 expressive speech를 수집했다고 합니다. 여기에는 <strong>emotion, speaking rate, shouting / whispering, phonation, laughter / sigh</strong> 등의 다양한 paralinguistic 특성이 포함됩니다.</p>
<p>다만 아쉬운 점은 이러한 데이터가 <strong>구체적으로 몇 시간인지, 샘플 수가 얼마나 되는지, emotion별 distribution은 어떻게 되는지</strong> 등의 상세한 규모가 공개되어 있지 않다는 점입니다. 또한 영화나 TV 기반 expressive speech를 활용했다고 되어 있지만, 데이터의 구체적인 출처나 라이선스에 대한 설명도 논문에서는 확인하기 어려웠습니다. 추가적으로도 아마 latency 문제가 있을 것 같은데 관련 평가표는 없는 점이 아쉬웠습니다.</p>
<p>두 논문은 접근 방식은 다르지만, 공통적으로 <strong>음성 대화에서는 “무슨 말을 했는지”뿐 아니라 “어떻게 말했는지”까지 함께 고려해야 한다</strong>는 방향을 보여주는 연구들입니다.</p>
<p>최근 빅테크 기업들도 양방향(full-duplex) 소통이 가능한 음성 대화 모델을 잇달아 선보이고 있는 만큼, 다음에는 이러한 상용 모델들의 구조와 특징, 실제 대화 성능을 비교해보는 리뷰해봐야겠네요 ㅎㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[최근 AI 업계 채용 트렌드]]></title>
            <link>https://velog.io/@sujin-koo/%EC%B5%9C%EA%B7%BC-AI-%EC%97%85%EA%B3%84-%EC%B1%84%EC%9A%A9-%ED%8A%B8%EB%A0%8C%EB%93%9C</link>
            <guid>https://velog.io/@sujin-koo/%EC%B5%9C%EA%B7%BC-AI-%EC%97%85%EA%B3%84-%EC%B1%84%EC%9A%A9-%ED%8A%B8%EB%A0%8C%EB%93%9C</guid>
            <pubDate>Sun, 23 Aug 2026 13:48:48 GMT</pubDate>
            <description><![CDATA[<p>오늘은 이미 이런 흐름이 자리 잡은 지 꽤 오래되었지만, 오랜만에 여러 채용 공고를 살펴보면서 <strong>최근 AI Engineer, AI Research Engineer에게 어떤 역량이 요구되고 있는지</strong> 정리해보고자 한다.</p>
<p>최근 AI 관련 채용 공고들을 보면 공통적으로 보이는 흐름이 있다. 예전에는 모델을 직접 학습해봤는지, 논문을 써봤는지, benchmark에서 얼마나 높은 성능을 냈는지가 중요했다면, 요즘은 그보다 <strong>AI를 실제 업무에 어떻게 적용하고, 얼마나 안정적으로 동작하게 만들 수 있는가</strong>를 더 중요하게 보는 경우가 많아졌다.</p>
<p>즉, 단순히 연구나 모델 개발에서 끝나는 것이 아니라, <strong>실제 서비스와 업무에 적용하고 그 결과가 실질적인 기여로 이어지는 것</strong>까지 요구하는 방향으로 범위가 넓어지고 있다.</p>
<p>이를 정리하면, 개인적으로 최근 흐름은 크게 네 가지로 볼 수 있을 것 같다.</p>
<ul>
<li><strong>Model-centric → System-centric</strong></li>
<li><strong>LLM → Agent / Workflow Automation</strong></li>
<li><strong>General AI → AI + Domain Expertise</strong></li>
<li><strong>Model Performance → Evaluation / Reliability / Production</strong></li>
</ul>
<hr>
<h2 id="1-model-centric-→-system-centric">1. Model-centric → System-centric</h2>
<p>모델 학습 자체는 여전히 중요하다. 다만 최근에는 모델을 잘 학습시키는 것만으로 끝나지 않는 경우가 많다.</p>
<p>실제 서비스에 적용하려면 데이터를 만들고, 필요하면 fine-tuning이나 post-training을 하고, 제대로 동작하는지 평가하고, inference 속도와 비용을 조정하고, 실제 시스템에 연결해야 한다.</p>
<p>그래서 최근 AI Engineer나 Research Engineer 공고를 보면 모델 경험과 함께 software engineering, serving, infrastructure 경험까지 같이 요구하는 경우가 많다.</p>
<hr>
<h2 id="2-llm-→-agent--workflow-automation">2. LLM → Agent / Workflow Automation</h2>
<p>그리고 가장 핫한 흐름은 역시 Agent가 아닐까..</p>
<p>기존에는 LLM에 적절한 context를 제공하고 좋은 답변을 생성하는 것이 중요했다면, 지금은 LLM이 외부 tool과 상호작용하면서 <strong>실제 task를 수행하도록 만드는 방향</strong>으로 빠르게 이동하고 있다.</p>
<p>이에 따라 채용 공고에서도 단순한 LLM API 활용 경험을 넘어 <code>tool use</code>, <code>function calling</code>, <code>workflow orchestration</code>, <code>coding agent</code>, <code>RAG</code>, <code>memory</code>, <code>multi-agent</code> 같은 키워드가 자주 등장한다.</p>
<p>결국 중요한 것은 LLM이 좋은 답변을 생성하는 데서 끝나는 것이 아니라, <strong>여러 tool과 system을 활용해 실제 업무를 끝까지 수행할 수 있도록 만드는 것</strong>이다. 그래서 여러 도구와 기존 시스템을 연결해 실제 workflow를 자동화해본 경험도 점점 중요하게 평가되고 있다.</p>
<hr>
<h2 id="3-general-ai-→-ai--domain-expertise">3. General AI → AI + Domain Expertise</h2>
<p>AI 기술만큼 특정 도메인에 대한 이해도 중요해지고 있다.</p>
<p>예를 들어 반도체에서는 RTL, Verification, EDA를 이해해야 하고, Robotics에서는 perception이나 control, Speech에서는 audio와 conversation에 대한 이해가 필요하다.</p>
<p>그래서 최근에는 <code>AI + Semiconductor</code>, <code>AI + Robotics</code>, <code>AI + Healthcare</code>, <code>AI + Finance</code>, <code>AI + Speech</code>처럼 AI와 특정 전문 영역을 함께 가져가는 조합이 점점 더 중요해지는 것 같다.</p>
<hr>
<h2 id="4-model-performance-→-evaluation--reliability--production">4. Model Performance → Evaluation / Reliability / Production</h2>
<p>마지막으로 단순한 모델 성능보다 <strong>실제 환경에서 얼마나 안정적으로 동작하는지</strong>를 중요하게 보는 흐름이 강해지고 있다.</p>
<p>여담이지만, 작년에는 반농담처럼 <strong>AI 관련 직군 중 가장 늦게까지 남을 영역이 Evaluation일 것</strong>이라는 이야기도 들었다. 그만큼 지금처럼 복잡한 AI 시스템을 제대로 평가하는 일이 어렵고, 어떤 기준으로 평가하느냐에 따라 제품의 방향 자체가 달라질 수 있기 때문이다. 결국 Evaluation은 단순히 성능을 확인하는 작업이 아니라, <strong>무엇을 개선해야 하는지 결정하는 기준</strong>이 된다.</p>
<p>특히 Agent가 복잡해질수록 accuracy 하나만으로 시스템의 성능을 설명하기는 어렵다. 실제로는 task를 얼마나 잘 완료하는지, 어떤 상황에서 실패하는지, 사람이 얼마나 개입해야 하는지, latency와 비용은 어떤지, production 환경에서도 안정적으로 동작하는지를 함께 봐야 한다. 이 과정에서 Evaluation의 중요성이 더 커지고, Evaluation을 통해 failure case를 찾으면 다시 synthetic data를 만들거나 SFT, DPO, RL 같은 post-training을 통해 모델을 개선하게 된다. </p>
<hr>
<h2 id="실제-채용-공고를-보면">실제 채용 공고를 보면</h2>
<p>최근 NVIDIA 채용 공고 두 개를 보면 위에서 이야기한 흐름이 꽤 그대로 드러난다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/26f245c3-9b07-4024-97a2-f13dbae47216/image.png" alt="">
<img src="https://velog.velcdn.com/images/sujin-koo/post/bf38a7a4-2c9a-4c01-9778-e865b7453b4e/image.png" alt=""></p>
<p>먼저 ML and Agentic Systems Engineer 공고를 보면, 아예 역할 자체를 개별 모델 architecture를 만드는 것이 아니라 모델 개발을 더 빠르고 자동화하기 위한 agent, tooling, pipeline, feedback loop를 만드는 일이라고 설명한다.
공고에서도 data generation과 curation, evaluation, debugging, training orchestration, multimodal ML pipeline, deployment까지 ML lifecycle 전반을 다루고 있다. Agent가 코드와 데이터, 실험, evaluation을 직접 다루면서 연구자와 개발자의 생산성을 높이는 시스템을 만드는 역할이다.</p>
<p>특히 다음 문장이 이 포지션의 방향을 잘 보여준다.
“Rather than focusing on inventing individual model architectures, you will build the systems that help models and teams improve continuously.”
개별 모델을 새로 만드는 것보다 모델과 팀이 계속 개선될 수 있도록 만드는 시스템 자체에 초점이 있다는 것이다. 자격 요건에서도 “machine learning systems and software platforms, not only models”라고 명시하고 있고, Python/PyTorch뿐 아니라 system design, testing, packaging, debugging, workflow automation 같은 software engineering 역량을 강하게 요구한다.</p>
<p>또 다른 Applied Research Engineer, Chip Design공고도 비슷하다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/0b05ada9-9924-4c6e-82a8-b4e1dec1fa8f/image.png" alt=""></p>
<p>이를 보면 LLM, coding agent, RL/RLHF, post-training, evaluation, grader, synthetic data, production ML system까지 한 포지션 안에서 꽤 다양한 경험을 요구하고 있다. 여기에 front-end ASIC에 대한 도메인 지식과 Docker, Slurm, CI/CD 같은 인프라 경험도 포함된다.
또 “Your success is measured by how much faster the ASIC teams move, not by research output alone.”이라고 명시하고 있는데, 연구 결과 자체보다 AI를 실제 업무에 적용했을 때 팀의 업무 효율을 얼마나 높였는지를 중요하게 본다는 의미다. 결국 모델의 성능을 높이는 데서 끝나는 것이 아니라, 실제 workflow에 적용했을 때 얼마나 유용한지와 그 효과를 어떻게 평가할 수 있는지까지 요구하고 있다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/16ffe945-b0b1-4b38-bf46-b6deb20acd82/image.png" alt=""></p>
<p>Apple의 Multimodal AI Researcher 공고도 비슷한 흐름을 보여준다. Researcher 포지션이지만 연구 결과에서 끝나는 것이 아니라, state-of-the-art 연구를 실제 product까지 가져가는 것을 역할로 명시하고 있다. 실제 기능으로 연결하기 위한 validation strategy와 KPI, software engineering 역량도 함께 요구한다.
결국 세 공고의 성격은 조금씩 다르지만 방향은 비슷하다. 모델 자체를 연구하거나 성능을 높이는 것에서 끝나는 것이 아니라, Agent와 system을 만들고, 특정 domain에 적용하고, 제대로 평가한 뒤 실제 product나 업무의 변화까지 연결하는 것을 요구하고 있다.</p>
<hr>
<p>관심이 있든 없든 채용 트렌드는 계속 한 번씩 찾아보게 되는 것 같다. 지금 당장 지원할 계획이 없더라도 업계가 어떤 방향으로 움직이고 있는지 보는 데는 도움이 되는 것 같다.</p>
<p>이런 공고들을 보다 보니 연구 자체도 좋지만, 결국에는 실제 매출 증가든 비용 절감이든 업무 효율 향상이든 실질적인 도움이 되는 서비스를 만들고 싶다는 생각이 더 강하게 든다.</p>
<p>아무튼 모두 화이팅...!</p>
<p>+) 실제 현업에서는 이런 업무 효율 향상을 어떻게 정량적으로 평가하고 있는지 궁금하다 🤔</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Reinforcement Learning Conference (RLC) 2026: pre-RLC 참여 후기]]></title>
            <link>https://velog.io/@sujin-koo/Reinforcement-Learning-Conference-RLC-2026-pre-RLC-%EC%B0%B8%EC%97%AC-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@sujin-koo/Reinforcement-Learning-Conference-RLC-2026-pre-RLC-%EC%B0%B8%EC%97%AC-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Sun, 16 Aug 2026 14:46:26 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/sujin-koo/post/3a169084-cc6f-4550-a938-8bd7b9223219/image.png" alt=""></p>
<p><a href="https://rl-conference.cc">Reinforcement Learning Conference(RLC)</a>가 어제부터 시작되었습니다.</p>
<p>올해 RLC 2026은 캐나다 몬트리올의 Université de Montréal에서 열리는데요. 오늘은 어제 진행된 <strong>pre-RLC workshop</strong>에 참여한 후기를 간단하게 공유드리고자 합니다.</p>
<h2 id="reinforcement-learning-conferencerlc란">Reinforcement Learning Conference(RLC)란?</h2>
<p>먼저 RLC가 어떤 컨퍼런스인지 간단하게 소개해보겠습니다.</p>
<p>RLC는 이름 그대로 <strong>Reinforcement Learning(RL), 즉 강화학습에 집중하는 학회</strong>입니다.</p>
<p>NeurIPS, ICML, ICLR과 같은 대규모 머신러닝 학회에서도 강화학습 연구가 활발하게 발표되고 있지만, 워낙 다양한 머신러닝 분야를 함께 다루다 보니 강화학습 연구자들이 하나의 주제를 중심으로 깊이 있게 이야기할 수 있는 자리는 상대적으로 제한적입니다.</p>
<p>RLC는 이러한 배경에서 <strong>강화학습 연구자들이 보다 집중된 환경에서 서로의 연구를 공유하고 논의할 수 있는 장</strong>을 만드는 것을 목표로 하고 있습니다. 올해로 세 번째 개최되는 비교적 젊은 학회이지만, RL이라는 하나의 분야에 집중한다는 점에서 개인적으로도 무척 궁금했던 컨퍼런스였습니다.</p>
<p>그리고 본격적인 RLC가 시작되기 하루 전, 몬트리올에 먼저 모인 RL 연구자들을 위한 작은(?) 사전 행사가 하나 열렸습니다.</p>
<h2 id="pre-rlc">Pre-RLC</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/0a53b6cb-6423-4423-a721-e6e3781a7a32/image.png" alt=""></p>
<p>RLC 참석을 위해 몬트리올을 방문한 연구자들과 로컬 연구자들이 모여 하루 동안 RLC를 위해 몬트리올을 찾은 연구자들과 로컬 연구자들이 모여 robotics, world models, agent memory, scalable reinforcement learning 등 다양한 주제의 발표와 이야기를 나누는 자리였습니다.</p>
<p>발표들을 들으면서 느낀 점은, 세부적인 연구 주제는 모두 달랐지만 결국에는</p>
<blockquote>
<p><strong>“Agent가 복잡한 실제 환경에서 어떻게 학습하고, 기억하고, 적응하며, 더 나은 의사결정을 할 수 있을까?”</strong></p>
</blockquote>
<p>라는 질문으로 연결된다는 점이었습니다.</p>
<h2 id="hierarchy를-어떻게-학습할-수-있을까">Hierarchy를 어떻게 학습할 수 있을까?</h2>
<h3 id="switching-successor-measures-for-hierarchical-zero-shot-reinforcement-learning">Switching Successor Measures for Hierarchical Zero-shot Reinforcement Learning</h3>
<p>첫 번째로 기억에 남았던 주제는 <strong>hierarchical reinforcement learning</strong>과 successor representation을 연결한 연구였습니다.</p>
<p>긴 horizon의 task에서는 agent가 매 step의 action을 직접 결정하는 것보다,</p>
<p><strong>“먼저 어디로 가야 하지?” → “그곳에는 어떻게 가지?”</strong></p>
<p>처럼 문제를 여러 단계로 나누는 hierarchy가 유용합니다.</p>
<p>이 연구에서는 기존의 <strong>successor measure</strong>를 확장한 <strong>Switching Successor Measures</strong>를 제안하고, 이를 통해 별도의 manually designed subgoal이나 fixed horizon 없이도 hierarchy를 만들어내는 방법을 다뤘습니다.</p>
<p>구체적으로는 Forward-Backward(FB) representation으로부터</p>
<ul>
<li>high-level에서는 어떤 subgoal을 선택할지 결정하고</li>
<li>low-level에서는 실제로 해당 subgoal을 향해 움직이는 policy를 구성합니다.</li>
</ul>
<p>흥미로웠던 점은 goal-conditioned task에만 한정된 hierarchy가 아니라, <strong>보다 일반적인 reward function을 가진 zero-shot RL까지 hierarchy를 확장하려는 시도</strong>라는 점이었습니다. </p>
<h2 id="multi-agent에서는-언제-소통해야-할까">Multi-Agent에서는 언제 소통해야 할까?</h2>
<p>이어진 lightning talk 중에는 여러 robot이 함께 환경을 탐색하는 <strong>multi-agent exploration</strong> 연구도 있었습니다. 여러 agent가 아직 알려지지 않은 공간을 탐색하면서 각각 자신만의 map을 만들어갑니다. 이때 agent는 매 순간 <strong>계속 혼자 탐색할 것인지, 다른 agent와 만나 서로의 map 정보를 공유할 것인지</strong> 결정해야 합니다.</p>
<p>무조건 자주 communication한다고 좋은 것은 아닙니다.</p>
<p>두 agent가 이미 비슷한 지역을 탐색했다면 map을 공유해도 얻는 새로운 정보가 거의 없기 때문입니다. 반대로 너무 오랫동안 communication하지 않으면 여러 agent가 같은 지역을 중복해서 탐색할 수도 있습니다.</p>
<p>따라서 이 연구에서는 주변 obstacle, 아직 탐색되지 않은 frontier의 분포, 주변 agent의 정보 등을 observation으로 사용해 <strong>exploration과 communication을 decentralized하게 선택하도록 학습</strong>했습니다.</p>
<p>Reward에도 communication과 관련된 항을 추가했는데, 실험 결과 불필요한 communication은 줄이면서 실제로 새로운 정보를 얻을 수 있을 때 communication하는 behavior를 학습할 수 있었다고 합니다. Simulation에서 학습한 policy를 실제 robot에도 적용했을 때 비슷한 경향이 나타났다는 점도 흥미로웠습니다.</p>
<p>LLM agent에서도 multi-agent system을 구성하면 결국 비슷한 질문이 생기는데요.</p>
<p><strong>“Agent끼리 언제 정보를 공유해야 하는가?”</strong></p>
<p>라는 communication 자체가 하나의 action이 된다는 점이 재미있었습니다.</p>
<h2 id="stable-and-scalable-deep-rl--clare-lyle">Stable and Scalable Deep RL — Clare Lyle</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/0d43cf91-9ed7-4db2-ba61-1a224adcea7b/image.png" alt=""></p>
<p>마지막으로 Clare Lyle의 발표에서는 조금 더 현실적인(?) 질문을 다뤘습니다.</p>
<p><strong>“Deep RL을 어떻게 하면 hyperparameter tuning 지옥에 빠지지 않고 stable하고 scalable하게 학습할 수 있을까?”</strong> 였습니다.</p>
<p>Supervised learning에서는 보통 잘 정리된 dataset과 objective가 있고, 적절한 architecture와 optimizer를 사용하면 loss가 어느 정도 예측 가능하게 감소합니다.</p>
<p>하지만 RL에서는 agent가 <strong>자기가 앞으로 학습할 data까지 직접 수집</strong>해야 합니다.</p>
<p>따라서</p>
<ol>
<li>어떤 data를 수집할 것인가,</li>
<li>그 data를 보고 어떤 behavior를 더 많이 할 것인가,</li>
<li>실제 neural network parameter를 어떻게 update할 것인가</li>
</ol>
<p>라는 여러 optimization 문제가 동시에 얽혀 있습니다.</p>
<h3 id="loss-of-plasticity">Loss of Plasticity</h3>
<p>특히 재미있었던 부분은 <strong>loss of plasticity</strong>였습니다.</p>
<p>RL에서는 학습 초기에 잘못 형성된 representation 때문에 시간이 지날수록 network가 새로운 정보를 학습하기 어려워지는 현상이 발생할 수 있습니다.</p>
<p>실제로 학습이 plateau된 network의 weight를 새로 initialize하고 기존 replay buffer로 다시 학습시키면 갑자기 performance가 다시 증가하는 경우도 있다고 합니다.</p>
<p>즉 단순히 data가 부족해서가 아니라, <strong>network 자체가 더 이상 새로운 정보를 잘 받아들이지 못하는 상태</strong>가 될 수 있다는 것입니다.</p>
<p>Normalization, parameter norm, architecture 등이 이 문제와 밀접하게 연결되어 있고, 발표에서는 <strong>input normalization이나 loss conditioning처럼 deep learning에서 익숙한 engineering choice가 RL performance를 크게 바꿀 수 있다</strong>는 점도 강조했습니다. 어떤 환경에서는 RL algorithm 자체를 바꾸지 않고 architecture를 개선한 것만으로 성능이 크게 올라가기도 했습니다.</p>
<h3 id="bigger-batch가-오히려-답일-수도-있다">Bigger Batch가 오히려 답일 수도 있다</h3>
<p>또 하나 재미있었던 부분은 <strong>data scale</strong>이었습니다.</p>
<p>RL에서는 흔히 sample efficiency를 중요하게 생각하지만 GPU-accelerated environment에서는 단순 sample 수보다 <strong>wall-clock time과 실제 compute utilization</strong>이 더 중요한 경우가 있습니다.</p>
<p>발표에서 소개한 실험에서는 같은 algorithm이라도 parallel environment와 batch size를 크게 늘렸을 때 기존에 plateau처럼 보였던 지점을 넘어 계속 성능이 향상되었습니다.</p>
<p>예를 들어 batch size가 약 4천일 때 success rate가 0.5 부근에서 멈추던 setting이, 약 6만 5천 수준에서는 거의 100%까지 올라갔습니다. 중간 checkpoint에서 batch size만 바꾸어도 새로운 batch size에 해당하는 성능으로 이동했기 때문에, network가 본질적으로 학습 능력을 잃었다기보다 <strong>더 좋은 policy improvement signal을 얻기 위해 충분한 data가 필요했던 것</strong>으로 해석할 수 있었습니다.</p>
<p>그래서 발표 마지막에 나온 practical advice도 꽤 기억에 남았습니다.</p>
<p>학습이 plateau된다면</p>
<ul>
<li>learning rate를 decay하거나 다시 조정해보고,</li>
<li>network가 실제 우리가 원하는 objective를 optimize하고 있는지 확인하고,</li>
<li>architecture와 normalization을 점검하고,</li>
<li>가능하다면 더 많은 data를 parallel하게 수집해보라는 것이었습니다.</li>
</ul>
<p>단순해 보이지만 실제 RL 실험을 하다 보면 가장 먼저 확인해야 할 것들인 것 같습니다.</p>
<h2 id="마무리">마무리</h2>
<p>Pre-RLC Day의 발표들은 주제가 상당히 다양했습니다.</p>
<p>Hierarchical RL, multi-agent communication, drone swarm, cognitive science, neural network optimization처럼 겉으로 보면 서로 꽤 다른 연구들이었지만, 하루 동안 발표를 듣고 나니 공통적으로 하나의 질문을 하고 있다는 느낌을 받았습니다.</p>
<p><strong>“우리가 만든 agent가 제한된 정보와 계산 자원 안에서 어떻게 더 잘 배우고, 기억하고, 일반화하고, 새로운 환경에 적응하게 만들 수 있을까?”</strong></p>
<p>특히 최근에는 LLM이나 foundation model 쪽에서 RL을 접하다 보니 policy optimization이나 reward design에 먼저 눈이 가는 경우가 많았는데, 이번 발표들을 통해 <strong>representation, memory, abstraction, communication, optimization stability 같은 조금 더 근본적인 문제들도 다시 생각해볼 수 있어서 재미있었습니다.</strong></p>
<p>또 이후 펍에서 네트워킹하는 행사도 참여했는데 대형 컨퍼런스의 발표 세션보다는 상대적으로 자유롭게 질문이 오가고, 연구자들이 아이디어를 주고받는 분위기라 “완성된 결과를 발표하는 자리”라기보다는 아직 풀리지 않은 문제를 함께 고민하는 자리에 가깝다는 느낌도 받았습니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/66113391-d3de-4491-8d2b-01d4d9c90770/image.png" alt="">
같이 게임도.. 하하하</p>
<p>아무튼 이제 본격적인 RLC 세션들도 시작되는 만큼, 남은 기간 동안 재미있는 연구들을 더 많이 만나볼 수 있기를 기대해봅니다 :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Higgs TTS]]></title>
            <link>https://velog.io/@sujin-koo/Higgs-TTS</link>
            <guid>https://velog.io/@sujin-koo/Higgs-TTS</guid>
            <pubDate>Sat, 08 Aug 2026 14:18:46 GMT</pubDate>
            <description><![CDATA[<h1 id="higgs-tts-3-사용-후기-expressive-tts는-정말-원하는-감정을-그대로-만들어줄까">Higgs TTS 3 사용 후기: Expressive TTS는 정말 원하는 감정을 그대로 만들어줄까?</h1>
<p>오늘은 최근 공개된 TTS 모델 중 꽤 인상적으로 사용했던 <strong>Higgs TTS 3</strong>에 대해 간단히 소개하고, 실제로 사용하면서 느꼈던 장점과 아쉬운 점들을 공유해보려고 합니다.</p>
<p>Higgs TTS 3는 Boson AI가 2026년 6월 공개한 TTS 모델입니다. 단순히 텍스트를 자연스럽게 읽어주는 것을 넘어, voice agent나 conversational AI에서 사용할 수 있는 <strong>expressive speech generation</strong>을 주요 목표로 하고 있습니다. 100개 이상의 언어와 zero-shot voice cloning을 지원하며, emotion, style, prosody, pause, sound effect 등을 텍스트 내부의 control token으로 제어할 수 있습니다.</p>
<h2 id="모델-구조">모델 구조</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/be0a84f3-4090-4207-bd7a-590f953b2450/image.png" alt=""></p>
<p>Higgs TTS 3의 backbone은 약 <strong>4B 규모의 autoregressive decoder</strong>입니다.</p>
<p>최근 audio language model 계열에서 많이 사용되는 것처럼 텍스트와 음성을 모두 token으로 표현하고, text token과 audio token을 autoregressive하게 생성하는 구조를 사용합니다.</p>
<p>구체적으로는 audio를 Higgs Tokenizer를 이용해 <strong>25 fps의 8개 codebook</strong>으로 표현하고, 이를 text token과 함께 decoder에서 처리합니다. 최종적으로 생성된 audio token을 다시 waveform으로 복원하며, 출력 sample rate는 24 kHz입니다.</p>
<p>즉 구조 자체만 놓고 보면 최근의 audio language model 기반 TTS들과 크게 동떨어져 있지는 않습니다.</p>
<p>제가 Higgs TTS를 흥미롭게 본 이유는 구조 자체보다는 오히려 <strong>control과 expressiveness</strong> 쪽에 있습니다.</p>
<hr>
<h1 id="control-tag">Control Tag</h1>
<p>Higgs TTS 3는 텍스트 안에 control token을 넣어서 음성의 특성을 조절할 수 있습니다.</p>
<p>공식적으로 제공되는 tag는 총 <strong>43개</strong>이며 크게 네 종류로 나뉩니다. </p>
<ul>
<li>Emotion: 21개</li>
<li>Prosody: 10개</li>
<li>Style: 3개</li>
<li>Sound Effect: 9개</li>
</ul>
<p>예를 들어,</p>
<p><code>&lt;|emotion:anger|&gt;I can&#39;t believe you did that.</code></p>
<p>과 같이 입력하면 화난 음성으로 생성하도록 유도할 수 있습니다.</p>
<p>Emotion tag로는 다음과 같은 것들이 제공됩니다. </p>
<table>
<thead>
<tr>
<th>Tag</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td><code>&lt;&#124;emotion:elation&#124;&gt;</code></td>
<td>환희, 강한 기쁨</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:amusement&#124;&gt;</code></td>
<td>재미, 장난스러움</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:enthusiasm&#124;&gt;</code></td>
<td>열정, 흥분</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:determination&#124;&gt;</code></td>
<td>결의, 단호함</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:pride&#124;&gt;</code></td>
<td>자부심, 자신감</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:contentment&#124;&gt;</code></td>
<td>만족, 평온</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:affection&#124;&gt;</code></td>
<td>애정, 따뜻함</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:relief&#124;&gt;</code></td>
<td>안도</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:contemplation&#124;&gt;</code></td>
<td>사색, 숙고</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:confusion&#124;&gt;</code></td>
<td>혼란</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:surprise&#124;&gt;</code></td>
<td>놀람</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:awe&#124;&gt;</code></td>
<td>경이, 감탄</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:longing&#124;&gt;</code></td>
<td>그리움, 갈망</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:arousal&#124;&gt;</code></td>
<td>강한 욕구·각성</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:anger&#124;&gt;</code></td>
<td>분노</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:fear&#124;&gt;</code></td>
<td>공포</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:disgust&#124;&gt;</code></td>
<td>혐오</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:bitterness&#124;&gt;</code></td>
<td>원망, 씁쓸함</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:sadness&#124;&gt;</code></td>
<td>슬픔</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:shame&#124;&gt;</code></td>
<td>수치심</td>
</tr>
<tr>
<td><code>&lt;&#124;emotion:helplessness&#124;&gt;</code></td>
<td>무력감</td>
</tr>
</tbody></table>
<p>감정 이외의 control도 재미있습니다.</p>
<p>예를 들어,</p>
<p><code>&lt;|style:whispering|&gt;</code></p>
<p>을 이용해 속삭이게 할 수도 있고,</p>
<p><code>&lt;|prosody:speed_slow|&gt;</code></p>
<p>처럼 속도를 바꾸거나,</p>
<p><code>&lt;|prosody:pitch_high|&gt;</code></p>
<p>처럼 pitch를 조절할 수도 있습니다.</p>
<p><code>laughter</code>, <code>crying</code>, <code>sigh</code>, <code>sniff</code>, <code>screaming</code> 같은 sound effect도 지원합니다. 공식 가이드에서는 sound effect token 뒤에 <code>Haha</code>, <code>Ahem</code>, <code>Achoo</code>처럼 해당 소리를 나타내는 표현을 함께 적는 것을 권장합니다. </p>
<hr>
<h1 id="실제로-써보니-어땠나">실제로 써보니 어땠나?</h1>
<p>전반적인 음질과 expressiveness는 상당히 괜찮았습니다.</p>
<p>특히 일반적인 TTS의 깨끗하고 안정적인 음성보다는 조금 더 과감한 억양이나 감정 표현이 필요한 데이터를 만들 때 꽤 유용했습니다. Boson AI 역시 Higgs TTS 3를 단순 narration보다 conversational speech에 초점을 둔 모델로 소개하고 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/3661ef6d-eebd-467f-8a85-5c225223a7fc/image.png" alt=""></p>
<p>공식 Emergent TTS benchmark에서 위와 같이 준수한 성능을 기록하고 있습니다. 다만, 모델이 expressive 하기는 하나 모든 감정을 항상 정확하게 제어하는 모델을 아니라는 인상을 받았습니다. </p>
<h2 id="1-음성-끝부분에-artifact가-생기는-경우">1. 음성 끝부분에 artifact가 생기는 경우</h2>
<p>가장 먼저 발견했던 문제는 <strong>음성 끝부분에 불필요한 소리가 생성되는 경우</strong>였습니다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/a5fc6b30-7fe5-4d97-a084-2bd2c9671fe8/image.png" alt=""></p>
<p>음성을 직접 들어보거나 mel-spectrogram을 확인해보면 발화가 이미 끝났는데 뒤에 아주 짧게</p>
<ul>
<li>마이크에 바람이 닿는 듯한 소리</li>
<li>click 혹은 tick 같은 소리</li>
<li>작은 호흡음</li>
<li>의미 없는 짧은 noise</li>
</ul>
<p>등이 생성되는 경우가 있었습니다.</p>
<p>특히 제 실험에서는 local inference보다 server를 통해 생성했을 때 이런 현상이 조금 더 자주 관찰되었습니다.</p>
<p>이를 해겨랗고자 아예 마지막 구간의 energy와 speech activity를 확인하여 불필요한 trailing audio를 잘라내도록 처리하고 있습니다. 특히 대규모로 합성하는 경우라면 이런 작은 artifact도 그냥 넘기지 않는 것이 좋습니다. 별것 아닌 것처럼 보여도 training sample에 반복적으로 포함되면 모델이 그것까지 데이터의 특성으로 학습할 수 있기 때문입니다.</p>
<hr>
<h2 id="2-발화-앞부분에-존재하지-않는-단어가-생성되는-경우">2. 발화 앞부분에 존재하지 않는 단어가 생성되는 경우</h2>
<p>빈도는 훨씬 적었지만 반대의 문제도 있었습니다.</p>
<p>제가 입력하지 않은</p>
<p><code>Yes!</code></p>
<p>같은 짧은 단어나 interjection이 실제 음성 앞부분에 붙어서 생성되는 경우입니다.</p>
<p>전통적인 deterministic TTS라는 관점에서 보면 꽤 이상한 결과지만, Higgs TTS를 <strong>audio language model</strong>이라는 관점에서 보면 조금 다르게 볼 수 있습니다.</p>
<p>Higgs TTS의 decoder는 text와 audio token을 autoregressive하게 생성하는 구조입니다. 따라서 모델이 단순하게 text를 acoustic feature로 변환한다기보다, 주어진 context에 적절하다고 판단한 speech realization을 생성한다고 볼 수 있습니다.</p>
<p>expressiveness 측면에서는 이것이 장점이 될 수 있지만, 정확하게 입력 transcript와 일치하는 데이터를 생성해야 하는 상황에서는 문제가 됩니다.</p>
<p>그래서 저는 생성한 음성에 대해 다시 ASR 및 추가적인 전처리를 수행하고,</p>
<p><strong>target text ↔ generated speech</strong></p>
<p>가 충분히 일치하는지 확인한 뒤 사용하고 있습니다.</p>
<hr>
<h2 id="3-생각보다-emotion-tag가-강한-constraint는-아니다">3. 생각보다 Emotion Tag가 강한 Constraint는 아니다</h2>
<p>제가 가장 흥미롭게 본 부분입니다.</p>
<p>처음에는</p>
<p><code>&lt;|emotion:sadness|&gt;</code></p>
<p>를 넣으면 거의 항상 sad speech가 생성되고,</p>
<p><code>&lt;|emotion:anger|&gt;</code></p>
<p>를 넣으면 angry speech가 생성될 것이라고 생각했습니다.</p>
<p>실제로는 그렇게 단순하지 않았습니다.</p>
<p>제가 사용했을 때는 emotion tag 자체보다 <strong>문장의 의미나 특정 단어가 최종 음성의 감정 표현에 꽤 강한 영향을 주는 경우</strong>가 있었습니다.</p>
<p>예를 들어 최대한 neutral한 음성을 만들고 싶어도 문장에</p>
<p><code>angry</code>, <code>furious</code>, <code>hate</code></p>
<p>처럼 강한 감정적 의미를 가진 단어가 들어가 있으면 음성이 조금 더 angry하게 생성되는 경우가 있었습니다.</p>
<p>반대로 emotion tag를 설정했는데도 문장 자체가 해당 감정과 잘 맞지 않으면 감정이 약하게 표현되는 경우도 있었습니다.</p>
<p>이 부분은 Higgs TTS의 구조를 생각하면 꽤 자연스럽게 해석할 수도 있습니다.</p>
<p>Higgs는 emotion classifier 뒤에 단순히 style embedding을 붙이는 형태의 시스템이 아니라 <strong>language-model backbone이 text와 audio context를 함께 보고 다음 audio token을 생성하는 모델</strong>입니다.</p>
<p>따라서 생성 결과는</p>
<p><strong>Emotion Tag</strong></p>
<p>하나만으로 결정되는 것이 아니라,</p>
<p><strong>Emotion Tag + Text Semantics + Reference Audio + Sampling</strong></p>
<p>등 여러 조건이 함께 작용한다고 보는 편이 더 적절합니다.</p>
<p>즉 emotion tag는 “이 감정으로 반드시 생성하라” 라는 hard constraint라기보다는 “이 방향의 표현을 선호하라” 에 가까운 soft control로 생각하는 것이 실제 사용 경험과 더 잘 맞았습니다.</p>
<p>이러한 특성은 <strong>controllability 측면에서는 오히려 문제가 될 수 있습니다.</strong></p>
<p>예를 들어 동일한 문장에 서로 다른 emotion tag를 적용했을 때, 우리가 원하는 것은 text의 semantic content는 그대로 유지하면서 vocal emotion만 독립적으로 변화하는 것입니다. 하지만 실제로는 문장이 가지고 있는 semantic emotion과 emotion tag가 서로 영향을 주면서 원하는 감정으로 생성되지 않는 경우가 발생할 수 있습니다.</p>
<p>따라서 <strong>text semantics와 vocal emotion을 얼마나 잘 disentangle할 수 있는가</strong>도 expressive TTS에서 하나의 중요한 연구 방향이 될 수 있을 것 같습니다.</p>
<p>특히 최근처럼 language model 기반의 generative TTS를 사용할수록 이러한 문제는 더 중요해지고 있습니다. Language model은 text, context, reference audio 등 여러 정보를 종합적으로 해석하여 음성을 생성하기 때문에 표현력과 자연스러움은 높아질 수 있지만, 반대로 특정 속성 하나만 독립적으로 제어하는 것은 전통적인 TTS 모델보다 어려워질 수 있기 때문입니다.</p>
<p>결국 앞으로의 expressive TTS에서는 단순히 <strong>얼마나 자연스럽고 다양한 음성을 생성할 수 있는가</strong>뿐만 아니라, <strong>content, speaker identity, emotion, prosody등의 요소를 얼마나 독립적이고 일관되게 제어할 수 있는가</strong> 역시 더욱 중요한 연구 문제가 될 것 같습니다.</p>
<hr>
<h1 id="기타사항">기타사항</h1>
<ol>
<li>사실 Neutral Emotion Tag는 없다</li>
</ol>
<p>여기서 꽤 중요한 부분이 하나 있습니다. Higgs TTS 3에서 공식적으로 제공하는 21개의 Emotion tag를 보면 <strong>neutral이 없습니다.</strong> 따라서 <code>&lt;|emotion:neutral|&gt;</code> 같은 방식으로 neutral speech를 직접 지정할 수 있는 것은 아닙니다. 대신 공식 prosody control에는 <code>&lt;|prosody:expressive_low|&gt;</code> 가 존재합니다. 이는 보다 flat한 delivery를 유도하기 위한 token입니다. 따라서 neutral한 데이터를 만들고 싶다면 개인적으로는 <strong>neutral reference audio + semantically neutral text + expressive_low</strong> 의 조합을 먼저 실험해보는 것이 더 합리적이라고 생각합니다. 그리고 여기서도 결국 생성된 결과를 emotion classifier 등으로 다시 검증하는 것이 필요합니다.</p>
<ol start="2">
<li>Tag를 사용할 때 알아두면 좋은 것</li>
</ol>
<p>공식 prompting guide에서도 tag 사용 위치가 중요하다고 설명합니다. Emotion, style, speed, pitch, expressiveness처럼 <strong>문장 전체의 delivery를 바꾸는 tag는 문장 맨 앞에 넣는 것이 권장됩니다.</strong></p>
<p>예를 들어 <code>&lt;|emotion:anger|&gt;&lt;|prosody:expressive_high|&gt;I told you not to do that!</code> 처럼 사용하는 방식입니다.</p>
<p>반면 pause나 sound effect는 실제 발생시키고 싶은 위치에 inline으로 넣습니다.</p>
<p>이 규칙을 지키지 않고 아무 위치에 tag를 삽입하면 제어력이 떨어질 가능성이 있기 때문에, tag가 잘 동작하지 않는다고 판단하기 전에 prompt format부터 확인해보는 것이 좋습니다.</p>
<ol start="3">
<li>Reference Audio도 중요하다</li>
</ol>
<p>Higgs TTS는 zero-shot voice cloning을 지원하기 때문에 reference audio를 넣어 원하는 speaker의 목소리를 생성할 수 있습니다. 이때 reference audio의 영향도 무시할 수 없습니다.</p>
<p>공식 문서에서도 reference audio와 함께 <strong>reference transcript를 제공하면 cloning quality가 유의미하게 개선된다</strong>고 안내하고 있습니다.</p>
<p>실제로 사용해보면 reference audio가 좋지 않을 경우 최종 생성 음성에서도 문제가 나타나는 경우가 있습니다.</p>
<p>예를 들어 reference에</p>
<ul>
<li>background noise</li>
<li>room reverberation</li>
<li>clipping</li>
<li>지나치게 강한 emotion</li>
<li>불안정한 volume</li>
</ul>
<p>등이 포함돼 있으면 생성 음성에서도 비슷한 acoustic characteristic이 나타날 수 있습니다.</p>
<p>따라서 voice cloning용 reference를 사용할 때는 단순히 “목소리가 비슷한가?”만 보는 것이 아니라 <strong>recording condition과 speaking style까지 함께 확인하는 것이 좋습니다.</strong></p>
<hr>
<h1 id="결론">결론</h1>
<p>개인적으로는 <strong>expressive speech가 필요한 경우 Higgs TTS는 상당히 매력적인 모델</strong>이라고 생각합니다.</p>
<p>특히</p>
<ul>
<li>감정 음성 데이터 생성</li>
<li>conversational agent</li>
<li>character speech</li>
<li>audiobook / dialogue</li>
<li>expressive voice agent</li>
</ul>
<p>같은 분야에서는 일반적인 TTS보다 훨씬 다양한 speech behavior를 만들어볼 수 있습니다.</p>
<p>100개 이상의 언어를 지원하고 Korean도 공식 지원 언어에 포함되어 있습니다. 다만, Higgs TTS는 tag를 통해 다양한 감정과 prosody를 제어할 수 있지만 최종 생성 결과는 tag 하나만이 아니라 text semantics, reference audio, generation sampling 등 여러 조건의 영향을 함께 받습니다. </p>
<p>과거의 TTS가 주로 <strong>“주어진 문장을 얼마나 정확하고 자연스럽게 읽느냐”</strong> 의 문제였다면, 최근의 audio language model 기반 TTS는 점점 <strong>“주어진 context를 어떻게 해석하고 어떤 방식으로 연기하느냐”</strong> 의 문제로 이동하고 있습니다. Higgs TTS의 강점인 expressiveness는 바로 여기에서 나오지만, 동시에 우리가 원하는 데이터를 정확하게 통제하기 어렵게 만드는 원인이 되기도 합니다.</p>
<p>그래서 <strong>생성 후 다시 검증하는 과정이 반드시 필요하다는 점을 유의하여 사용하시면 좋을 것 같습니다.</strong></p>
<hr>
<h2 id="참고-자료">참고 자료</h2>
<ul>
<li>Boson AI, <em>Higgs TTS 3: Beyond Reading, Toward Real Speech for Voice AI</em> (<a href="https://www.boson.ai/blog/higgs-tts-3" title="Higgs TTS 3: beyond reading, toward real speech for voice AI – Boson AI">Boson AI</a>)</li>
<li>Boson AI, <em>Higgs TTS 3 Model Card</em> (<a href="https://huggingface.co/bosonai/higgs-audio-v3-tts-4b" title="bosonai/higgs-tts-3-4b · Hugging Face">Hugging Face</a>)</li>
<li>Higgs TTS 3 Prompting Guide (<a href="https://huggingface.co/bosonai/higgs-tts-3-4b/blob/main/PROMPTING.md" title="PROMPTING.md · bosonai/higgs-tts-3-4b at main">Hugging Face</a>)</li>
<li>SGLang-Omni, <em>Higgs TTS Cookbook</em> (<a href="https://sgl-project.github.io/sglang-omni/cookbook/higgs_tts.html" title="Higgs TTS — SGLang">SGLang</a>)</li>
<li>Boson AI Higgs Audio GitHub Repository (<a href="https://github.com/boson-ai/higgs-audio" title="GitHub - boson-ai/higgs-audio: Text-audio foundation model from Boson AI · GitHub">GitHub</a>)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] AEQ-Bench]]></title>
            <link>https://velog.io/@sujin-koo/Paper-Review-AEQ-Bench</link>
            <guid>https://velog.io/@sujin-koo/Paper-Review-AEQ-Bench</guid>
            <pubDate>Sun, 02 Aug 2026 03:50:56 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/abs/2601.10513">AEQ-Bench</a> (2026 ACL findings) </p>
<h2 id="대화를-한다는-것">대화를 한다는 것</h2>
<p>우리가 대화를 할 때 비언어적인 요소들도 문맥을 파악하는데 많은 영향을 끼친다. 같은 내용의 문장을 말하더라도 다른 톤으로 말하면 다른 감정과 의도를 전달한다. 그러면 사람처럼 AI 모델들은 이러한 부분들을 잘 캐치하고 있을까? 최근에는 대화 모델에서 이러한 부분을 평가하는 방법을 고민하고 있다.</p>
<blockquote>
<p>사용자의 감정이 담긴 음성을 듣고 생성한 응답이 내용과 음성 전달 방식 모두에서 적절한지를 어떻게 평가할 수 있을까?</p>
</blockquote>
<p>최근에 읽은 <strong>AEQ-Bench: Measuring Empathy of Omni-Modal Large Models</strong> 역시 비슷한 고민을 한다. 이 논문은 멀티모달 모델이 사용자의 음성과 대화 문맥을 함께 이해해 공감적인 응답을 생성할 수 있는지, 그리고 다른 모델이 생성한 음성 응답의 공감 품질을 평가할 수 있는지를 다룬다. 특히 응답에서 <strong>무엇을 말했는가</strong>뿐 아니라 <strong>어떻게 말했는가</strong>도 평가 대상으로 본다는 점에서 관심이 갔다.</p>
<hr>
<h2 id="텍스트가-아니라-음성의-감정을-이해했는가">텍스트가 아니라 음성의 감정을 이해했는가?</h2>
<p>감정 대화 모델을 평가할 때 가장 먼저 생기는 문제는 모델이 정말 음성의 감정을 이해했는지 확인하기 어렵다는 점이다.</p>
<p>일반적인 감정 음성 데이터에서는 문장의 내용과 감정이 함께 변하는 경우가 많다.</p>
<p>예를 들어 화난 음성에는 부정적인 단어나 공격적인 표현이 포함되고, 즐거운 음성에는 긍정적인 내용이 포함될 가능성이 크다. 이런 데이터로 모델을 평가하면 모델이 음성의 억양을 들은 것인지, 단순히 텍스트에서 감정을 추론한 것인지 구분하기 어렵다.</p>
<p>그래서 AEQ-Bench에서는 문장과 대화 문맥은 동일하게 유지하면서, 같은 문장을 <code>angry</code>, <code>disgusted</code>, <code>amused</code>, <code>neutral</code>의 네 가지 톤으로 다르게 발화하는 데이터셋을 구성한다. EMOV-DB subset은 총 109개의 문장과 네 가지 감정 음성으로 구성된 436개의 평가 인스턴스를 포함한다. </p>
<p>예를 들어 다음과 같은 문장이 있다고 하자.</p>
<blockquote>
<p>“For the twentieth time that evening the two men shook hands.”</p>
</blockquote>
<p>문장의 내용은 같지만, 화난 목소리로 말하면 반복되는 상황에 대한 짜증으로 해석할 수 있다. 반대로 즐거운 목소리로 말하면 반복되는 악수 상황을 재밌는 일로 받아들이고 있을 수 있다.</p>
<p>실제로 AEQ-Bench 데이터에는 같은 문장과 문맥에 대해 감정별 설명과 서로 다른 적절한 응답이 제공된다. 이처럼 모델에 들어가는 텍스트는 같고 음성의 감정만 달라지기 때문에, 모델의 응답이 변했다면 그 변화가 음성 정보에서 비롯되었을 가능성이 크다. 반대로 네 개의 감정 음성을 입력했는데도 모델이 거의 동일한 답변을 생성한다면, 모델이 음성의 감정을 제대로 활용하지 않았다고 볼 수 있다.</p>
<hr>
<h2 id="좋은-감정-응답은-무엇일까">좋은 감정 응답은 무엇일까?</h2>
<p>모델이 입력 감정에 따라 서로 다른 응답을 생성했다고 해서, 그 응답이 반드시 상황에 적절한 것은 아니다.</p>
<p>예를 들어 화난 사용자에게 모델은 여러 방식으로 반응할 수 있다.</p>
<ul>
<li>사용자의 분노를 인정하고 감정을 받아주는 응답</li>
<li>사용자를 진정시키는 차분한 응답</li>
<li>사용자의 입장에 서서 단호하게 공감하는 응답</li>
<li>문제를 해결할 수 있는 구체적인 방법을 제안하는 응답</li>
<li>사용자가 화를 내는 대상에 함께 분노하는 응답</li>
<li>사용자에게 불쾌함이나 분노를 직접 표현하는 응답</li>
</ul>
<p>이 중 어떤 반응이 적절한지는 사용자가 왜 화가 났는지, 그 분노가 누구를 향하고 있는지, 그리고 모델과 사용자가 어떤 관계와 역할을 갖는지에 따라 달라진다.</p>
<p>예를 들어 사용자가 부당한 일을 겪고 화를 내는 상황에서는 모델이 사용자의 감정에 동조하는 것이 적절할 수 있다. 반대로 사용자가 모델을 공격하거나 모욕하는 상황이라면, 모델이 사용자에게 불쾌함을 표현하거나 단호하게 대응하는 것도 하나의 가능한 반응이다.</p>
<p>따라서 감정 대화 모델을 평가할 때는 입력과 출력의 감정 라벨만 비교할 것이 아니라, 응답의 내용과 문맥, 감정의 대상, 의도와 표현 강도까지 함께 고려해야 한다.</p>
<hr>
<h2 id="무엇을-말했는가와-어떻게-말했는가">무엇을 말했는가와 어떻게 말했는가</h2>
<p>또한 평가를 수행함에 있어서는 응답 내용과 음성 전달을 분리해서 평가할 필요가 있다. 다음 문장을 생각해보자.</p>
<blockquote>
<p>“그런 일을 겪었다니 정말 속상했겠어요.”</p>
</blockquote>
<p>텍스트만 보면 충분히 공감적인 응답처럼 보인다. 하지만 모델이 이 문장을 지나치게 밝은 목소리나 무관심한 목소리로 말한다면, 실제 대화에서는 공감적으로 들리지 않을 수 있다. 반대로 슬프고 부드러운 목소리로 말했더라도, 사용자의 상황을 잘못 이해한 답변이라면 좋은 응답이라고 보기 어렵다.</p>
<p>AEQ-Bench의 <code>Delivery</code>는 생성된 응답 음성을 직접 듣고 목소리의 톤, 속도, 피치, 운율, 쉼과 타이밍이 공감이나 의도한 감정을 적절하게 전달하는지를 평가한다. 반면, 기존의 평가 방식은 종종 생성된 음성을 텍스트로 변환한 뒤, 텍스트의 공감성만 평가한다. 하지만 이 방식에서는 실제 음성에 담긴 감정이나 전달 방식을 잃게 된다.</p>
<hr>
<h2 id="audio-llm을-평가자로-사용할-수-있을까">Audio LLM을 평가자로 사용할 수 있을까?</h2>
<p>응답 음성을 평가하려면 결국 누군가가 음성을 직접 들어야 한다.</p>
<p>가장 확실한 방법은 인간 평가지만, 모델이나 실험 조건이 많아지면 모든 샘플을 사람이 평가하기 어렵다. 그래서 audio-capable LLM을 자동 평가자로 사용하는 방법이 매력적으로 보인다.</p>
<p>AEQ-Bench에서는 GPT-4o-audio-preview, Qwen2.5-Omni, Qwen2-Audio 등의 모델이 생성된 응답 음성을 직접 듣고 평가한다.</p>
<p><code>Good</code>, <code>Fair</code>, <code>Poor</code>처럼 큰 차이를 구분하는 coarse-grained 평가에서는 일부 모델이 인간 평가와 비교적 높은 일치도를 보였다. 논문에서는 GPT-4o-audio-preview가 Delivery 항목에서 인간 평가와 가장 높은 평균 일치도를 보였다. </p>
<p>하지만 평가 척도를 5점으로 세분화해 미세한 운율과 감정 표현의 차이를 평가했을 때는 인간 평가와의 일치도가 약 43%에 불과했다. 또한 인간 평가자는 Qwen-Omni 계열의 Delivery를 선호한 반면, OLM judge는 GPT 응답에 더 높은 점수를 주는 경향을 보였다. </p>
<p>이 결과는 audio LLM judge를 사용할 때 그 점수를 절대적인 정답처럼 받아들여서는 안 된다는 것을 보여준다. 현재의 audio LLM judge가 미세한 차이를 안정적으로 구분한다고 보기 어렵기 때문이다.</p>
<hr>
<h2 id="평가-파이프라인">평가 파이프라인</h2>
<p>결론적으로 AEQ-Bench를 참고하면 다음과 같은 평가 파이프라인을 구성할 수 있다.</p>
<h3 id="1단계-입력-감정-통제">1단계: 입력 감정 통제</h3>
<p>동일한 문장과 동일한 대화 문맥을 유지한 채 감정 톤만 다른 음성을 입력한다. 이를 통해 텍스트 정보가 아닌 음성 감정에 따라 모델의 응답이 달라지는지를 확인한다.</p>
<h3 id="2단계-응답-유효성-검사">2단계: 응답 유효성 검사</h3>
<p>모델의 응답이 비어 있거나, 입력을 그대로 반복하거나, 대화와 무관한 경우를 먼저 분리한다. 이런 응답을 감정적으로 평가하는 것은 의미가 없기 때문이다.</p>
<h3 id="3단계-응답-내용-평가">3단계: 응답 내용 평가</h3>
<p>사용자의 감정과 대화 문맥을 고려했을 때 응답 내용이 적절한지를 평가한다. 이때 단순히 “공감적인가”만 보는 것이 아니라 다음 항목을 함께 고려할 수 있다.</p>
<ul>
<li>사용자의 감정을 이해했는가?</li>
<li>상황을 잘못 해석하지 않았는가?</li>
<li>응답이 지나치게 일반적이거나 템플릿 형태는 아닌가?</li>
<li>사용자의 감정에 맞는 대화 전략을 사용했는가?</li>
</ul>
<h3 id="4단계-음성-전달-평가">4단계: 음성 전달 평가</h3>
<p>생성된 응답 음성을 audio-capable judge에 직접 입력한다. 평가 기준은 단순한 음성 품질이 아니라 다음에 초점을 맞춘다.</p>
<ul>
<li>응답의 톤이 대화 상황과 어울리는가?</li>
<li>응답 내용과 목소리 사이에 모순이 없는가?</li>
<li>감정 표현이 지나치게 약하거나 과장되지 않았는가?</li>
<li>속도, 쉼, 운율이 자연스러운가?</li>
</ul>
<h3 id="5단계-인간-평가로-judge-검증">5단계: 인간 평가로 judge 검증</h3>
<p>전체 데이터에 인간 평가를 수행하기 어렵다면, 일부 샘플만이라도 사람이 직접 평가해야 한다. 이를 통해 audio LLM judge가 인간의 판단과 어느 정도 일치하는지, 특정 감정이나 모델에 편향되어 있지는 않은지 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review]ParaS2S]]></title>
            <link>https://velog.io/@sujin-koo/Paper-ReviewParaS2S</link>
            <guid>https://velog.io/@sujin-koo/Paper-ReviewParaS2S</guid>
            <pubDate>Sun, 26 Jul 2026 14:41:41 GMT</pubDate>
            <description><![CDATA[<p>ParaS2S: Benchmarking and Aligning Spoken Language Models for Paralinguistic-aware Speech-to-Speech Interaction</p>
<ul>
<li>ICLR 2026</li>
<li><a href="https://arxiv.org/abs/2511.08723">Paper link</a></li>
<li><a href="https://paras2sbench.github.io/">Demo audio samples</a></li>
</ul>
<hr>
<p>Speech LLM의 평가 방법을 참고하기 위해 관련 연구를 계속 찾아보고 있다. 오늘 리뷰할 <strong>ParaS2S</strong>는 S2S 모델이 내용뿐 아니라 <strong>감정, 말투, 화자 특성 같은 준언어적(paralinguistic) 정보</strong>에도 맞게 응답하는지를 평가하고, 이를 강화학습으로 align하는 논문이다.</p>
<p>이전에 설계하고 진행 중이던 방향과 상당 부분 겹치는 내용이었으며, 아래의 <strong>AudioReasoner를 활용한 평가 방식</strong>을 참고해서 테스트 해보려 한다.</p>
<ul>
<li>음성을 평가할 때는 Emotion2Vec 같은 <strong>이산적인 감정 라벨</strong>보다, <strong>AudioReasoner처럼 음성의 톤과 말투를 이해하는 모델</strong>을 사용하는 편이 사람 평가와 더 높은 상관관계를 보인다고 주장한다 (표 2 참고).</li>
<li>응답에 감정 태그를 강제로 부여한 경우, 오히려 <strong>아무런 출력 스타일 정보도 주지 않은 경우보다 사람 평가와의 상관관계가 낮았다.</strong></li>
</ul>
<p>리뷰를 영어로 쓸 때도, 한국어로 쓸 때도 있는데 이번에는 영어로 작성했다. 아래는 영어 리뷰다.</p>
<hr>
<h2 id="tldr">TL;DR</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/f3ccce1b-2385-4cf9-88dc-ecec58b70b8f/image.png" alt=""></p>
<p>Existing S2S models (Qwen2.5-Omni, GLM-4-Voice, GPT-4o Voice Mode, Kimi-Audio) largely fail to adapt their responses to speaking style. They infer emotional state from text content alone and produce &quot;tone-deaf&quot; replies.</p>
<p>ParaS2S is a framework for building speech-to-speech (S2S) models that respond appropriately to <strong>paralinguistic cues</strong> (emotion, sarcasm, age, gender) not just spoken content. It has two parts:</p>
<ul>
<li><strong>ParaS2SBench</strong>: a benchmark + automatic judge that evaluates whether an S2S model&#39;s response (both content <em>and</em> speaking style) naturally fits the input speech.</li>
<li><strong>ParaS2SAlign</strong>: an RL pipeline (GRPO) that distills the automatic judge into a fast reward model, then uses it to post-train an S2S model (Kimi-Audio) - beating SFT by ~10%.</li>
</ul>
<hr>
<h2 id="1-motivation">1. Motivation</h2>
<ul>
<li>Speech carries content and paralinguistic signal (tone, emotion, speaker traits) that should shape how an assistant responds.</li>
<li>Existing benchmarks (VoiceBench, AIR-Bench, StyleTalk, VoxDialogue, etc.) either ignore paralinguistics entirely or stop at the <strong>text</strong> level - evaluating the response transcript rather than the response audio.</li>
<li>No prior benchmark directly evaluates <strong>output speech</strong> for paralinguistic appropriateness. ParaS2SBench is the first to do this end-to-end (audio in → audio out).</li>
<li>Data scarcity is a real constraint: collecting style-annotated, expressive input/output speech pairs is expensive, which motivates using RL instead of large-scale SFT.</li>
</ul>
<hr>
<h2 id="2-paras2sbench">2. ParaS2SBench</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/bd08d732-7600-4c1f-9cc3-6ff9310e6245/image.png" alt=""></p>
<h3 id="design-principles">Design principles</h3>
<ol>
<li><strong>Contrastive speaking styles</strong> - the same sentence is spoken in two opposite styles (e.g., &quot;I just bumped into my ex&quot; → surprised vs. sad), forcing the model to rely on voice rather than text.</li>
<li><strong>Scenario-controlled, textually neutral queries</strong> - content is paralinguistically relevant, but doesn&#39;t give away the speaker&#39;s state through words alone.</li>
<li><strong>Speech-to-speech evaluation</strong> - judged entirely on the output <em>audio</em>, not a text transcript.</li>
</ol>
<h3 id="dataset">Dataset</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/192c361b-a97b-4200-b879-8647911351a3/image.png" alt=""></p>
<ul>
<li>Synthetic speech: LLM-authored queries + TTS (gpt-4o-mini-tts, CosyVoice), filtered for neutrality/reasonability/paralinguistic relevance, then human-verified.</li>
<li>Real speech: drawn from <strong>IEMOCAP</strong> and <strong>MELD</strong> (emotion-labeled dialogue corpora).</li>
<li>Total size: ~2,690 prompts / ~3,890 utterances across Emotion, Sarcasm, Age, and Gender categories.</li>
</ul>
<h3 id="automatic-judge-pipeline">Automatic judge pipeline</h3>
<p>The judge does <strong>not</strong> feed raw audio directly into an end-to-end audio-LLM. The authors found that LLMs like gpt-audio tend to hallucinate paralinguistic cues from spoken content rather than actually listening to the voice. Instead, the pipeline separates audio into text-based representations first:</p>
<pre><code>User speech
 ├─ Whisper-V3             → transcription
 └─ Style analyzers         → emotion, sarcasm, age, gender
     (Emotion2Vec-based, fine-tuned with &quot;PolyTone&quot; training)

Response speech
 ├─ Whisper-V3             → transcription
 └─ AudioReasoner (Qwen-Audio 2 + CoT distilled from Gemini) → tone description
                ↓
        Text LLM (GPT-4.1) → 1–5 Continuation Fitness score</code></pre><ul>
<li><strong>PolyTone training</strong>: emotion/sarcasm classifiers are fine-tuned on data where &quot;the same sentence is spoken in many different styles&quot;, forcing the classifier to key off actual vocal cues rather than inferring style from lexical content (avoiding the same hallucination problem seen in LLMs).</li>
<li><strong>Age/Gender classifiers</strong>: off-the-shelf pretrained models (wav2vec2 age/gender, ECAPA-TDNN gender). No custom training needed.</li>
<li><strong>Final scoring</strong>: a 1~5 Likert &quot;Continuation Fitness&quot; score from a text LLM, guided by a human-written rubric. It judges whether the combination of response content and tone is an appropriate continuation of the dialogue - not merely whether an isolated target emotion is matched.</li>
</ul>
<h3 id="judge-validation">Judge validation</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/20f8ca5e-81d0-46e4-98cf-27ee7de0a5a7/image.png" alt=""></p>
<p>The paper runs an ablation across six judge configurations (O1-O6) to isolate exactly which components of the pipeline matter:</p>
<p><strong>What each comparison isolates:</strong></p>
<ul>
<li><strong>O1 vs. O2 vs. O3 vs. O4</strong> : the effect of how output style is represented (nothing / tone only / emotion tag only / both), with input fixed at ground truth.</li>
<li><strong>O5 vs. O6</strong> : the effect of <em>PolyTone training</em> on the input-side style classifiers, with output representation fixed (tone description only).</li>
<li><strong>O2 vs. O5</strong> : the effect of moving from ground-truth input labels to model-predicted (classifier) input labels.</li>
</ul>
<p><strong>The standout result (O3 vs. O4):</strong></p>
<ul>
<li>O3 (emotion tag only, no tone description): 0.731</li>
<li>O4 (emotion tag + tone description): 0.743</li>
<li>O1 (no output style signal at all): <strong>0.757</strong></li>
</ul>
<p>O1 outperforming O3: forcibly attaching a discrete emotion tag to the response performs <strong>worse</strong> than giving no output style information at all. This is direct empirical evidence that &quot;emotion&quot; and &quot;tone&quot; are fundamentally different concepts.</p>
<hr>
<h2 id="3-paras2salign">3. ParaS2SAlign</h2>
<p>Base model: <strong>Kimi-Audio</strong> (chosen for its open speech tokenizer and strong intelligence). Three stages:</p>
<ol>
<li><strong>Warm-up SFT</strong>: an LLM generates ideal (content, tone) response pairs, synthesized via gpt-4o-mini-tts, used for ~10–100 hours of SFT. This step is necessary because untrained S2S models produce uniformly bad (tone-deaf) samples, giving RL nothing to learn from.</li>
<li><strong>Reward model distillation</strong>: sample diverse responses from the warmed-up model, score them with the full judge pipeline (slow but accurate), then distill into a fast reward model (Qwen2.5-Omni + LoRA) for online scoring.</li>
<li><strong>RL post-training with GRPO</strong>: optimize the SFT model against the distilled reward model, with a KL penalty (β = 0.2) against the reference policy to prevent catastrophic forgetting of general capabilities.</li>
</ol>
<hr>
<h2 id="4-key-results">4. Key Results</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/f34e50bf-d89d-4bff-b776-50f1274f0700/image.png" alt="">
<img src="https://velog.velcdn.com/images/sujin-koo/post/27171ecb-3695-4752-8a36-625ada13114c/image.png" alt=""></p>
<ul>
<li><strong>Existing S2S models are &quot;tone-deaf&quot;</strong>: GPT-4o Voice, Qwen2.5-Omni, GLM-4-Voice, and Kimi-Audio all perform close to a naive baseline that ignores speaking style entirely</li>
<li><strong>RL &gt; SFT</strong>: GRPO improves ~10% over SFT on ParaS2SBench (both objective judge and human eval, +7.6%)</li>
<li><strong>RL is far more data-efficient</strong>: an RL model with only <strong>20 hours</strong> of SFT warm-up data beats a pure-SFT model trained on the <strong>full 100 hours</strong></li>
<li><strong>Original capabilities preserved</strong>: VoiceBench scores stay roughly flat post-RL (thanks to light SFT + KL-regularized GRPO); heavy pure-SFT (&gt;10 epochs) degrades general ability (e.g., collapses to short responses)</li>
<li><strong>GRPO hyperparameters</strong>: group size ≥ 8 needed for a usable learning signal; batch size 32 is sufficient; KL weight β = 0.2 is the sweet spot between forgetting and under-exploration</li>
</ul>
<hr>
<h2 id="5-contributions">5. Contributions</h2>
<ol>
<li><strong>ParaS2SBench</strong> is the first end-to-end (audio-in/audio-out) paralinguistic-aware S2S benchmark.</li>
<li>A <strong>pipeline-based automatic judge</strong> (separating content and style analysis) that outperforms end-to-end LLM judging.</li>
<li>Shows that <strong>RL is more label-efficient than SFT</strong> for this problem.</li>
<li>Plan to <strong>open-source</strong> the data, code, and models.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] Multi-Faceted Interactivity Alignment in Full-Duplex Speech Models]]></title>
            <link>https://velog.io/@sujin-koo/Paper-Review-Multi-Faceted-Interactivity-Alignment-in-Full-Duplex-Speech-Models</link>
            <guid>https://velog.io/@sujin-koo/Paper-Review-Multi-Faceted-Interactivity-Alignment-in-Full-Duplex-Speech-Models</guid>
            <pubDate>Tue, 14 Jul 2026 19:25:41 GMT</pubDate>
            <description><![CDATA[<p>최근 대화형 음성 모델에 강화학습을 적용하는 실험을 준비하면서 관련 연구를 찾아보았다. 그중 Moshi와 PersonaPlex에 GRPO 기반 강화학습을 적용해 상호작용 성능을 개선한 논문인 Multi-Faceted Interactivity Alignment in Full-Duplex Speech Models를 살펴보았다.</p>
<p>전반적으로</p>
<ul>
<li>짧은 utterance 데이터셋 사용하되, 상황에 따라 context 제공 필요</li>
<li>대화 내용이나 대화 타이밍은 text token 으로 접근, 음성적인 부분을 speech token 으로 접근(물론 테스트 필요; 명확히 나누어 떨어지지 않을 것으로 생각됨)</li>
<li>llm judge reward를 통한 응답 품질 저하 방지</li>
<li>여러 종류의 reward를 함께 사용할 때 normalization 처리
에 대한 부분을 참고하면 좋을 것 같은 논문이었다.</li>
</ul>
<hr>
<h2 id="1-연구-목표">1. 연구 목표</h2>
<p>Full-duplex speech model은 사용자의 음성을 들으면서 동시에 말할 수 있는 모델이다. 따라서 자연스러운 턴테이킹, 백채널, 발화 중첩, 사용자 끼어들기 처리가 가능하다. 하지만 실제 대화에서는 다음과 같은 문제가 발생한다.</p>
<ul>
<li>사용자가 말을 끝냈는데도 응답이 늦음</li>
<li>사용자가 잠시 멈춘 것을 턴 종료로 오인하고 말을 가로챔</li>
<li>백채널을 거의 생성하지 않음</li>
<li>부적절한 타이밍에 말을 시작함</li>
<li>사용자가 끼어들어도 계속 말함</li>
</ul>
<p>저자들은 이러한 문제가 기존 supervised learning의 한계에서 발생한다고 본다. Next-token likelihood 학습은 토큰 예측에는 효과적이지만, <strong>언제 말하고, 언제 침묵하며, 얼마나 빠르게 응답할지</strong> 같은 interaction-level behavior를 직접 최적화하지 않는다. </p>
<p>논문은 학습과 추론 시 입력 분포가 달라지는 <strong>exposure bias</strong>도 원인으로 언급한다. 학습 중에는 이전 정답 출력을 보지만, 추론 중에는 모델 자신의 출력을 다시 입력으로 사용하므로 작은 오류가 이후 발화 타이밍과 내용에 누적될 수 있다.</p>
<hr>
<h2 id="2-기존-연구의-한계">2. 기존 연구의 한계</h2>
<p>기존에도 full-duplex model에 RL이나 preference optimization을 적용한 연구가 있었다.</p>
<ul>
<li><strong>SALMONN-omni:</strong> DPO로 barge-in과 backchannel 개선</li>
<li><strong>ORISE:</strong> REINFORCE 기반 online RL로 noisy environment에서 interaction 개선</li>
<li><strong>ASPIRin:</strong> Moshi에 GRPO를 적용해 interaction timing 최적화</li>
</ul>
<p>하지만 기존 연구는 일부 행동만 다루거나 하나의 모델에만 적용했으며, timing reward를 최적화했을 때 semantic quality가 떨어질 수 있었다. </p>
<p>이 논문의 주요 기여는 다음과 같다.</p>
<ol>
<li><p><strong>네 가지 interaction axis를 함께 최적화</strong></p>
<ul>
<li>Pause handling</li>
<li>Turn-taking</li>
<li>Backchanneling</li>
<li>User interruption</li>
</ul>
</li>
<li><p><strong>실제 인간 대화에서 짧은 학습 segment를 자동 추출</strong></p>
</li>
<li><p><strong>행동별 reward 설계</strong></p>
<ul>
<li>침묵 유지</li>
<li>응답 지연</li>
<li>백채널 timing F1</li>
<li>interruption 이후 응답 지연</li>
</ul>
</li>
<li><p><strong>LLM Judge reward로 의미 품질 유지</strong></p>
</li>
</ol>
<hr>
<h2 id="3-grpo-학습-과정">3. GRPO 학습 과정</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/8c5967b5-a39f-400d-83d4-68f6349a2749/image.png" alt=""></p>
<p>GRPO는 동일한 입력에 대해 여러 응답을 생성하고, 그룹 안에서 상대적으로 좋은 응답의 확률을 높이는 방식이다.</p>
<ol>
<li>Pause, turn-taking, backchannel, interruption 중 하나의 음성 segment를 선택한다.</li>
<li>모델이 같은 입력에 대해 여러 응답을 생성한다.</li>
<li>각 응답에 interaction reward와 semantic reward를 부여한다.</li>
<li>그룹 평균보다 reward가 높은 응답은 positive advantage, 낮은 응답은 negative advantage를 받는다.</li>
<li>좋은 응답의 생성 확률은 높이고 나쁜 응답의 확률은 낮춘다.</li>
</ol>
<p>논문에서는 하나의 입력마다 16개의 completion을 생성했다. 또한 KL penalty를 사용해 RL 모델이 기존 pretrained model에서 지나치게 멀어지는 것을 방지했다. </p>
<hr>
<h2 id="4-짧은-segment와-context-사용">4. 짧은 segment와 context 사용</h2>
<p>이 논문의 중요한 특징은 긴 멀티턴 대화 전체를 RL sample로 사용하지 않았다는 점이다. 대신 특정 행동이 명확히 나타나는 짧은 segment만 추출해 학습했다.</p>
<p>다만 짧은 target segment 앞에 이전 대화 context를 함께 입력했다.</p>
<ul>
<li>Loss는 target segment에만 계산</li>
<li>Context 부분은 masking</li>
<li>최대 context 길이는 학습 중 0초에서 30초까지 증가</li>
<li>50% 확률로 context를 사용하고, 나머지는 context 없이 학습</li>
</ul>
<p>Context를 제거하면 멀티턴 instruction-following 성능이 감소했다. 따라서 짧은 utterance를 target으로 사용하더라도, 긴 대화로 일반화하려면 이전 문맥을 입력하는 것이 중요하다. </p>
<p>향후 내가 실험을 진행함에 있어 target utterance는 짧게 사용하되(데이터셋 한계), 상황에 따라 이전 대화 context를 함께 제공하는 방식이 적절해 보인다.</p>
<hr>
<h2 id="5-reward-설계">5. Reward 설계</h2>
<h3 id="pause-handling">Pause handling</h3>
<p>사용자가 문장 중간에 잠시 멈춘 경우 모델은 침묵해야 한다.</p>
<ul>
<li>생성 음성에 1초보다 긴 speech가 있으면 1</li>
<li>그렇지 않으면 0</li>
</ul>
<h3 id="turn-taking">Turn-taking</h3>
<p>사용자 발화가 끝난 뒤 모델이 말하기 시작할 때까지의 delay가 있을 때, 빠르게 응답할수록 reward가 높다.</p>
<h3 id="backchanneling">Backchanneling</h3>
<ul>
<li>1초 이하 speech: backchannel</li>
<li>1초 초과 speech: takeover</li>
</ul>
<p>생성된 backchannel이 실제 위치의 ±1초 안에 있으면 true positive로 판단하고, 최종 F1 score를 reward로 사용한다.</p>
<h3 id="user-interruption">User interruption</h3>
<p>사용자의 끼어들기 발화가 끝난 뒤 모델이 다시 말하기 시작할 때까지의 delay를 사용한다.</p>
<hr>
<h2 id="6-llm-judge-reward">6. LLM Judge Reward</h2>
<p>Turn-taking이나 interruption에서 delay만 최적화하면 모델이 문맥과 무관한 말을 빠르게 시작하거나, “yeah”, “okay” 같은 짧고 일반적인 응답만 생성할 수 있다.</p>
<p>이를 막기 위해 다음 과정을 사용한다.</p>
<ol>
<li>사용자 음성과 모델 생성 음성을 ASR로 전사</li>
<li>전체 대화 context와 모델 응답을 LLM에 입력</li>
<li>문맥 적절성과 자연스러움을 평가</li>
<li>해당 점수를 semantic reward로 사용</li>
</ol>
<p>실험에서는 Parakeet TDT를 ASR로, Qwen3-235B-A22B를 Judge로 사용했다. </p>
<p>평가 기준은 다음과 같다.</p>
<ul>
<li><strong>0:</strong> 무관하거나 부자연스럽거나 의미 있는 응답이 없음</li>
<li><strong>1:</strong> 일부 관련은 있지만 일반적이고 구체성이 부족함</li>
<li><strong>2:</strong> 자연스럽고 구체적이며 문맥에 일관되게 기반함</li>
</ul>
<p>Delay reward와 LLM reward는 범위가 다르기 때문에 각각 그룹 내에서 독립적으로 정규화한 뒤 동일한 가중치로 합친다. </p>
<hr>
<h2 id="7-text-token만-최적화한-이유">7. Text token만 최적화한 이유</h2>
<p>Moshi와 PersonaPlex는 audio token과 함께 parallel text token stream을 생성한다. 저자들은 text stream이 발화 내용뿐 아니라 모델이 언제 말하고 언제 침묵하는지도 암묵적으로 제어한다고 본다. </p>
<p>따라서 이 논문은 GRPO objective를 계산할 때 audio token probability는 제외하고 text token probability만 사용했다. </p>
<p>하지만 나에 경우에는 이를 두 부분으로 나눠 볼 필요가 있다.</p>
<ul>
<li><strong>내용을 생성하는 것:</strong> text token과 밀접함</li>
<li><strong>특정 말투로 말하는 것:</strong> audio token과 prosody가 더 중요함</li>
</ul>
<p>따라서 적절한 응답을 생성하는 것은 text stream 최적화로 개선될 가능성이 있다. 하지만 같은 문장을 원하는 말투로 생성시키고자 하려면 text-token-only RL만으로 충분하지 않을 것이다.</p>
<hr>
<h2 id="8-주요-결과와-시사점">8. 주요 결과와 시사점</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/5f4409a0-e643-4e06-a225-dc5e74ab8137/image.png" alt=""></p>
<p>Moshi와 PersonaPlex 모두 RL 이후 pause handling, turn-taking, backchanneling, interruption 성능이 전반적으로 향상되었다. 특히 Moshi의 interruption latency는 1.377초에서 최대 0.409초로 감소했고, PersonaPlex의 turn-taking latency는 0.219초에서 0.079초까지 감소했다. </p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/70dc2888-7a50-470d-a2bd-4b6f78255679/image.png" alt=""></p>
<p>LLM Judge reward를 제거하면 semantic score뿐 아니라 멀티턴 turn-taking과 instruction-following 성능도 크게 떨어졌다. 이는 interaction reward만으로 학습할 경우 의미 품질이 손상될 수 있음을 보여준다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] OpenS2S]]></title>
            <link>https://velog.io/@sujin-koo/Paper-Review-OpenS2S</link>
            <guid>https://velog.io/@sujin-koo/Paper-Review-OpenS2S</guid>
            <pubDate>Sun, 12 Jul 2026 01:08:28 GMT</pubDate>
            <description><![CDATA[<p>OpenS2S는 사용자의 음성에 담긴 언어적 내용과 감정, 억양, 말투 같은 준언어적 정보를 이해하고, 이에 맞는 공감적 텍스트와 감정이 표현된 음성 응답을 생성하는 오픈소스 Speech-to-Speech 모델이다.</p>
<p>다만 OpenS2S는 응답 텍스트가 모두 완성되기 전부터 speech token과 waveform을 순차적으로 생성하지만, Moshi나 PersonaPlex처럼 사용자가 말하는 동안에도 동시에 듣고 말하는 구조는 아니다.</p>
<p>이 논문은 다음 내용을 확인하기 위해 읽었다.</p>
<ul>
<li>준언어적 정보를 모델에 어떤 방식으로 학습했는가?</li>
<li>Speech Understanding과 Speech Generation의 학습방법</li>
<li>어떤 감정 데이터와 공감형 대화 데이터를 사용했는가?</li>
<li>사용자의 감정 이해와 출력 음성의 감정을 어떻게 평가했는가?</li>
</ul>
<hr>
<h2 id="1-연구-목표">1. 연구 목표</h2>
<p>강력한 공감형 Speech Language Model 상당수는 폐쇄형이며, 일부 공개 모델도 가중치만 제공하고 학습 데이터나 pre-training 코드는 공개하지 않는다. 또한 기존 Speech LLM은 음성의 텍스트 의미는 잘 처리해도 감정, 말투, 억양과 같은 준언어적 단서를 실제 응답 생성에 충분히 반영하지 못하는 경우가 있다.</p>
<p>OpenS2S는 비교적 적은 데이터와 계산량으로 공감형 S2S 모델을 구축하고, 데이터부터 모델 학습 코드까지 전체 pipeline을 공개하는 것을 목표로 한다. </p>
<hr>
<h2 id="2-모델-구조">2. 모델 구조</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/4e2286bc-af92-46b9-9b67-c7db0b11f0f7/image.png" alt=""></p>
<p>OpenS2S는 네 개의 주요 모듈로 구성된다.</p>
<table>
<thead>
<tr>
<th>모듈</th>
<th>사용 모델</th>
<th>역할</th>
</tr>
</thead>
<tbody><tr>
<td>Audio Encoder</td>
<td>Qwen2-Audio Encoder</td>
<td>입력 음성의 의미 및 음향 정보 추출</td>
</tr>
<tr>
<td>LLM</td>
<td>Qwen3-8B-Instruct</td>
<td>사용자 음성을 이해하고 응답 내용 생성</td>
</tr>
<tr>
<td>Streaming Speech Decoder</td>
<td>Qwen3-1.8B 기반</td>
<td>LLM hidden state를 speech token으로 변환</td>
</tr>
<tr>
<td>Token2Wav Decoder</td>
<td>GLM-4-Voice 기반</td>
<td>Speech token을 streaming waveform으로 변환</td>
</tr>
</tbody></table>
<h3 id="audio-encoder">Audio Encoder</h3>
<p>Qwen2-Audio Encoder가 입력 waveform을 25Hz의 continuous representation으로 변환한다. 이후 두 개의 CNN layer로 구성된 Speech Adapter가 sequence length를 4배 줄여 6.25Hz 표현을 만든다.</p>
<p>이 표현은 LLM이 처리할 수 있는 입력 embedding으로 사용된다. </p>
<p>중요한 점은 OpenS2S가 별도의 emotion encoder나 prosody encoder를 새로 추가하지 않았다는 것이다. 감정을 다루는 핵심은 특수한 구조보다는 이후의 <strong>Emotional Alignment 학습</strong>에 있다.</p>
<p>즉, Qwen2-Audio Encoder가 추출한 범용 음성 표현 중 감정과 관련된 정보를 Speech Adapter가 LLM에 전달할 수 있도록 학습한다.</p>
<h3 id="llm">LLM</h3>
<p>Qwen3-8B-Instruct는 Audio Encoder가 만든 speech representation과 text instruction을 입력받아 응답 내용을 생성한다.</p>
<p>LLM의 final hidden state는 최종 waveform 자체가 아니라, 이후 Speech Decoder가 “무엇을 말해야 하는지” 판단하기 위한 조건으로 사용된다.</p>
<h3 id="streaming-speech-decoder">Streaming Speech Decoder</h3>
<p>Speech tokenizer는 Whisper-large-v3 Encoder에 quantization module을 추가한 구조이며, GLM-4-Voice의 pretrained tokenizer를 사용한다.</p>
<ul>
<li>Token rate: 12.5Hz</li>
<li>Vocabulary size: 16,384</li>
<li>Decoder initialization: Qwen3-1.8B</li>
</ul>
<p>Speech Decoder는 LLM hidden state 4개를 소비할 때마다 speech token 8개를 생성한다.</p>
<pre><code class="language-text">LLM hidden states 4개
→ speech tokens 8개
→ 다음 hidden states 4개
→ 다음 speech tokens 8개</code></pre>
<p>이는 text와 audio 정보를 하나의 token으로 합친다는 뜻이 아니라, LLM representation을 일정한 간격으로 읽으면서 speech token을 생성한다는 의미이다. </p>
<p>Speech token은 supervised ASR encoder 기반의 semantic token이므로 발음과 언어적 내용을 강하게 표현할 것으로 예상된다. 감정과 억양 정보도 일부 포함될 수 있지만, 논문에는 speech token 안에 semantic, speaker, emotion 정보가 각각 얼마나 포함되는지 분석한 probing 실험은 없다.</p>
<h3 id="token2wav-decoder">Token2Wav Decoder</h3>
<p>생성된 speech token은 chunk-aware causal flow matching model을 통해 mel-spectrogram으로 변환되고, HiFi-GAN vocoder를 거쳐 waveform이 된다.</p>
<p>두 모듈 모두 GLM-4-Voice의 pretrained component를 사용한다. </p>
<hr>
<h2 id="3-학습-방법">3. 학습 방법</h2>
<p>OpenS2S는 다음 세 단계로 학습된다.</p>
<pre><code class="language-text">Stage 1. Speech Understanding Pre-training
Stage 2. Speech Generation Pre-training
Stage 3. Empathetic Speech Instruction Tuning</code></pre>
<p>Understanding과 Generation을 분리한 이유는 두 문제가 서로 반대 방향의 mapping이기 때문이다.</p>
<pre><code class="language-text">Speech Understanding:
사용자 음성 → LLM이 이해할 수 있는 표현

Speech Generation:
LLM 표현 → 응답 음성</code></pre>
<p>완전한 공감형 S2S 대화 데이터는 부족하지만 ASR, SER, TTS 데이터는 상대적으로 풍부하다. 따라서 각 능력을 별도 데이터로 먼저 학습하고, 마지막 instruction tuning에서 하나의 S2S 모델로 연결한다.</p>
<hr>
<h3 id="31-speech-understanding-pre-training">3.1 Speech Understanding Pre-training</h3>
<h4 id="semantic-alignment">Semantic Alignment</h4>
<p>의미 이해에는 다음 ASR 데이터를 사용한다.</p>
<ul>
<li>LibriSpeech</li>
<li>CommonVoice 13.0</li>
<li>GigaSpeech M subset</li>
<li>WeNetSpeech</li>
</ul>
<p>영어 약 190만 speech-text pair와 비슷한 규모의 중국어 데이터를 사용한다. </p>
<p>먼저 transcript를 입력받은 LLM이 continuation을 생성한다. 이후 같은 문장의 실제 음성을 입력해도 동일한 continuation을 생성하도록 Speech Adapter를 학습한다.</p>
<pre><code class="language-text">Transcript → LLM → target continuation

Speech → Audio Encoder → Adapter → LLM
       → 같은 continuation</code></pre>
<p>Audio embedding과 text embedding을 직접 동일하게 만드는 것이 아니라, 두 입력에 대해 LLM이 같은 행동을 하도록 맞추기 때문에 저자들은 이를 behavioral alignment로 설명한다. </p>
<h4 id="emotional-alignment">Emotional Alignment</h4>
<p>감정 학습에는 다음 SER 데이터셋을 사용한다.</p>
<ul>
<li>IEMOCAP</li>
<li>MELD</li>
<li>CMU-MOSEI</li>
<li>MEAD</li>
<li>ESD</li>
</ul>
<p>영어와 중국어를 합쳐 약 7만 utterance이다. </p>
<p>먼저 LLM에 transcript와 정답 emotion label을 함께 입력하여 emotion-aware continuation을 생성한다. 이후 실제 speech만 입력해도 같은 continuation을 생성하도록 Speech Adapter를 학습한다.</p>
<pre><code class="language-text">Transcript + emotion label
→ LLM
→ emotion-aware continuation

Speech only
→ Audio Encoder
→ Speech Adapter
→ LLM
→ 같은 continuation</code></pre>
<p>이 방식은 단순한 SER classification과 다르다.</p>
<pre><code class="language-text">일반 SER:
Speech → sad

OpenS2S Emotional Alignment:
Speech → 감정 이해 → 감정이 반영된 언어적 continuation</code></pre>
<p>이 단계에서는 Audio Encoder와 LLM을 고정하고 Speech Adapter만 학습한다. </p>
<p>다만 서로 다른 SER 데이터셋의 감정 label을 어떻게 통합했는지는 논문과 공식 repository에 명확한 mapping table이 없다. OpenS2S가 BLSP-Emo의 학습 방식을 기반으로 한다고 설명하지만, IEMOCAP, MELD, CMU-MOSEI, MEAD, ESD의 원래 label이 최종적으로 어떤 공통 label로 변환되었는지 추가적인 확인이 필요할 것 같다.</p>
<p>또한 감정과 발화 내용이 강하게 연관된 샘플에서는 모델이 실제 억양이 아니라 transcript의 의미만으로 감정을 추론할 수 있다. 같은 문장을 여러 감정으로 발화한 controlled evaluation이나 prosody ablation이 없어, acoustic emotion 정보의 순수한 기여도 역시 궁금한 부분이다.</p>
<hr>
<h3 id="32-speech-generation-pre-training">3.2 Speech Generation Pre-training</h3>
<p>Speech Generation에는 Emilia에서 추출한 다음 데이터를 사용한다.</p>
<ul>
<li>영어 5,000시간</li>
<li>중국어 5,000시간</li>
</ul>
<p>먼저 Qwen3-1.8B 기반 Speech Decoder가 text를 입력받아 speech token을 생성하도록 offline TTS 학습을 수행한다.</p>
<p>그다음 영어와 중국어 각각 1,000시간을 이용해 LLM hidden state와 Speech Decoder를 연결하고 streaming interleaved generation을 학습한다. </p>
<p>Stage 2의 학습 대상은 다음과 같다.</p>
<table>
<thead>
<tr>
<th>단계</th>
<th>Frozen</th>
<th>Trainable</th>
</tr>
</thead>
<tbody><tr>
<td>Offline TTS</td>
<td>조건에 따라 다름</td>
<td>Speech Decoder</td>
</tr>
<tr>
<td>Streaming 연결</td>
<td>LLM</td>
<td>Linear Projection, Speech Decoder</td>
</tr>
</tbody></table>
<hr>
<h3 id="33-empathetic-speech-instruction-tuning">3.3 Empathetic Speech Instruction Tuning</h3>
<p>Stage 2까지만 학습한 모델은 명시적인 TTS instruction에서는 speech token을 생성하지만, 일반적인 음성 대화 instruction에는 안정적으로 응답하지 못했다.</p>
<p>이를 해결하기 위해 마지막 단계에서는 공감형 Speech-to-Speech instruction data로 모델을 fine-tuning한다.</p>
<ul>
<li>Audio Encoder: Frozen</li>
<li>Speech Adapter: Trainable</li>
<li>LLM: Trainable</li>
<li>Linear Projection: Trainable</li>
<li>Speech Decoder: Trainable</li>
</ul>
<p>Speech-to-Speech 데이터만 학습하면 text input에 대한 speech generation이 약해졌기 때문에 Text-to-Speech instruction data도 함께 사용한다. </p>
<hr>
<h2 id="4-공감형-데이터-자동-구축">4. 공감형 데이터 자동 구축</h2>
<p>개인적으로 이 논문의 가장 큰 기여는 모델 구조보다 <strong>공감형 Speech-to-Speech 데이터를 자동으로 구축한 pipeline</strong>이라고 생각한다.</p>
<h3 id="seed-audio-준비">Seed audio 준비</h3>
<p>여러 SER 데이터셋에서 영어 1,000개와 중국어 1,000개의 seed audio를 선정하고 다음 정보를 수동으로 라벨링한다.</p>
<ul>
<li>Transcript</li>
<li>Emotion</li>
<li>Gender</li>
<li>Age</li>
</ul>
<h3 id="사용자-발화-생성">사용자 발화 생성</h3>
<p>Qwen3-32B-Instruct가 emotion, gender, age 등의 조건과 관련된 사용자 문장을 생성한다.</p>
<p>예를 들어 <code>Age: Elderly</code> 조건에 대해 다음과 같은 문장을 만들 수 있다.</p>
<blockquote>
<p>Do you think I can run a marathon?</p>
</blockquote>
<p>이후 elderly로 라벨링된 seed audio를 CosyVoice2의 reference로 사용해 새로운 사용자 음성을 합성한다.</p>
<p>CosyVoice2가 숫자로 된 age condition을 직접 제어하는 것은 아니다. 해당 연령대의 reference voice를 선택해 나이와 화자 특성을 간접적으로 반영한다.</p>
<p>이 과정으로 영어와 중국어 각각 50,000개의 사용자 음성을 생성한다. </p>
<h3 id="공감적-응답-생성">공감적 응답 생성</h3>
<p>Qwen3-32B-Instruct에 다음 정보를 제공한다.</p>
<pre><code class="language-text">사용자 transcript
사용자 emotion
사용자 gender
사용자 age</code></pre>
<p>LLM은 다음 두 가지를 생성한다.</p>
<ol>
<li>짧고 대화에 적합한 공감적 응답</li>
<li>그 응답을 전달하기에 적절한 response emotion</li>
</ol>
<p>이후 CosyVoice2가 response text를 해당 emotion으로 합성한다. </p>
<p>사용자 감정과 응답 감정을 단순히 동일하게 맞추지 않는다는 점이 중요하다.</p>
<pre><code class="language-text">User angry
→ Assistant neutral / apologetic / concerned

User sad
→ Assistant concerned / gentle / hopeful</code></pre>
<p>최종 데이터 규모는 다음과 같다.</p>
<ul>
<li>공감형 S2S: 영어 50k + 중국어 50k</li>
<li>일반 instruction S2S: 영어·중국어 총 100k</li>
</ul>
<p>사용자 음성에는 다양한 speaker, age, gender, emotion이 포함되지만, assistant response는 young female voice로 고정하고 emotion만 변화시킨다. </p>
<p>공식 데이터는 Hugging Face에 공개되어 있으며, query와 response audio를 개별 row로 계산한 Dataset Viewer에는 약 392,000개의 audio row가 표시된다.</p>
<hr>
<h2 id="5-평가">5. 평가</h2>
<h3 id="speech-to-text-평가">Speech-to-Text 평가</h3>
<p>일반적인 spoken instruction-following 능력은 VoiceBench로 평가한다.</p>
<ul>
<li>alpacaeval</li>
<li>commoneval</li>
<li>ifeval</li>
<li>wildvoice</li>
</ul>
<p>감정 이해는 URO-Bench의 다음 subset을 사용한다.</p>
<ul>
<li>UnderEmotion-en</li>
<li>UnderEmotion-zh</li>
</ul>
<p>OpenS2S의 결과는 다음과 같다.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/61204961-5813-48ab-9aad-ec1611696430/image.png" alt=""></p>
<p>OpenS2S는 일반적인 instruction-following에서 비슷한 규모의 공개 모델과 경쟁력 있는 결과를 보이지만, UnderEmotion에서는 Kimi-Audio와 GLM-4-Voice보다 낮다. </p>
<h3 id="underemotion의-실제-평가-대상">UnderEmotion의 실제 평가 대상</h3>
<p>UnderEmotion-en은 137개, UnderEmotion-zh는 79개의 샘플로 구성된다. 사용자 음성의 감정을 이해하고 공감적 응답 내용을 생성했는지를 평가한다.</p>
<p>응답 음성은 먼저 ASR로 전사되고, GPT Judge가 다음 정보를 사용해 1~5점으로 평가한다.</p>
<pre><code class="language-text">사용자 발화 transcript
사용자의 정답 emotion
모델 응답 transcript
추천 응답</code></pre>
<p>따라서 OpenS2S의 UnderEmotion 결과는 <strong>사용자 감정 이해와 response content의 적절성</strong>을 보여주지만, 생성된 응답 음성 자체의 감정 표현력을 보여주는 결과는 아니라고 생각이 든다. </p>
<hr>
<h2 id="6-정리">6. 정리</h2>
<p>OpenS2S에서 준언어적 정보를 처리하는 핵심은 새로운 emotion-specific architecture가 아니라 다음 두 가지다.</p>
<ol>
<li>SER 데이터를 이용해 speech가 emotion-aware continuation을 생성하도록 정렬하는 Emotional Alignment</li>
<li>LLM과 controllable TTS를 이용한 공감형 Speech-to-Speech instruction data 구축</li>
</ol>
<p>모델 자체는 Qwen2-Audio, Qwen3, GLM-4-Voice, CosyVoice2 등 기존 공개 모듈을 조합한다. 차별점은 이 모듈들을 연결하는 multi-stage training recipe와 자동 데이터 구축 pipeline에 있다.</p>
<p>UnderEmotion 데이터셋의 경우에는 모델 응답 음성의 tone이 아니라 ASR transcript의 공감 적절성을 평가하는 것 같긴한데, 실제로 다운받아 테스트하면서 더 파악해볼 필요가 있을 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] PHOENIX-VAD: STREAMING SEMANTIC ENDPOINT DETECTION FOR FULL-DUPLEX SPEECH INTERACTION]]></title>
            <link>https://velog.io/@sujin-koo/Paper-Review-PHOENIX-VAD-STREAMING-SEMANTIC-ENDPOINT-DETECTION-FOR-FULL-DUPLEX-SPEECH-INTERACTION-foqiilbn</link>
            <guid>https://velog.io/@sujin-koo/Paper-Review-PHOENIX-VAD-STREAMING-SEMANTIC-ENDPOINT-DETECTION-FOR-FULL-DUPLEX-SPEECH-INTERACTION-foqiilbn</guid>
            <pubDate>Mon, 22 Jun 2026 18:12:15 GMT</pubDate>
            <description><![CDATA[<hr>
<p><strong>Overview</strong></p>
<p>One of the most critical challenges in building a full-duplex dialogue model is achieving naturalistic turn-taking — the model should know when to respond and when to keep listening. This paper introduces Phoenix-VAD, an LLM-based approach that detects speech endpoints using semantic information, enabling smoother turn transitions. Since LLMs already have strong semantic understanding, the central question becomes: <em>how do we apply that capability in a streaming environment?</em> The authors answer this with a sliding window strategy.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/a8383773-a3c7-48e8-b355-72bbf67b40fb/image.png" alt=""></p>
<hr>
<p><strong>Background &amp; Motivation</strong></p>
<p>Early full-duplex systems relied on acoustic VAD, which only distinguishes speech from silence. This evolved into Semantic VAD (using ASR + a lightweight LLM), and further into models like Moshi (real-time streaming LLM), LSLM (autoregressive generation integrated with turn-taking detection), and Freeze-Omni / MinMo / Mini-Omni2 (which add a linear layer to predict user interruption intent).</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/b3df66c0-a748-4a34-a031-6ff4da9d1d4a/image.png" alt=""></p>
<p>Phoenix-VAD positions itself against all of these by claiming four properties simultaneously: ASR-free, plug-and-play, real-time inference, and semantic capability — something none of the prior works fully achieve together.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/0033410d-d850-43b9-ab97-b1c32e7f25f4/image.png" alt=""></p>
<hr>
<p><strong>Method</strong></p>
<p>The approach is conceptually straightforward. Audio is processed chunk-by-chunk using a sliding window during training. The sliding window is defined on 100 Hz Fbank features (stride = 320 ms, window = 2560 ms), which are then passed through a frozen Zipformer encoder (~150M params) that internally downsamples by 4×, producing 25 Hz frame-level representations. These are projected through a lightweight adapter (two linear layers + ReLU) and fed into a fine-tuned LLM (Qwen2.5-0.5B-Instruct with LoRA). The model is prompted as a voice activity detector and trained to predict one of two tokens per <strong>chunk: 0 (Continue Speaking) or 1 (Stop Speaking)</strong>.</p>
<hr>
<p><strong>Data Construction</strong></p>
<p>Labels are binary (Continue / Stop), which feels simple but seems to work. The dataset was constructed synthetically:</p>
<ul>
<li>Text samples were generated using the ChatGPT API combined with internal resources.</li>
<li>Speech was synthesized using Index-TTS, with speaker diversity ensured by randomly sampling from a timbre library of 1,007 English and 1,010 Chinese prompts from seed-tts-eval.</li>
<li>Hesitations and interruptions were simulated by inserting silent segments.</li>
<li>Timestamps were annotated using Paraformer.</li>
</ul>
<p>Total: <del>400,000 samples (</del>570 hours). Test set: 2,000 complete + 2,000 incomplete samples.</p>
<hr>
<p><strong>Experiments</strong></p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/d5e27c71-0d58-4c0d-9d8f-caae7f1b0f02/image.png" alt=""></p>
<p>The confusion matrix rows represent GT (Ground Truth), the actual label, and the columns represent Est (Estimation), the model&#39;s prediction.</p>
<p>For the semantically incomplete dataset (Table 2):</p>
<p>GT=Stop, Est=Stop: 1784 → correctly predicted as end of speech
GT=Stop, Est=Continue: 216 → user finished speaking, but model kept listening
GT=Continue, Est=Stop: 101 → user was still speaking, but model cut off
GT=Continue, Est=Continue: 19662 → correctly predicted as ongoing speech</p>
<p>For the semantically complete dataset (Table 3):</p>
<p>GT=Stop, Est=Stop: 1775 → correctly predicted as end of speech
GT=Stop, Est=Continue: 225 → user finished speaking, but model kept listening
GT=Continue, Est=Stop: 148 → user was still speaking, but model cut off
GT=Continue, Est=Continue: 24826 → correctly predicted as ongoing speech</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/4a4e286f-c959-4bc7-b88b-9d7b51996814/image.png" alt=""></p>
<p>The ablation study examines two design choices. First, reducing the chunk size from 320 ms to 160 ms hurts performance — the model benefits from having more audio context per prediction step, particularly near speech boundaries where the signal is ambiguous. Second, pretraining the adapter on ASR data alone and freezing it during LLM fine-tuning also degrades performance. An ASR-trained adapter is optimized for &quot;what word is this?&quot; rather than &quot;is the speech finished?&quot;, so it passes less useful information to the LLM for boundary detection. Training the adapter jointly with LoRA allows it to learn the temporal cues actually needed for endpoint detection.</p>
<hr>
<p><strong>Compute</strong></p>
<p>It&#39;s refreshing to see resource usage explicitly reported. Training used 32 × NVIDIA A100 80GB GPUs (batch size 64, 1 epoch). Evaluation ran on a single NVIDIA A6000 48GB, with each prediction taking ~50 ms — sufficient for real-time use.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Digging Into the Moshi Model's Code]]></title>
            <link>https://velog.io/@sujin-koo/Digging-Into-the-Moshi-Models-Code</link>
            <guid>https://velog.io/@sujin-koo/Digging-Into-the-Moshi-Models-Code</guid>
            <pubDate>Sun, 21 Jun 2026 14:06:47 GMT</pubDate>
            <description><![CDATA[<p>Today I took a closer look at how the Moshi model actually works under the hood, code-wise.</p>
<p>Moshi is fundamentally a model designed to listen and speak at the same time. Because of this, unlike typical TTS models, it has a rather unusual setup: the user stream and the Moshi stream are kept separate. Even during training, the backbone LLM — Helium (an RQ-Transformer) — needs to learn natural conversation, so it&#39;s trained on stereo audio rather than mono.</p>
<p>A bit of a tangent here: when I talk with AI, sometimes it&#39;s just me and the AI, but often it&#39;s me, a friend, and the AI together — for example, my friend and I chatting while occasionally throwing a question at the AI. One thing that&#39;s bothered me in these situations is that the AI tends to treat the conversation between me and my friend as if it were directed at itself, jumping in and interrupting our conversation or giving unnecessary responses. I suspect multi-speaker conversational models that account for this will eventually emerge. Current models still assume two speakers (largely a dataset limitation, I&#39;d guess), and extending this to multiple speakers — or applying it to conversational robots — still leaves a lot of open problems. Even though the field has moved incredibly fast, it feels like there&#39;s still a lot left to solve.</p>
<p>Anyway, back to the main topic. Since Moshi takes in both the user stream and the Moshi stream, both inputs are fed together during training.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/b7c054ef-3cb3-4316-ab53-e209b585e930/image.png" alt=""></p>
<p>I drew this diagram together with a friend while we were trying to wrap our heads around Moshi. As you can see: the user&#39;s audio → Mimi tokens, Moshi&#39;s audio → Mimi tokens, and on top of that, Moshi has something called an &quot;inner monologue&quot; — essentially a built-in ASR capability. (It lets Moshi track what it&#39;s saying directly, without an external ASR, while also helping it generate better responses.) These three components are combined and fed as input into the Temporal Transformer. The output is an intermediate temporal-context latent, which is then used to predict the inner monologue, while the rest is passed as a condition into the Depth Transformer. The Depth Transformer then autoregressively predicts blank → Mimi semantic tokens → Mimi acoustic tokens, and this final output becomes Moshi&#39;s next response.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/e7793316-fef5-4ad2-9b9f-a23b941282bc/image.png" alt=""></p>
<p>Honestly, the first time I read the Moshi paper, a lot of how it worked was confusing to me. But going through the code and tracing the dimensions of the inputs and outputs really helped the overall flow click into place.</p>
<p><strong>Relevant code repositories:</strong></p>
<ul>
<li>Moshi: <a href="https://github.com/kyutai-labs/moshi">https://github.com/kyutai-labs/moshi</a></li>
<li>Moshi Finetuning: <a href="https://github.com/kyutai-labs/moshi-finetune">https://github.com/kyutai-labs/moshi-finetune</a></li>
<li>Japanese Moshi Finetuning: <a href="https://github.com/nu-dialogue/moshi-finetune">https://github.com/nu-dialogue/moshi-finetune</a></li>
</ul>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/98c071e1-1826-4db0-8bff-412e6d80602d/image.png" alt=""></p>
<p>One thing worth noting while digging through the code: only the training code for the RQ-Transformer is provided — the training code for the Mimi codec itself is not. That&#39;s probably why subsequent papers building on Mimi codec tend to just reuse the existing checkpoint as-is. (You could train your own, sure, but training on large-scale data is a real burden.)</p>
<p>An interesting detail is that in Japanese Moshi, the authors apparently found that reusing the Mimi checkpoint as-is already gave good enough performance, so they didn&#39;t bother retraining it for Japanese. From an acoustic standpoint, that makes sense since there&#39;s likely little language dependency. But from a semantic standpoint, I would have expected some language dependency that could hurt token-prediction performance when training Moshi later — so this result was a bit surprising. I&#39;d guess this approach probably wouldn&#39;t hold up if you wanted to push performance to a truly production-ready level, but it&#39;s a useful reference paper to keep in mind when training a Korean version.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] DialogueSidon: Recovering Full-Duplex Dialogue Tracks from In-the-Wild Dialogue Audio]]></title>
            <link>https://velog.io/@sujin-koo/Paper-Review-DialogueSidon-Recovering-Full-Duplex-Dialogue-Tracks-from-In-the-Wild-Dialogue-Audio</link>
            <guid>https://velog.io/@sujin-koo/Paper-Review-DialogueSidon-Recovering-Full-Duplex-Dialogue-Tracks-from-In-the-Wild-Dialogue-Audio</guid>
            <pubDate>Sat, 13 Jun 2026 22:38:10 GMT</pubDate>
            <description><![CDATA[<p>How can we make a better dataset from in-the-wild data for training full-duplex models?</p>
<hr>
<h2 id="✔️-background">✔️ Background</h2>
<p>Training a full-duplex spoken dialogue model requires dialogue recordings where each speaker is on a separate track — but such &quot;stereo&quot; data is scarce and expensive to collect (telephone corpora, controlled recording setups). What&#39;s abundant instead is in-the-wild internet audio: monaural mixtures where both speakers&#39; voices are mixed together and the signal is degraded (noise, reverb, compression, clipping). This makes it unusable directly for full-duplex training. DialogueSidon tackles this gap by jointly restoring and separating a degraded monaural two-speaker mixture back into two clean, speaker-wise tracks — turning &quot;found&quot; internet audio into full-duplex training data.</p>
<h2 id="✔️-paper-info">✔️ Paper Info</h2>
<ul>
<li>Title: DialogueSidon: Recovering Full-Duplex Dialogue Tracks from In-the-Wild Dialogue Audio (<a href="https://arxiv.org/abs/2604.09344">https://arxiv.org/abs/2604.09344</a>)</li>
<li>Authors : Wataru Nakata, Yuki Saito, Kazuki Yamauchi, Emiru Tsunoo, Hiroshi Saruwatari</li>
<li>Affiliation: The University of Tokyo, National Institute of Advanced Industrial Science and Technology (AIST)</li>
<li>Conference: SIGDIAL2026 (Long paper)</li>
<li>Keywords: Speech Conversational dataset</li>
</ul>
<h2 id="✔️-main-problem-and-key-approach">✔️ Main Problem and Key Approach</h2>
<h3 id="limitations-of-previous-works">Limitations of previous works</h3>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/26d31bdf-58fb-47c8-8d0f-3ab7e440be9e/image.png" alt=""></p>
<p>Recording real conversations (Fisher, CALLHOME) or controlled two-party setups is costly, suffers from channel/latency artifacts, and doesn&#39;t scale.
TTS-synthesized dialogues (e.g., Moshi-style pipelines) are driven by turn-based text scripts, so they lack natural overlap, backchannels, and timing variability.
In-the-wild internet audio is plentiful and stylistically diverse, but (1) heavily degraded and (2) only available as a single mixed-down track, not speaker-wise.</p>
<p>Why a simple restoration → separation (or vice versa) cascade doesn&#39;t work:</p>
<p>Restoration first: monologue-trained restoration models tend to treat speaker overlap itself as &quot;noise&quot; and suppress or distort it.
Separation first: separation models aren&#39;t robust to the heavy, compounded degradations typical of internet audio.</p>
<p>Key idea: extend Sidon — a prior SSL-latent-space restoration model built for single-speaker monologue — into the dialogue setting by adding a speaker-separation capability, so a single degraded mono mixture is mapped to two clean speaker-wise waveforms in one unified model.</p>
<h2 id="✔️-architecture--method">✔️ Architecture &amp; Method</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/470e2138-6269-42f5-8c49-1572e5c26906/image.png" alt=""></p>
<p>DialogueSidon is trained in two stages, both operating in a compact latent space derived from a frozen SSL model (w2v-BERT 2.0).</p>
<p>Stage 1 — SSL-VAE (defines the latent space for clean speech)</p>
<p>A frozen SSL model extracts a high-dimensional (1,536-d) hidden feature from clean speech.
A trainable encoder (2-layer linear + ReLU + variational bottleneck) compresses this into a much smaller latent z (dimension D).
A trainable decoder (based on the Descript Audio Codec / HiFi-GAN-style vocoder with Snake activation) reconstructs the waveform from z.
Trained with reconstruction + adversarial + KL losses. D was swept over {8, 16, 32, 64, 128}.</p>
<p>Stage 2 — Diffusion-based latent predictor (recovers speaker-wise latents from the degraded mix)</p>
<p>A conditioning feature c is extracted from the degraded mixture using a different SSL layer, fine-tuned with LoRA (rank 64) so it adapts to degraded audio while keeping pretrained knowledge.
Auxiliary heads: two linear projections from c give coarse speaker-wise latent estimates. These are matched to ground-truth latents via permutation-invariant training (PIT), which resolves the &quot;who is speaker 1 vs 2&quot; ambiguity and fixes a permutation π* for the rest of the pipeline.
Diffusion refinement: a Diffusion Transformer (DiT, 768-dim, 8 layers, 12 heads, RoPE) takes the stacked two-speaker latents, conditions on c and the auxiliary estimates, and refines them via v-prediction. Training uses a 1,000-step linear noise schedule; inference uses DPM-Solver++ with just 30 steps.
Total loss = auxiliary PIT loss + diffusion v-prediction loss.</p>
<p>At inference, the pipeline is: degraded mix → conditioning feature → coarse auxiliary latents → diffusion refinement → SSL-VAE decoder → two clean speaker waveforms.</p>
<h2 id="✔️-dataset">✔️ Dataset</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/58215298-5d9f-4610-abd1-f821872eca64/image.png" alt=""></p>
<p>CALLHOME (German, English, Japanese, Spanish, Mandarin) + Fisher English — 2,225.9 hours total of telephone conversations, themselves first cleaned with Sidon. To simulate &quot;in-the-wild&quot; degradation, a 7-stage pipeline (reverb via room simulation, background noise from AudioSet/FMA/WHAM!/FSD50K/wind noise, random resampling for band-limiting, clipping, MP3 codec, packet loss, then weighted mixing into mono) was applied 4× per session with different seeds, yielding ~8,902 hours of paired clean/degraded dialogue.</p>
<h2 id="✔️-results">✔️ Results</h2>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/ceb76e4e-9295-4e7e-a901-3e212ec62aef/image.png" alt=""></p>
<p>Latent size ablation (SWB): All DialogueSidon variants massively beat the baselines on WER. D=32 was best at 14.39% WER vs. 33.54% (retrained GENESES), 57.47% (Sidon), and 60.81% (Noisy). DialogueSidon doesn&#39;t top NISQA/DNSMOS, but wins on speaker similarity and VAD accuracy. D=128 degrades across the board, so D=32 was used for the rest of the experiments.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/a6d0a2ef-e938-434e-b147-867e03b96afb/image.png" alt=""></p>
<p>Subjective MOS (SWB): DialogueSidon 3.895 &gt; GENESES 3.482 &gt; Sidon 3.289 &gt; Noisy 2.815, all differences significant (p&lt;0.05).</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/72bba394-dd3a-4acb-9167-479f0ecbbfe3/image.png" alt=""></p>
<p>Multilingual (CallFriend, 5 languages): DialogueSidon consistently beats GENESES on p-CER (content preservation) and generally on speaker similarity / VAD accuracy, even though GENESES sometimes scores higher on NISQA/DNSMOS — suggesting GENESES trades content fidelity for smoother-sounding output. The large gap between GENESES (orig) and retrained GENESES across every language reinforces that training on conversational (not monologue) data matters a lot.</p>
<p><img src="https://velog.velcdn.com/images/sujin-koo/post/d3dda620-1081-4b48-880d-cca451f42ac3/image.png" alt=""></p>
<p>In-the-wild (OpenDialog): DialogueSidon&#39;s WER (13.86%) is far below GENESES (43.79%) and GENESES (orig) (74.51%). Predicted quality (NISQA/DNSMOS) again favors GENESES, but subjective MOS clearly favors DialogueSidon (3.708 vs 3.131 vs 2.611, all significant) — i.e., human listeners prefer DialogueSidon&#39;s content/speaker-consistency tradeoff even when automatic perceptual predictors don&#39;t.</p>
<hr>
<h2 id="✔️-resources">✔️ Resources</h2>
<ul>
<li><a href="https://arxiv.org/pdf/2604.09344">🧾 Paper</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[PLDA와 Cosine Similarity 차이점]]></title>
            <link>https://velog.io/@sujin-koo/PLDA%EC%99%80-Cosine-Similarity-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
            <guid>https://velog.io/@sujin-koo/PLDA%EC%99%80-Cosine-Similarity-%EC%B0%A8%EC%9D%B4%EC%A0%90</guid>
            <pubDate>Sun, 07 Jun 2026 14:57:10 GMT</pubDate>
            <description><![CDATA[<p>최근에 화자 분리 태스크를 보곤 했는데 음성 인식, 화자 인증, 얼굴 인식, 임베딩 검색 같은 분야를 보다 보면 자주 등장하는 비교 방식이 있습니다. 바로 <strong>Cosine Similarity</strong>와 <strong>PLDA</strong>입니다.</p>
<p>둘 다 “두 벡터가 얼마나 비슷한가?”를 판단하는 데 쓰이지만 차이가 있기 때문에 그 부분은 간단하게 정리하고자 합니다.</p>
<p>결론을 미리 말씀 드리자면, <strong>Cosine Similarity는 두 벡터의 방향이 얼마나 비슷한지 보는 단순한 거리 기반 방법</strong>이고, <strong>PLDA는 데이터의 통계적 분포를 학습해서 두 샘플이 같은 클래스에서 나왔을 가능성을 계산하는 확률 모델 기반 방법</strong>입니다.</p>
<p>최근 딥러닝 방법론에서 유사도를 구할 때는 cosine similarity 를 더 많이 사용하는 것 같다고 느끼긴 했습니다만, 화자 인증 분야에서는 x-vector, i-vector 같은 임베딩을 비교할 때는 둘 다 많이 사용되는 것 같습니다.</p>
<hr>
<h2 id="1-cosine-similarity란">1. Cosine Similarity란?</h2>
<p>Cosine Similarity는 두 벡터 사이의 <strong>각도</strong>를 이용해서 유사도를 계산하는 방법입니다. 두 벡터가 같은 방향을 바라보면 유사도가 높고, 서로 다른 방향을 바라보면 유사도가 낮습니다.</p>
<p>$$
\text{cosine_similarity}(\mathbf{a}, \mathbf{b}) = \frac{\mathbf{a} \cdot \mathbf{b}}{|\mathbf{a}| |\mathbf{b}|}
$$</p>
<p>여기서 중요한 점은 <strong>벡터의 크기보다는 방향</strong>을 본다는 것입니다.</p>
<p>예를 들어 두 임베딩 벡터가 있다고 해보겠습니다.</p>
<pre><code class="language-text">A = [0.2, 0.5, 0.8]
B = [0.21, 0.49, 0.79]</code></pre>
<p>두 벡터가 거의 같은 방향을 향하고 있다면 cosine similarity 값은 1에 가깝게 나옵니다.
반대로 방향이 많이 다르면 0 또는 음수에 가까워질 수 있습니다.</p>
<hr>
<h2 id="2-cosine-similarity의-특징">2. Cosine Similarity의 특징</h2>
<p>Cosine Similarity의 가장 큰 장점은 <strong>간단함</strong>입니다. 그냥 두 벡터만 있으면 바로 계산할 수 있다보니 다음과 같은 상황에서 많이 씁니다.</p>
<pre><code class="language-text">문장 임베딩 검색
이미지 임베딩 검색
얼굴 임베딩 비교
화자 임베딩 간단 비교
추천 시스템의 벡터 유사도 계산</code></pre>
<p>구현도 쉽습니다.</p>
<pre><code class="language-python">import numpy as np

def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))</code></pre>
<p>하지만 단점도 있습니다. Cosine Similarity는 데이터가 어떤 분포를 가지는지, 클래스 내부 변동이 얼마나 큰지, 클래스 간 차이가 어느 정도인지 전혀 고려하지 않습니다. 즉, “두 벡터의 방향성이 비슷한가?”만 봅니다.</p>
<hr>
<h2 id="3-plda란">3. PLDA란?</h2>
<p>PLDA는 <strong>Probabilistic Linear Discriminant Analysis</strong>의 약자입니다.</p>
<p>이름에서 알 수 있듯이 확률 모델입니다.</p>
<p>PLDA는 단순히 두 벡터의 각도만 보는 것이 아니라, 학습 데이터를 이용해서 다음과 같은 정보를 모델링합니다.</p>
<pre><code class="language-text">같은 사람의 임베딩들은 어느 정도 변할 수 있는가?
다른 사람의 임베딩들은 보통 얼마나 떨어져 있는가?
전체 임베딩 공간에서 클래스 간 분산과 클래스 내부 분산은 어떻게 다른가?</code></pre>
<p>화자 인증 예시로 보면 더 이해하기 쉽습니다.</p>
<p>같은 사람이 말해도 녹음 환경, 마이크, 감정, 발화 내용, 잡음 때문에 임베딩이 매번 완전히 같지는 않습니다.</p>
<pre><code class="language-text">같은 화자:
- 조용한 방에서 말한 음성
- 시끄러운 카페에서 말한 음성
- 전화로 말한 음성
- 감기 걸렸을 때 말한 음성</code></pre>
<p>이런 경우 같은 사람이어도 임베딩이 조금씩 달라집니다.</p>
<p>PLDA는 이런 <strong>within-class variation</strong>, 즉 같은 클래스 내부의 변동을 학습합니다.</p>
<p>동시에 서로 다른 화자들이 보통 얼마나 다르게 나타나는지도 학습합니다. 이것은 <strong>between-class variation</strong>, 즉 클래스 간 변동입니다.</p>
<hr>
<h2 id="4-plda의-기본-아이디어">4. PLDA의 기본 아이디어</h2>
<p>PLDA는 관측된 임베딩 벡터를 대략 이렇게 봅니다.
$$
x = \mu + Fh + \epsilon
$$</p>
<p>각 항의 의미는 다음과 같습니다.</p>
<table>
<thead>
<tr>
<th>항</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td>$x$</td>
<td>관측된 임베딩 벡터</td>
</tr>
<tr>
<td>$\mu$</td>
<td>전체 평균</td>
</tr>
<tr>
<td>$Fh$</td>
<td>클래스, 예를 들어 화자 고유의 특성</td>
</tr>
<tr>
<td>$\epsilon$</td>
<td>세션, 잡음, 환경 등으로 인한 변동</td>
</tr>
</tbody></table>
<p>즉 PLDA는 임베딩을 이렇게 나눠서 생각합니다.</p>
<pre><code class="language-text">임베딩 = 공통 평균 + 사람 고유 특성 + 녹음 환경/잡음/세션 변동</code></pre>
<p>이게 Cosine Similarity와 가장 큰 차이입니다.</p>
<p>Cosine Similarity는 두 벡터를 그냥 비교한다면 PLDA는 “이 정도 차이는 같은 사람끼리도 충분히 날 수 있는 차이인가?”, “아니면 다른 사람이라고 보는 게 더 자연스러운 차이인가?”를 확률적으로 판단합니다.</p>
<hr>
<h2 id="5-plda는-유사도가-아니라-likelihood-ratio를-계산한다">5. PLDA는 유사도가 아니라 likelihood ratio를 계산한다</h2>
<p>Cosine Similarity는 두 벡터 사이의 유사도 점수를 바로 계산합니다.</p>
<p>반면 PLDA는 보통 다음 두 가설을 비교합니다.</p>
<pre><code class="language-text">H_same: 두 임베딩은 같은 클래스, 예를 들어 같은 화자에서 나왔다.
H_diff: 두 임베딩은 서로 다른 클래스에서 나왔다.</code></pre>
<p>그리고 다음과 같은 점수를 계산합니다.</p>
<p>$$
\log \frac{P(x_1, x_2 \mid H_\text{same})}{P(x_1, x_2 \mid H_\text{diff})}
$$</p>
<p>이 값이 크면 “같은 사람일 가능성이 높다”고 보고, 작으면 “다른 사람일 가능성이 높다”고 봅니다. 즉 PLDA score는 단순 유사도가 아니라 <strong>같은 클래스일 가능성과 다른 클래스일 가능성의 비율</strong>에 가깝습니다.</p>
<hr>
<h2 id="6-결론">6. 결론</h2>
<p>가장 중요한 차이를 표로 정리하면 이렇습니다.</p>
<table>
<thead>
<tr>
<th>구분</th>
<th>Cosine Similarity</th>
<th>PLDA</th>
</tr>
</thead>
<tbody><tr>
<td>방식</td>
<td>벡터 간 각도 비교</td>
<td>확률 모델 기반 비교</td>
</tr>
<tr>
<td>학습 필요 여부</td>
<td>필요 없음</td>
<td>필요함</td>
</tr>
<tr>
<td>고려하는 정보</td>
<td>두 벡터의 방향</td>
<td>클래스 내부/클래스 간 분산</td>
</tr>
<tr>
<td>출력값</td>
<td>유사도 점수</td>
<td>log-likelihood ratio 성격의 점수</td>
</tr>
<tr>
<td>데이터 의존성</td>
<td>낮음</td>
<td>높음</td>
</tr>
<tr>
<td>대표 사용처</td>
<td>임베딩 검색, 간단 매칭</td>
<td>화자 인증, 얼굴 인증, 바이오메트릭 인증</td>
</tr>
</tbody></table>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[음성 대화모델, 요즘은 어떻게 평가할까]]></title>
            <link>https://velog.io/@sujin-koo/%EC%9D%8C%EC%84%B1-%EB%8C%80%ED%99%94%EB%AA%A8%EB%8D%B8-%EC%9A%94%EC%A6%98%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%8F%89%EA%B0%80%ED%95%A0%EA%B9%8C</link>
            <guid>https://velog.io/@sujin-koo/%EC%9D%8C%EC%84%B1-%EB%8C%80%ED%99%94%EB%AA%A8%EB%8D%B8-%EC%9A%94%EC%A6%98%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%8F%89%EA%B0%80%ED%95%A0%EA%B9%8C</guid>
            <pubDate>Sun, 31 May 2026 14:51:47 GMT</pubDate>
            <description><![CDATA[<p>최근 음성 대화모델 연구가 정말 활발하다. 특히 사용자의 말을 끝까지 다 듣고 나서야 대답하는 half-duplex 방식을 넘어, 듣는 동시에 말할 수 있는 <strong>full-duplex</strong> 모델들이 빠르게 등장하고 있다. 끼어들기(interruption), 멈춤(pause), 짧은 맞장구(backchannel)처럼 사람 사이의 대화에서 자연스럽게 일어나는 현상들을 다룰 수 있게 된 것이다.</p>
<p>그런데 모델이 발전하는 속도만큼, <strong>이걸 어떻게 평가할 것인가</strong>라는 질문도 같이 커지고 있다. 최근 벤치마크 논문들을 보면 공통적으로 가리키는 방향이 있는데, 그 흐름을 정리해 봤다.</p>
<hr>
<h2 id="single-round-→-multi-turn으로">Single-round → Multi-turn으로</h2>
<p>가장 큰 흐름은 평가 단위가 <strong>한 번의 응답에서 여러 라운드의 대화로</strong> 옮겨갔다는 점이다.</p>
<p>기존 벤치마크는 &quot;interruption 한 번 잘 처리하는가&quot;, &quot;pause 한 번 잘 받는가&quot; 같은 단발성 능력을 봤다. 하지만 실제 음성 인터페이스는 사용자가 계속 끼어들고, 멈췄다 다시 말하고, 소음이 섞이는 복합적인 상황이다. 끼어들기가 딱 한 번만 일어나는 대화는 없다.</p>
<p>그래서 같은 feature를 여러 라운드 반복했을 때, 혹은 여러 feature가 섞였을 때도 성능이 유지되는지가 중요해지고 있다. 실제로 이렇게 평가해 보면 라운드가 늘어날수록 성능이가 눈에 띄게 떨어지는 모델이 많았다. </p>
<p>결국 여러 턴에서도 안정적인 모델이 중요해지고 있다.</p>
<hr>
<h2 id="robustness">Robustness</h2>
<p>능력(capability) 측정에서 <strong>강건성(robustness) 측정</strong>으로 관점이 옮겨간 느낌이다.</p>
<p>현실에 가까워질수록(여러 feature 동시 발생, 배경 음성, barge-in 반복) 성능이 급격히 떨어진다. </p>
<p>기존 벤치마크가 이런 복합 조건을 잘 못 잡았다 보니, 모델의 실제 환경 성능을 제대로 평가해오지 못했다는 지적이 나온다. <strong>isolated test에서의 점수와 실제 서비스에서의 체감 성능 사이에 간극</strong>이 있었던 셈이다.</p>
<hr>
<h2 id="단일-지표-→-다차원-평가">단일 지표 → 다차원 평가</h2>
<p>단순히 하나의 지표만 보는 방식에서 벗어나, 여러 관점에서 동시에 평가하는 흐름이 분명하다.</p>
<p>예를 들어 대화 모델이라면 conversational timing이 좋은지뿐 아니라 instruction following을 유지하는지, 유해 요청을 거절하는지(safety), 응답 내용이 coherent한지를 함께 본다. 의료 같은 특정 도메인이라면 일반적인 받아쓰기 정확도(WER)에 더해, 질병·검사·처치·약물 같은 <strong>도메인 핵심 개념을 맞췄는지</strong>를 따로 측정하기도 한다(HC-WER). </p>
<p>여기서 한 발 더 나아가, transcript나 응답이 <strong>downstream에서 어떤 결과로 이어지는가</strong>까지 본다. 즉 모델 단독 성능보다 <strong>서비스 전체 관점에서의 평가</strong>가 중요해지고 있다. </p>
<hr>
<h2 id="latency">Latency</h2>
<p>latency가 점점 중요한 지표가 되고 있다. 단순히 첫 응답이 빨리 나오는지(first-packet latency)만 보는 게 아니라, <strong>응답이 자연스럽게 느껴지는 타이밍 안에 끝나는가</strong>까지 본다.</p>
<p>정해진 응답 window 안에 말을 다 끝내지 못해서, 내용 품질까지 같이 떨어지는 경우가 종종 발생한다. latency 는 단순히 빠르다, 느리다의 문제가 아니라 대화의 자연스러움과 내용 완성도에 핵심적인 요소로 다뤄지고 있다. </p>
<hr>
<h2 id="정리하면">정리하면</h2>
<p>점점 더 현실을 반영한 서비스 관점에서 벤치마크의 가치가 커지고 있다.</p>
<ul>
<li>단발성 능력 → 멀티턴·복합 조건에서의 지속 가능성</li>
<li>능력 측정 → 강건성 측정</li>
<li>단일 정확도 → timing·품질·정렬·안전성을 아우르는 다차원 평가</li>
<li>정확도만 → latency까지 포함한 자연스러움</li>
</ul>
<p>연구 흐름도 이제는 단일 모델 그 자체라기보다, <strong>하나의 큰 시스템 관점</strong>에서 이루어지고 있는 것 같다. </p>
]]></description>
        </item>
        <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[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>
    </channel>
</rss>