<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>ARIS Blog</title><description>Tsukimori Ahri&apos;s</description><link>https://ahri2nd.xyz/</link><language>en</language><item><title>Whisper V3 Turbo - Cohere Transcribe 전환기</title><link>https://ahri2nd.xyz/posts/whisper-to-cohere-transcribe/</link><guid isPermaLink="true">https://ahri2nd.xyz/posts/whisper-to-cohere-transcribe/</guid><description>STT 전사</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;일본어 컨텐츠&lt;s&gt;덕질&lt;/s&gt;를 자주 접하게 되면서 여러모로 음성-텍스트 전사를 필요로 하게 되었다.&lt;/p&gt;
&lt;p&gt;그러나 일본어, 한국어 등 화자 수가 적은 언어일수록 모델마다 성능편차도 심할뿐더러 정확도 또한 낮아진다는 문제가 있다.&lt;/p&gt;
&lt;p&gt;한동안 여러가지 STT 모델을 사용해보며 정착했던 두 가지 모델과 그 전환기를 작성해본다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;전문적이지 않을 뿐더러 파인튜닝을 하지 않았기에 차이가 있을 수 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;처음엔 당연히 Whisper를 선택했고, 한동안은 문제없이 썼다.&lt;/p&gt;
&lt;p&gt;그런데 쓰면 쓸수록 특정 패턴의 오류가 반복됐다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Whisper V3 Turbo를 선택한 이유&lt;/h2&gt;
&lt;p&gt;Whisper Large V3가 나왔을 때 성능은 훌륭했지만 속도가 문제였다. 그 다음 나온 V3 Turbo는 Large V3를 증류(distillation)해서 만든 약 800M 파라미터짜리 모델인데, 속도와 정확도의 균형이 꽤 좋았다.&lt;/p&gt;
&lt;p&gt;Apple Silicon 맥에서 MPS 가속을 쓰면 실시간 대비 10배 이상 나왔고, 다국어 지원도 폭넓었다. 커뮤니티도 크고 &lt;code&gt;faster-whisper&lt;/code&gt; 같은 최적화 래퍼도 있어서 실용적인 선택이었다.&lt;/p&gt;
&lt;p&gt;일본어 품질도 처음엔 나쁘지 않았다. 일상 대화나 팟캐스트 수준에서는 충분했다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;실제로 겪은 문제들&lt;/h2&gt;
&lt;p&gt;문제는 음원의 성격이 조금만 달라지면 생겼다.&lt;/p&gt;
&lt;h3&gt;반복 루프&lt;/h3&gt;
&lt;p&gt;가장 심했던 건 같은 단어나 문장이 무한 반복되는 현상이다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ありがとうございます。ありがとうございます。ありがとうございます。ありがとうございます。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이런 식으로 출력이 도배되는 경우가 종종 있었다. 특히 배경음악이 깔린 구간이나, 발화 사이 짧은 침묵이 있는 구간에서 자주 터졌다. Whisper가 &quot;적을 게 없으니 그럴싸한 것을 채운다&quot;는 느낌이었다.&lt;/p&gt;
&lt;h3&gt;내용 소멸&lt;/h3&gt;
&lt;p&gt;반대 방향의 문제도 있었다. 분명히 말을 하고 있는데 그 구간이 통째로 날아가는 것이다. 30초 단위로 오디오를 잘라서 처리하는 Whisper의 특성상, 청크 경계에 걸친 발화가 잘려나가는 경우가 꽤 있었다.&lt;/p&gt;
&lt;p&gt;일본어는 조사와 어미가 단어 뒤에 붙는 구조라, 경계에서 잘리면 의미 단위 자체가 깨져버린다. &lt;code&gt;食べ&lt;/code&gt; 뒤에 오는 &lt;code&gt;ました&lt;/code&gt;가 다음 청크로 넘어가면서 두 청크 모두 해당 단어를 무시해버리는 식이다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Whisper에서 개입할 방법이 제한적인 이유&lt;/h2&gt;
&lt;p&gt;반복 루프 문제를 해결하려고 파라미터를 건드려봤지만 쉽지 않았다.&lt;/p&gt;
&lt;p&gt;Whisper는 OpenAI가 독자적으로 구현한 디코딩 파이프라인을 쓴다. HuggingFace의 &lt;code&gt;model.generate()&lt;/code&gt;를 직접 통과하지 않아서, &lt;code&gt;repetition_penalty&lt;/code&gt;나 &lt;code&gt;no_repeat_ngram_size&lt;/code&gt; 같은 표준 생성 파라미터를 주입하기가 까다롭다. &lt;code&gt;faster-whisper&lt;/code&gt; 같은 래퍼를 써도 이 부분은 노출이 안 되어 있거나 제한적이다.&lt;/p&gt;
&lt;p&gt;결국 파라미터로 해결하기보다 전처리에서 무음 구간을 잘라낸다거나, 후처리에서 중복을 제거하는 방식으로 우회해야 했는데, 근본적인 해결이 아니라 계속 손이 갔다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Cohere Transcribe로의 전환&lt;/h2&gt;
&lt;h3&gt;반복 억제 파라미터가 실제로 먹힌다&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;REPETITION_PENALTY = 1.3
NO_REPEAT_NGRAM = 4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;repetition_penalty=1.3&lt;/code&gt;은 이미 생성한 토큰이 다시 나올 확률에 패널티를 준다. 값이 클수록 반복을 더 강하게 억제하는데, &lt;code&gt;1.3&lt;/code&gt;은 자연스러운 반복 표현(문법적으로 같은 단어가 연속되는 경우)은 허용하면서 루프는 잡아주는 균형점이다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;no_repeat_ngram_size=4&lt;/code&gt;는 동일한 4-gram이 두 번 나오지 못하게 막는다. 앞의 두 설정이 함께 작동하면 Whisper에서 자주 보이던 반복 루프가 현저히 줄어들었다.&lt;/p&gt;
&lt;h3&gt;청크 경계 처리&lt;/h3&gt;
&lt;p&gt;긴 오디오는 메모리 제약 때문에 청크로 나눠서 처리해야 한다. Whisper는 청크를 독립적으로 디코딩하기 때문에 경계 맥락이 전혀 없다. 반면 이 구현에서는 청크별 출력 토큰을 패딩 정렬해서 합산한 뒤 한 번에 디코딩한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;max_len = max(p.shape[1] for p in pieces)
# 각 청크 출력을 최대 길이에 맞춰 패딩 후 결합
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;청크 경계에서 내용이 사라지는 문제가 이 방식으로 상당히 개선됐다.&lt;/p&gt;
&lt;h3&gt;구두점 파라미터 분리&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;processor(..., punctuation=punctuation)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;구두점 출력 여부를 파라미터로 직접 제어할 수 있다. 이후 자동화 처리를 위해 구두점 없는 순수 텍스트가 필요할 때와, 가독성을 위해 구두점이 필요할 때를 깔끔하게 나눌 수 있어서 후처리가 훨씬 단순해졌다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;문제점&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;메모리 사용량이 높다.&lt;/strong&gt; Apple Silicon MPS에서 float16이 불안정해서 float32를 써야 한다. Whisper가 float16으로 가볍게 돌던 것과 비교하면 메모리 부담이 확실히 크다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;최적화 래퍼가 없다.&lt;/strong&gt; &lt;code&gt;faster-whisper&lt;/code&gt;나 &lt;code&gt;whisper.cpp&lt;/code&gt; 같은 커뮤니티 최적화 도구가 Whisper에는 많이 쌓여 있지만, Cohere 모델은 아직 그 수준이 아니다. 속도만 보면 Whisper가 유리한 상황이 있다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;정리&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Whisper V3 Turbo&lt;/th&gt;
&lt;th&gt;Cohere Transcribe&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;반복 루프 억제&lt;/td&gt;
&lt;td&gt;파라미터 개입 어려움&lt;/td&gt;
&lt;td&gt;&lt;code&gt;repetition_penalty&lt;/code&gt; 직접 작동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;청크 경계 처리&lt;/td&gt;
&lt;td&gt;독립 디코딩&lt;/td&gt;
&lt;td&gt;토큰 합산 후 디코딩&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MPS 메모리&lt;/td&gt;
&lt;td&gt;float16 가능&lt;/td&gt;
&lt;td&gt;float32 강제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;커뮤니티/래퍼&lt;/td&gt;
&lt;td&gt;풍부&lt;/td&gt;
&lt;td&gt;초기 단계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;라이선스&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>Favorites</title><link>https://ahri2nd.xyz/posts/favorites/</link><guid isPermaLink="true">https://ahri2nd.xyz/posts/favorites/</guid><description>My favorites</description><pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Link&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://open.spotify.com/user/vrzp923oitpudxzpcglk8pa40?si=594c21ea131a4094&quot;&gt;Spotify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stats.fm/ahri2nd&quot;&gt;Stats.fm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.musixmatch.com/profile/3vUCAArqF_yLicK4gElNQSbkBTop-eOR_Bp0eVR84VSKFn7LCe8P3FFlhr7Z2ECCTIF_xsg__ny7U9A08AQ--IqPJdPF6-VmkfOoaX3Un-0OIIyA_WJcW7exlKCtgWNAHrpk9X95WyMYMjVQxX5VcTVwoHo&quot;&gt;Musixmatch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Jenre&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;J-Pop
&lt;ul&gt;
&lt;li&gt;Vocaloid&lt;/li&gt;
&lt;li&gt;Animation&lt;/li&gt;
&lt;li&gt;Rap&lt;/li&gt;
&lt;li&gt;Idol&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Playlist&lt;/h2&gt;
&lt;p&gt;주기적으로 업데이트 됩니다&lt;/p&gt;
&lt;h3&gt;Spotify - お気に入り曲 - Liked Songs&lt;/h3&gt;
&lt;p&gt;&amp;lt;style&amp;gt;
.spotify-flex-container {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin: 20px 0;
align-items: flex-start;
}
.spotify-item {
flex: 1 1 100%;
min-width: 300px;
box-sizing: border-box;
margin: 0;
}
@media (min-width: 768px) {
.spotify-item {
flex: 1 1 calc(50% - 10px);
}
}
.spotify-item img {
display: block;
margin: 0 auto;
max-width: 100%;
height: auto;
}
.spotify-item iframe {
width: 100%;
border-radius: 12px;
}
.youtube-section {
margin: 20px 0;
width: 100%;
}
.video-wrapper {
position: relative;
padding-bottom: 56.25%;
height: 0;
overflow: hidden;
}
.video-wrapper iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 12px;
}
&amp;lt;/style&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;spotify-flex-container&quot;&amp;gt;
&amp;lt;div class=&quot;spotify-item&quot; style=&quot;text-align: center;&quot;&amp;gt;
&amp;lt;a href=&quot;https://open.spotify.com/user/vrzp923oitpudxzpcglk8pa40&quot;&amp;gt;
&amp;lt;img src=&quot;https://spotify-recently-played-readme.vercel.app/api?user=vrzp923oitpudxzpcglk8pa40&amp;amp;count=5&amp;amp;unique=true&quot;
alt=&quot;Spotify recently played&quot;
height=&quot;300&quot; /&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;spotify-item&quot;&amp;gt;
&amp;lt;iframe data-testid=&quot;embed-iframe&quot;
src=&quot;https://open.spotify.com/embed/playlist/3Dx3X4hrl630CbDMHvtpai?utm_source=generator&quot;
height=&quot;352&quot;
frameBorder=&quot;0&quot;
allowfullscreen=&quot;&quot;
allow=&quot;autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture&quot;
loading=&quot;lazy&quot;&amp;gt;
&amp;lt;/iframe&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3&gt;Youtube - 好きな歌ってみた - Liked Cover Songs&lt;/h3&gt;
&lt;p&gt;&amp;lt;div class=&quot;youtube-section&quot;&amp;gt;
&amp;lt;div class=&quot;video-wrapper&quot;&amp;gt;
&amp;lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/videoseries?si=LtdBQyCiawthfL-z&amp;amp;list=PLI8v8TR0VO8l0CoLeN6S5h98gXB3hsOyp&quot;
title=&quot;YouTube video player&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&amp;gt;
&amp;lt;/iframe&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded></item></channel></rss>