<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>로컬AI on To the Moon</title><link>https://junstellar.github.io/tags/%EB%A1%9C%EC%BB%ACai/</link><description>Recent content in 로컬AI on To the Moon</description><generator>Hugo -- gohugo.io</generator><language>ko-kr</language><lastBuildDate>Tue, 14 Jul 2026 12:00:00 +0900</lastBuildDate><atom:link href="https://junstellar.github.io/tags/%EB%A1%9C%EC%BB%ACai/index.xml" rel="self" type="application/rss+xml"/><item><title>@멘션 한 번이면 클로드가 답한다 — 디스코드로 만든 팀 AI 비서</title><link>https://junstellar.github.io/p/discord-claude-mention-bot/</link><pubDate>Tue, 14 Jul 2026 12:00:00 +0900</pubDate><guid>https://junstellar.github.io/p/discord-claude-mention-bot/</guid><description>&lt;h2 id="시작은-슬랙이었다"&gt;시작은 슬랙이었다
&lt;/h2&gt;&lt;p&gt;팀 프로젝트 관리용으로 &amp;ldquo;메신저에서 클로드를 태그로 불러 쓰는&amp;rdquo; 환경을 만들고 싶었다.
슬랙에 클로드를 붙이는 공식 기능(Claude in Slack, 이른바 클로드 태그)이 이미 있어서
그걸 쓰려고 했는데 — &lt;strong&gt;팀 플랜을 요구했다.&lt;/strong&gt; 혼자 쓰거나 소규모로 굴리는 입장에선
기능 하나 때문에 요금제를 통째로 올리는 게 납득이 안 됐다.&lt;/p&gt;
&lt;p&gt;그래서 &amp;ldquo;그럼 내가 쓰는 메신저에 직접 붙이자&amp;quot;로 방향을 틀었고, 후보를 좁혔다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;카카오톡&lt;/strong&gt; — 탈락. 일반 채팅방에 붙일 봇 API가 아예 없다.
오픈빌더는 1:1 채널 챗봇 전용이고, 비공식 자동화는 계정 정지 위험이 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;텔레그램&lt;/strong&gt; — 공식 봇 API가 가장 간단하고 진입장벽이 낮다. 다만 대화가 한 줄기라
여러 주제를 동시에 굴리면 금방 뒤엉킨다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;디스코드&lt;/strong&gt; — 최종 선택.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;디스코드를 고른 이유는 명확했다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;스레드 구조.&lt;/strong&gt; 멘션 하나에 스레드가 하나 생기니 주제별로 문맥이 자연스럽게 분리된다.
이게 뒤에 나올 &lt;code&gt;--resume&lt;/code&gt; 세션 매핑과 정확히 맞아떨어진다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;채널 분리.&lt;/strong&gt; 업무/메모/일정처럼 용도별 채널을 나눠 쓸 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;첨부파일과 코드블록을 제대로 다룬다.&lt;/strong&gt; 파일 올리고 바로 &amp;ldquo;이거 분석해줘&amp;quot;가 된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;봇 권한을 세밀하게 준다.&lt;/strong&gt; 어떤 채널에서 뭘 할 수 있는지 서버 단위로 통제된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;슬래시 명령이 1급 시민.&lt;/strong&gt; &lt;code&gt;/일정등록&lt;/code&gt; 같은 걸 자동완성·인자 검증까지 붙여 만들 수 있다.&lt;/li&gt;
&lt;li&gt;무료이고, PC·모바일 클라이언트가 다 있어서 나가서도 그대로 쓴다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="핵심-아키텍처"&gt;핵심 아키텍처
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;디스코드 @멘션 → discord.py 봇 → claude -p (headless Claude Code) → 응답 전송
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;claude -p --output-format json&lt;/code&gt;은 응답과 함께 &lt;code&gt;session_id&lt;/code&gt;를 돌려준다.
이걸 디스코드 스레드 ID와 매핑해 저장해두고, 다음 메시지에 &lt;code&gt;--resume &amp;lt;session_id&amp;gt;&lt;/code&gt;를
붙이면 &lt;strong&gt;스레드마다 대화 문맥이 유지&lt;/strong&gt;된다.&lt;/li&gt;
&lt;li&gt;Claude Code에 구독(Pro/Max) 로그인이 되어 있으면 &lt;code&gt;claude -p&lt;/code&gt;는 구독량으로 처리되어
&lt;strong&gt;Anthropic API 결제가 필요 없다.&lt;/strong&gt; 슬랙 쪽에서 막혔던 요금 문제가 여기서 사라진다.&lt;/li&gt;
&lt;li&gt;headless 모드에서도 그 PC에 설정된 &lt;strong&gt;MCP 서버와 스킬을 전부 그대로 인식한다.&lt;/strong&gt;
내 PC에서 쓰던 환경이 그대로 디스코드로 나오는 셈이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="예상-못-한-수확-로컬-메모-동기화가-같이-풀렸다"&gt;예상 못 한 수확: 로컬 메모 동기화가 같이 풀렸다
&lt;/h2&gt;&lt;p&gt;옵시디언처럼 &lt;strong&gt;메모를 로컬 파일로 쌓아두고 있었는데&lt;/strong&gt;, 이걸 폰에서도 보려면
어느 서비스든 결국 유료 동기화 플랜을 권한다. 슬랙 때와 똑같은 벽이다.&lt;/p&gt;
&lt;p&gt;그런데 이 봇을 붙이고 나니 그 문제가 통째로 사라졌다.
메모 파일은 계속 내 PC에 로컬로 있고, 디스코드에서 멘션 한 번이면
클로드가 그 파일들을 읽어서 답한다. &lt;strong&gt;동기화를 할 필요가 없다 —
파일을 옮기는 게 아니라, 파일이 있는 곳에 질문을 보내는 구조이기 때문이다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;여기에 MCP를 얹으면 더 좋아진다. 레드마인 같은 사내 시스템을 MCP로 물려두면,
봇이 일정과 이슈를 조회해서 &lt;strong&gt;디스코드 채팅에 보기 좋게 정리해 뿌려준다.&lt;/strong&gt;
로컬 메모 + MCP 데이터를 한 자리에서 묶어 요약해주니, 별도 대시보드를 안 만들어도
&amp;ldquo;오늘 뭐 있지&amp;quot;가 채팅 한 줄로 끝난다.&lt;/p&gt;
&lt;h2 id="봇-기능"&gt;봇 기능
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;멘션 → 스레드 자동 생성 후 답변&lt;/li&gt;
&lt;li&gt;첨부파일 자동 다운로드 후 클로드가 Read 도구로 분석&lt;/li&gt;
&lt;li&gt;슬래시 명령(&lt;code&gt;/일정등록&lt;/code&gt;, &lt;code&gt;/일정목록&lt;/code&gt;, &lt;code&gt;/일정삭제&lt;/code&gt;)으로 일정 알림
(마감 전날 1회 + 당일 매시간 반복, 삭제 = 완료 처리)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="디스코드에서 슬래시 명령으로 일정을 등록하고, 봇이 마감일과 D-day를 정리해 보여주는 화면" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://junstellar.github.io/images/discord-bot/claudetag-schedule-ko.png"&gt;&lt;/p&gt;
&lt;h2 id="보안-설계"&gt;보안 설계
&lt;/h2&gt;&lt;p&gt;봇이 있는 서버의 &lt;strong&gt;모든 멤버가 내 PC의 클로드를 쓰게 되므로&lt;/strong&gt; 도구를 잠가야 한다.
&lt;code&gt;--allowedTools&lt;/code&gt;를 읽기/검색 계열(Read, Glob, Grep, WebSearch, WebFetch)과
허용할 MCP 도구(&lt;code&gt;mcp__redmine__list_issues&lt;/code&gt; 등)로만 제한하고,
Bash·Write·Edit 같은 실행/쓰기 도구는 막았다.&lt;/p&gt;
&lt;h2 id="디스코드-봇-등록-절차"&gt;디스코드 봇 등록 절차
&lt;/h2&gt;&lt;p&gt;개발자 포털에서:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;New Application → Bot 메뉴에서 토큰 발급&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MESSAGE CONTENT INTENT 스위치 켜기&lt;/strong&gt; — 안 켜면 봇이 메시지를 못 읽는다. 최다 실수 포인트.&lt;/li&gt;
&lt;li&gt;OAuth2 URL Generator에서 &lt;code&gt;bot&lt;/code&gt; 스코프 + 필요한 권한 체크&lt;/li&gt;
&lt;li&gt;생성된 URL로 서버 초대&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;다른 클로드 구독자도 자기 토큰과 자기 구독으로 돌릴 수 있게
zip(봇 코드 + &lt;code&gt;.env.example&lt;/code&gt; + 설치 가이드 + &lt;code&gt;setup.bat&lt;/code&gt;)으로 묶어뒀다.
setup.bat이 Python(winget)·discord.py 설치와 설정 파일 생성까지 자동화하고,
계정이 필요한 부분(디스코드 토큰 발급, 클로드 로그인)만 수동으로 남는다.&lt;/p&gt;
&lt;h2 id="막혔던-점과-해결"&gt;막혔던 점과 해결
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;스토어(MSIX) 설치 Python은 AppData가 가상화&lt;/strong&gt;되어 &lt;code&gt;%APPDATA%\Claude\claude-code\&lt;/code&gt;의
claude.exe를 못 읽는다 (PowerShell에선 보이는데 Python에선 FileNotFoundError).
→ claude.exe를 AppData 밖 폴더로 복사해서 해결. 단독 실행파일이라 복사만으로 동작.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;배치 파일에 한글을 넣으면 cmd가 명령을 깨뜨린다&lt;/strong&gt; (&lt;code&gt;chcp 65001&lt;/code&gt; 이후 파서가 바이트
오프셋을 잘못 읽어 &lt;code&gt;'laudeBot'은(는)...&lt;/code&gt; 같은 유령 오류 발생). → bat 파일은 ASCII만 사용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PowerShell 파이프로 한글을 넘기면 인코딩이 깨진다.&lt;/strong&gt; → 파이썬 subprocess에서
UTF-8 바이트로 stdin에 직접 쓰면 안전. 파이썬 실행도 &lt;code&gt;-u&lt;/code&gt;(unbuffered) + &lt;code&gt;PYTHONUTF8=1&lt;/code&gt; 필수
(안 하면 print가 버퍼에 갇혀 로그가 안 보이거나 이모지 출력에서 죽는다).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;봇을 AI 세션의 백그라운드 프로세스로 띄우면 세션이 끝날 때 봇도 같이 죽는다.&lt;/strong&gt;
→ bat 더블클릭으로 독립 콘솔에서 실행해야 한다. 콘솔 창 닫으면 봇 종료, 최소화는 OK.&lt;/li&gt;
&lt;li&gt;같은 봇 토큰으로 프로세스를 2개 띄우면 게이트웨이에 둘 다 붙어서 &lt;strong&gt;답장이 중복&lt;/strong&gt;된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="메모생각"&gt;메모/생각
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;결국 세 번의 &amp;ldquo;유료 플랜을 쓰세요&amp;quot;를 같은 방법 하나로 넘겼다.
슬랙 클로드 태그(팀 플랜), 메모 동기화(구독), API 결제 —
&lt;strong&gt;내 PC에서 도는 봇 하나&lt;/strong&gt;로 셋 다 정리됐다.&lt;/li&gt;
&lt;li&gt;핵심은 클로드를 어디 올려두는 게 아니라, 이미 내 PC에 갖춰둔 환경(MCP·스킬·로컬 파일)에
&lt;strong&gt;메신저라는 입구를 하나 뚫어준 것&lt;/strong&gt;이다. 그래서 새로 설정할 게 거의 없었다.&lt;/li&gt;
&lt;li&gt;다음에 해볼 것: 부팅 시 자동 시작 등록, 스레드별 도구 권한 분리.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ElevenLabs 구독 끊고 내 GPU로 — 무료 로컬 TTS 트렌드와 Qwen3-TTS 실전 구축기</title><link>https://junstellar.github.io/p/qwen3-tts-local-korean-narration/</link><pubDate>Sun, 12 Jul 2026 10:00:00 +0900</pubDate><guid>https://junstellar.github.io/p/qwen3-tts-local-korean-narration/</guid><description>&lt;p&gt;유료 TTS 구독(대표적으로 ElevenLabs)을 쓰다 보면 글자 수 제한과 월 요금이 계속 신경 쓰인다. 그런데 최근 한 달 사이 분위기가 확 바뀌었다. **&amp;ldquo;유료 구독 탈출 → 무료 로컬 TTS&amp;rdquo;**가 대세가 된 것. 이번 글은 두 부분으로 나뉜다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;트렌드 조사&lt;/strong&gt; — YouTube Data API로 최근 한 달(6/10~7/10)의 &amp;ldquo;무료 TTS&amp;rdquo; 영상 65건을 수집·선별해 지금 뭐가 뜨는지 정리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;실전 구축&lt;/strong&gt; — 그중 오픈웨이트로 한국어가 가장 자연스러운 &lt;strong&gt;Qwen3-TTS 1.7B&lt;/strong&gt;를 게이밍 노트북(RTX 4060 Laptop 8GB)에 설치하고, 감정 태그를 입힌 &lt;strong&gt;11분짜리 세미나 내레이션&lt;/strong&gt;을 실제로 뽑아낸 과정&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;비용은 0원, 생성 무제한, 인터넷 없이 동작한다.&lt;/p&gt;
&lt;h2 id="무료-tts-트렌드-조사--요즘-뭐가-뜨나"&gt;무료 TTS 트렌드 조사 — 요즘 뭐가 뜨나
&lt;/h2&gt;&lt;p&gt;유튜브에서 최근 한 달 &amp;ldquo;무료 TTS&amp;rdquo; 관련 영상을 API로 긁어 65건을 모으고, 관련도 높은 20개(한국어 14, 해외 6)를 선별해 요약했다. 결론부터:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;이번 달 최대 이슈는 수퍼톤(Supertone)이다.&lt;/strong&gt; 6월 10일 웹 서비스 &lt;strong&gt;수퍼톤 플레이&lt;/strong&gt;(play.supertone.ai)를 출시했고(공식 소개 영상이 한 달 만에 5.7만 회), 동시에 로컬 모델 &lt;strong&gt;슈퍼토닉3를 MIT 라이선스로 무료 공개&lt;/strong&gt;했다. CPU만으로 한국어를 무제한 생성할 수 있어서 &amp;ldquo;ElevenLabs 해지했다&amp;quot;는 영상이 줄줄이 올라오는 중.&lt;/p&gt;
&lt;p&gt;자주 언급된 무료 도구를 성격별로 묶으면:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;분류&lt;/th&gt;
					&lt;th&gt;도구&lt;/th&gt;
					&lt;th&gt;특징&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;웹에서 바로&lt;/td&gt;
					&lt;td&gt;수퍼톤 플레이, 클로바더빙, Vrew&lt;/td&gt;
					&lt;td&gt;설치 없음, 한국어 더빙은 무료 범위로 충분&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;로컬 오픈소스&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;슈퍼토닉3&lt;/strong&gt;(MIT, 한국어 특화, CPU 가능), &lt;strong&gt;Qwen3-TTS&lt;/strong&gt;, VoxCPM2, OmniVoice&lt;/td&gt;
					&lt;td&gt;무제한 + 음성 복제 지원&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;개발자용 최저 진입장벽&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Edge-TTS&lt;/strong&gt;(pip 한 줄, API 키 불필요), Google AI Studio Gemini Flash TTS(70+ 언어)&lt;/td&gt;
					&lt;td&gt;스크립트에 바로 붙이기 좋음&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;기타&lt;/td&gt;
					&lt;td&gt;VoiceBox(오프라인 Windows 앱), RVC(내 목소리 로컬 학습)&lt;/td&gt;
					&lt;td&gt;특수 용도&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;한 줄 요약: &lt;strong&gt;웹에서 바로 쓰려면 수퍼톤 플레이·클로바더빙, 개발자라면 Edge-TTS가 진입장벽 최저&lt;/strong&gt;다.&lt;/p&gt;
&lt;h2 id="qwen3-tts-17b-설치해서-직접-테스트해봤다"&gt;Qwen3-TTS 1.7B, 설치해서 직접 테스트해봤다
&lt;/h2&gt;&lt;p&gt;내 목적은 &amp;ldquo;세미나 영상 내레이션을 컷 단위로, 감정 지시까지 넣어서, 무제한으로 뽑기&amp;quot;였다. 프로그램에서 호출할 수 있고 말투 제어가 되는 로컬 모델이 필요했다.&lt;/p&gt;
&lt;p&gt;오픈웨이트 후보들을 비교한 결과:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Qwen3-TTS 1.7B ← 최종 선택&lt;/strong&gt; — Apache 2.0(상업 사용 자유), 한국어 억양·속도가 오픈웨이트 중 가장 자연스러웠다. 3초 샘플만으로 보이스 클로닝이 되고, 크로스링구얼(다른 언어 샘플로 한국어 발화) 오류율이 4.8%로 CosyVoice 3(14.4%)보다 크게 우수하다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fish Audio S2 Pro&lt;/strong&gt; — TTS Arena 기준 오픈웨이트 1위(전체 11위, Elo 1128.7)로 품질은 최상급. 하지만 &lt;strong&gt;상업 사용은 유료 라이선스&lt;/strong&gt;인 데다 모델이 무거워서 탈락.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;슈퍼토닉3&lt;/strong&gt; — MIT에 CPU만으로 돌아가는 건 매력적이지만, 이번엔 감정 지시(instruct) 제어가 필요해서 Qwen3-TTS로 갔다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="설치-windows-11--rtx-4060-laptop-8gb"&gt;설치 (Windows 11 + RTX 4060 Laptop 8GB)
&lt;/h2&gt;&lt;h3 id="1-가상환경--패키지"&gt;1. 가상환경 + 패키지
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="n"&gt;D:&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Project&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="nb"&gt;qwen3-tts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;&lt;span class="n"&gt;D:&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Project&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="nb"&gt;qwen3-tts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Scripts&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-index-url&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;pytorch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;whl&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cu128&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Scripts&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="nb"&gt;qwen-tts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;내 환경 기준: Python 3.14, torch 2.11+cu128, qwen-tts 0.1.1.&lt;/p&gt;
&lt;h3 id="2-모델과-화자"&gt;2. 모델과 화자
&lt;/h3&gt;&lt;p&gt;모델은 &lt;code&gt;Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice&lt;/code&gt; — 첫 실행 시 자동 다운로드된다. VRAM은 &lt;strong&gt;4.5GB 정도만 사용&lt;/strong&gt;해서 8GB GPU에 여유 있게 들어간다.&lt;/p&gt;
&lt;p&gt;내장 화자는 9명(aiden, dylan, eric, ono_anna, ryan, serena, sohee, uncle_fu, vivian)이고, 한국어는 &lt;strong&gt;sohee&lt;/strong&gt;가 담당이다.&lt;/p&gt;
&lt;h3 id="3-알아두면-좋은-것"&gt;3. 알아두면 좋은 것
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;flash-attn을 설치하지 않으면 생성 속도는 오디오 길이의 약 2배&lt;/strong&gt; (1분짜리 음성에 2분 소요). 배치로 밤에 돌리면 문제없는 수준.&lt;/li&gt;
&lt;li&gt;실행 시 SoX 관련 경고가 뜨는데 무해하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="핵심-패턴-모델을-상주-서버로-띄우기"&gt;핵심 패턴: 모델을 상주 서버로 띄우기
&lt;/h2&gt;&lt;p&gt;모델 로딩에 약 1분이 걸리므로, 스크립트를 실행할 때마다 로딩하면 낭비다. &lt;strong&gt;간단한 HTTP 서버로 한 번만 띄워두고 POST로 호출&lt;/strong&gt;하는 구조를 만들었다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Scripts&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="n"&gt;tts_server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# → http://127.0.0.1:8765 에서 대기&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;호출은 이렇게:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;POST&lt;/span&gt; &lt;span class="err"&gt;/tts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;texts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;여러분, 오늘 다룰 주제는 피지컬 AI입니다.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;speaker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sohee&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;instruct&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;자신감 있는 일타강사 말투로, 약간 도발적으로&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;filename&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;01_opener.wav&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;결과 WAV는 &lt;code&gt;output\&lt;/code&gt;에 저장된다. 핵심은 &lt;code&gt;instruct&lt;/code&gt; 필드 — &lt;strong&gt;말투를 자연어로 지시&lt;/strong&gt;할 수 있다는 점이 이 모델을 고른 결정적 이유다.&lt;/p&gt;
&lt;h2 id="실전-감정-태그-입힌-세미나-내레이션-23컷"&gt;실전: 감정 태그 입힌 세미나 내레이션 23컷
&lt;/h2&gt;&lt;p&gt;세미나 1회차 대본을 23개 컷(01_opener ~ 23_takeaway)으로 쪼개고, &lt;strong&gt;컷마다 감정 태그와 TTS용 instruct 문구를 JSON으로 관리&lt;/strong&gt;했다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;cut&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;05_quiz2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;emotion&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;장난스러운 도발&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;instruct&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;퀴즈를 내며 살짝 약올리는 말투로, 템포를 빠르게&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;감정 곡선은 이렇게 설계했다: &lt;strong&gt;도발 → 퀴즈 5연발 → 약올림 → 차분한 강의 → 정답 발표 → 심화 → 묵직한 마무리&lt;/strong&gt;. 단일 톤으로 11분을 읽으면 졸린데, 컷마다 instruct를 바꿔주니 확실히 &amp;ldquo;사람이 진행하는&amp;rdquo; 느낌이 산다.&lt;/p&gt;
&lt;p&gt;파이프라인은 3단계:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;컷별 대본 23개 + 감정 태그 JSON
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ (gen_all_cuts.py — 컷마다 instruct 다르게 서버 호출)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;output\cuts\ 23개 WAV
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ (60~90초 단위로 병합, 구성은 parts_manifest.json에 기록)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;output\parts\part_01.wav ~ part_10.wav (총 11.6분)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;이 구조의 장점은 &lt;strong&gt;수정이 컷 단위&lt;/strong&gt;라는 것. 특정 컷의 억양이 마음에 안 들면 그 컷만 instruct를 고쳐 재생성하고 해당 파트만 다시 병합하면 된다. 유료 서비스였다면 재생성할 때마다 글자 수가 차감됐을 텐데, 로컬이라 무한 리테이크가 공짜다.&lt;/p&gt;
&lt;h2 id="직접-들어보기--생성-샘플-3개"&gt;직접 들어보기 — 생성 샘플 3개
&lt;/h2&gt;&lt;p&gt;말로 설명하는 것보다 듣는 게 빠르다. 아래는 Qwen3-TTS(화자 sohee)로 뽑은 샘플들이다. 스타일별로 하나씩 — 뉴스 리딩, 다큐 내레이션, 감정 표현.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;샘플 1 — 뉴스 톤&lt;/strong&gt; · &amp;ldquo;오늘 서울의 낮 최고 기온은 33도까지 오르겠고, 내륙 곳곳에 소나기가 지나겠습니다.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;audio controls preload="metadata" src="https://junstellar.github.io/audio/qwen3-tts/sample1_news.wav" style="width:100%"&gt;&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;샘플 2 — 차분한 내레이션 톤&lt;/strong&gt; · &amp;ldquo;인공지능 기술은 지난 10년간 놀라운 속도로 발전해왔습니다. 이제 우리는 컴퓨터와 자연스럽게 대화하는 시대에 살고 있죠.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;audio controls preload="metadata" src="https://junstellar.github.io/audio/qwen3-tts/sample2_narration.wav" style="width:100%"&gt;&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;샘플 3 — 감정(놀람) 표현&lt;/strong&gt; · &amp;ldquo;정말요? 그게 진짜 된다고요? 와, 이건 생각보다 훨씬 대단한데요?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;audio controls preload="metadata" src="https://junstellar.github.io/audio/qwen3-tts/sample3_emotion.wav" style="width:100%"&gt;&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;같은 화자인데도 instruct 지시에 따라 톤이 이만큼 갈라진다. 특히 샘플 3처럼 감탄·놀람 같은 감정 표현이 어색하지 않다는 점이 세미나 내레이션에 쓸 수 있겠다고 판단한 근거였다.&lt;/p&gt;
&lt;h2 id="정리"&gt;정리
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;트렌드는 명확하다: &lt;strong&gt;무료 로컬 TTS가 유료 구독을 대체하는 중.&lt;/strong&gt; 웹은 수퍼톤 플레이·클로바더빙, 개발자는 Edge-TTS, 품질+제어가 필요하면 오픈웨이트 로컬 모델.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qwen3-TTS 1.7B&lt;/strong&gt;는 Apache 2.0 + 한국어 자연스러움 + 자연어 말투 지시(instruct) + VRAM 4.5GB라는 조합으로, 8GB급 GPU에서 실용적인 최선이었다.&lt;/li&gt;
&lt;li&gt;상주 서버 + 컷별 감정 태그 JSON 패턴으로 &lt;strong&gt;11.6분 세미나 내레이션을 컷 단위 리테이크 가능한 형태&lt;/strong&gt;로 완성했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 글의 코드 전체(상주 서버, 컷별 생성·병합 스크립트, 스트리밍 페이지, 샘플 음성)는 GitHub에 공개했다: &lt;strong&gt;&lt;a class="link" href="https://github.com/junstellar/qwen3-tts-korean-narration" target="_blank" rel="noopener"
 &gt;junstellar/qwen3-tts-korean-narration&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;다음 과제는 두 가지다. flash-attn을 설치해 생성 속도를 끌어올리는 것, 그리고 3초 샘플 보이스 클로닝으로 내 목소리를 등록해보는 것. 진행되면 후속 글로 정리하겠다.&lt;/p&gt;</description></item><item><title>게이밍 노트북으로 나만의 LLM 돌리기 — llama.cpp로 완전 무료·오프라인 AI 만들기</title><link>https://junstellar.github.io/p/llama-cpp-local-llm/</link><pubDate>Mon, 06 Jul 2026 20:45:00 +0900</pubDate><guid>https://junstellar.github.io/p/llama-cpp-local-llm/</guid><description>&lt;p&gt;요즘 클로드나 챗GPT 안 쓰는 사람이 없죠. 그런데 이걸 &lt;strong&gt;인터넷도 없이, 요금도 없이, 내 노트북에서 직접&lt;/strong&gt; 돌릴 수 있다면 어떨까요? &amp;ldquo;그건 서버실에 GPU 잔뜩 있어야 하는 거 아냐?&amp;rdquo; 싶은데, 결론부터 말하면 &lt;strong&gt;집에 있는 게이밍 노트북 한 대로, 돈 한 푼 안 들이고&lt;/strong&gt; 됩니다. 지난번엔 ComfyUI로 &amp;lsquo;그림 그리는 로컬 서버&amp;rsquo;를 만들었는데, 이번엔 &lt;code&gt;llama.cpp&lt;/code&gt;로 **&amp;lsquo;말하고 글 쓰는 LLM&amp;rsquo;**을 내 GPU에 올려본 실전 기록입니다.&lt;/p&gt;
&lt;h2 id="왜-굳이-로컬로-돌릴까요"&gt;왜 굳이 로컬로 돌릴까요?
&lt;/h2&gt;&lt;p&gt;솔직히 똑똑함만 따지면 클라우드 AI가 위입니다. 그런데도 로컬로 돌리는 이유가 분명히 있어요.&lt;/p&gt;
&lt;p&gt;가장 큰 건 &lt;strong&gt;토큰을 무제한으로 쓸 수 있다&lt;/strong&gt;는 점입니다. 클라우드 API는 글자(토큰) 하나하나에 요금이 붙죠. 문서 수백 개를 요약하거나, 로그 수만 줄을 분류하거나, 밤새 뭔가를 돌리다 보면 요금이 은근히 무섭게 불어납니다. 로컬은 전기값 빼곤 0원이라, &amp;ldquo;이거 토큰 아까운데…&amp;rdquo; 하고 망설일 일이 없어요. 프롬프트를 마음껏 길게 쓰고, 마음에 들 때까지 몇 번이고 다시 돌려도 됩니다.&lt;/p&gt;
&lt;p&gt;여기에 이런 것들이 더 붙습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;속도 제한이 없어요.&lt;/strong&gt; API는 분당 요청 수에 제한이 걸려서 대량 작업을 하면 계속 기다려야 하는데, 내 GPU는 온전히 내 것이라 줄 설 일이 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터가 밖으로 안 나갑니다.&lt;/strong&gt; 회사 내부 문서, 개인정보, 아직 공개 안 한 코드처럼 외부에 올리기 껄끄러운 걸 다룰 때 이게 결정적이에요. 애초에 전송을 안 하니 유출될 게 없죠.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인터넷이 필요 없습니다.&lt;/strong&gt; 비행기 안이든, 네트워크가 막힌 폐쇄망이든 그대로 돌아갑니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;모델이 갑자기 사라지지 않아요.&lt;/strong&gt; 클라우드 모델은 어느 날 구버전이 종료되곤 하는데, 내 디스크에 받아둔 파일은 영원히 그 버전 그대로입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;한마디로 **&amp;ldquo;똑똑함은 클라우드, 자유도·비용·프라이버시는 로컬&amp;rdquo;**입니다. 민감한 데이터를 다루거나 같은 작업을 잔뜩 반복할수록 로컬이 빛을 발해요.&lt;/p&gt;
&lt;h2 id="로컬-llm-뭘로-돌리죠--후보-3가지"&gt;로컬 LLM, 뭘로 돌리죠? — 후보 3가지
&lt;/h2&gt;&lt;p&gt;방법이 몇 가지 있는데, 셋을 비교해보고 골랐습니다.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;도구&lt;/th&gt;
					&lt;th&gt;장점&lt;/th&gt;
					&lt;th&gt;아쉬운 점&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Ollama&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;명령어 한 줄이면 바로 뜬다, 제일 쉬움&lt;/td&gt;
					&lt;td&gt;속은 결국 llama.cpp, 세밀한 튜닝엔 한 겹 껴 있음&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;LM Studio&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;예쁜 GUI, 클릭 몇 번&lt;/td&gt;
					&lt;td&gt;프로그램에서 불러다 자동화하기엔 무거움&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;llama.cpp ← 선택&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;엔진 그 자체&lt;/strong&gt;, VRAM 짜내기 최강, OpenAI 호환 API&lt;/td&gt;
					&lt;td&gt;명령어에 조금 익숙해져야 함&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;사실 위의 Ollama·LM Studio가 안에서 실제로 돌리는 &lt;strong&gt;엔진이 바로 llama.cpp&lt;/strong&gt;예요. GPU에 레이어를 몇 개나 올릴지까지 손으로 조절할 수 있어서 8GB 노트북에서 짜내기 가장 좋고, 딸려오는 &lt;code&gt;llama-server&lt;/code&gt;가 &lt;strong&gt;OpenAI랑 똑같은 형식의 API&lt;/strong&gt;를 열어줘서 어떤 앱이든 깔끔하게 붙습니다.&lt;/p&gt;
&lt;h2 id="전체-그림--원리는-간단합니다"&gt;전체 그림 — 원리는 간단합니다
&lt;/h2&gt;&lt;p&gt;원리는 ComfyUI 때랑 똑같아요. 무거운 계산은 로컬 GPU가 하고, 바깥 프로그램은 API로 부르기만 합니다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;사용자/앱: &amp;#34;이 문단 요약해줘&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;llama-server (로컬, http://127.0.0.1:8080/v1) ← OpenAI 호환 API
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GGUF 모델이 RTX 4060에서 토큰을 하나씩 생성
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;스트리밍으로 답변이 흘러나옴
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;두 단어만 알고 가면 됩니다. &lt;strong&gt;llama.cpp&lt;/strong&gt;는 C/C++로 짠 LLM 추론 엔진이라 GPU가 약해도 모델을 CPU와 GPU에 나눠 올려 돌립니다. &lt;strong&gt;GGUF&lt;/strong&gt;는 llama.cpp 전용 모델 포맷인데, 원본 모델을 &lt;strong&gt;양자화&lt;/strong&gt;해서 용량과 VRAM 사용량을 확 줄여놓은 파일이에요.&lt;/p&gt;
&lt;h2 id="내-노트북으로-될까--사양부터-확인"&gt;내 노트북으로 될까? — 사양부터 확인
&lt;/h2&gt;&lt;p&gt;일단 될지부터 따져봤습니다. 지난 ComfyUI 글과 같은 HP Victus 16 노트북이에요.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;항목&lt;/th&gt;
					&lt;th&gt;필요 사양 (7~8B 모델)&lt;/th&gt;
					&lt;th&gt;내 노트북&lt;/th&gt;
					&lt;th&gt;판정&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;GPU VRAM&lt;/td&gt;
					&lt;td&gt;6GB 이상 (Q4 기준)&lt;/td&gt;
					&lt;td&gt;RTX 4060 Laptop 8GB&lt;/td&gt;
					&lt;td&gt;통과&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RAM&lt;/td&gt;
					&lt;td&gt;16GB&lt;/td&gt;
					&lt;td&gt;16GB&lt;/td&gt;
					&lt;td&gt;통과&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;디스크&lt;/td&gt;
					&lt;td&gt;모델당 약 5GB&lt;/td&gt;
					&lt;td&gt;여유 충분&lt;/td&gt;
					&lt;td&gt;통과&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;VRAM 8GB면 &lt;strong&gt;7~8B급 모델을 Q4로 양자화했을 때 통째로 GPU에 올라갑니다.&lt;/strong&gt; 이 구간이 제일 빨라요. 13~14B급부터는 일부를 RAM으로 내려야 해서 속도가 뚝 떨어지고, 30B 이상은 이 노트북엔 좀 욕심입니다.&lt;/p&gt;
&lt;h2 id="모델-고르기--양자화가-절반입니다"&gt;모델 고르기 — &amp;lsquo;양자화&amp;rsquo;가 절반입니다
&lt;/h2&gt;&lt;p&gt;같은 모델이라도 **양자화(quantization)**를 어떻게 하느냐에 따라 용량·속도·품질이 갈립니다. 여기서 첫 삽질을 했어요. &amp;ldquo;이왕이면 고품질이지&amp;rdquo; 하고 Q8을 받았다가 &lt;strong&gt;VRAM이 부족해서 모델이 반쪽만 GPU에 올라가는&lt;/strong&gt; 상황을 만났거든요. 결국 8GB의 현실적인 정답은 **&lt;code&gt;Q4_K_M&lt;/code&gt;**이었습니다.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;양자화&lt;/th&gt;
					&lt;th&gt;7B 모델 용량&lt;/th&gt;
					&lt;th&gt;특징&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Q8_0&lt;/td&gt;
					&lt;td&gt;~7.5GB&lt;/td&gt;
					&lt;td&gt;원본에 제일 가깝지만 8GB엔 버겁다&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Q4_K_M&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;~4.5GB&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;속도·품질 균형, 로컬의 사실상 표준&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Q3_K_M&lt;/td&gt;
					&lt;td&gt;~3.5GB&lt;/td&gt;
					&lt;td&gt;더 가벼운 대신 품질 저하가 슬슬 느껴진다&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;모델은 7~8B급 instruct 계열(예: Qwen2.5-7B-Instruct, Llama-3.1-8B-Instruct 등)이면 무난합니다. GGUF 파일은 보통 Hugging Face의 &lt;code&gt;bartowski&lt;/code&gt; 같은 배포처에서 양자화별로 받을 수 있어요.&lt;/p&gt;
&lt;h2 id="설치하기-windows-11-기준"&gt;설치하기 (Windows 11 기준)
&lt;/h2&gt;&lt;h3 id="1-llamacpp-바이너리-받기"&gt;1. llama.cpp 바이너리 받기
&lt;/h3&gt;&lt;p&gt;소스를 직접 빌드해도 되지만, 제일 빠른 길은 &lt;strong&gt;미리 빌드된 CUDA 바이너리&lt;/strong&gt;를 받는 겁니다. &lt;a class="link" href="https://github.com/ggml-org/llama.cpp/releases" target="_blank" rel="noopener"
 &gt;GitHub 릴리스&lt;/a&gt;에서 &lt;code&gt;llama-bxxxx-bin-win-cuda-x64.zip&lt;/code&gt; 같은 파일을 받아 &lt;code&gt;C:\llama&lt;/code&gt;에 풀면 끝이에요.&lt;/p&gt;
&lt;h3 id="2-gguf-모델-다운로드"&gt;2. GGUF 모델 다운로드
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 7B급 Q4_K_M 모델 (~4.5GB) → C:\llama\models\ 에 저장&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;curl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="n"&gt;-L&lt;/span&gt; &lt;span class="n"&gt;-o&lt;/span&gt; &lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;llama&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="nb"&gt;model-q4_k_m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;gguf&lt;/span&gt; &lt;span class="p"&gt;^&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://huggingface.co/bartowski/Qwen2.5-7B-Instruct-GGUF/resolve/main/Qwen2.5-7B-Instruct-Q4_K_M.gguf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-서버-실행"&gt;3. 서버 실행
&lt;/h3&gt;&lt;p&gt;여기서 딱 하나만 기억하면 됩니다. &lt;strong&gt;&lt;code&gt;-ngl&lt;/code&gt;&lt;/strong&gt; — GPU에 올릴 레이어 수예요. &lt;code&gt;-ngl 99&lt;/code&gt;는 &amp;ldquo;가능한 만큼 다 GPU에 올려라&amp;quot;라는 뜻이고, 7~8B Q4 모델은 8GB에 통째로 들어갑니다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;llama&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="nb"&gt;llama-server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="n"&gt;-m&lt;/span&gt; &lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;llama&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="nb"&gt;model-q4_k_m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;gguf&lt;/span&gt; &lt;span class="n"&gt;-ngl&lt;/span&gt; &lt;span class="mf"&gt;99&lt;/span&gt; &lt;span class="n"&gt;-c&lt;/span&gt; &lt;span class="mf"&gt;8192&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-port&lt;/span&gt; &lt;span class="mf"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-ngl 99&lt;/code&gt; : 전 레이어 GPU에 올리기 (VRAM 모자라면 숫자를 낮춰 일부만)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c 8192&lt;/code&gt; : 컨텍스트 길이 8k 토큰&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--port 8080&lt;/code&gt; : 서버 포트&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-잘-도나-확인"&gt;4. 잘 도나 확인
&lt;/h3&gt;&lt;p&gt;브라우저에서 &lt;code&gt;http://127.0.0.1:8080&lt;/code&gt;을 열면 채팅 UI가 바로 뜹니다. GPU를 제대로 쓰는지는 서버 켤 때 로그의 &lt;code&gt;offloaded 29/29 layers to GPU&lt;/code&gt; 같은 줄로 확인해요. 저 숫자가 꽉 차 있으면 성공입니다.&lt;/p&gt;
&lt;h3 id="흔한-함정-3가지-미리-알려드려요"&gt;흔한 함정 3가지 (미리 알려드려요)
&lt;/h3&gt;&lt;p&gt;설치 자체는 쉬운데, 딱 이 세 군데서 사람들이 잘 걸립니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;함정 1 — CPU 빌드를 받아버림.&lt;/strong&gt; 릴리스에 파일이 여러 개라, 무심코 &lt;code&gt;win-cpu&lt;/code&gt; 빌드를 받으면 GPU가 놀고 답이 굼벵이처럼 느립니다. &lt;strong&gt;NVIDIA면 반드시 &lt;code&gt;cuda&lt;/code&gt; 빌드&lt;/strong&gt;를 받으세요. (AMD는 &lt;code&gt;vulkan&lt;/code&gt; 빌드)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;함정 2 — &lt;code&gt;-ngl&lt;/code&gt;을 안 줌.&lt;/strong&gt; 이 옵션을 빼먹으면 모델이 전부 CPU에서 돌아 엄청 느려집니다. &amp;ldquo;GPU 있는데 왜 이렇게 느리지?&amp;rdquo; 싶으면 십중팔구 이거예요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;함정 3 — 욕심내서 큰 모델·높은 양자화.&lt;/strong&gt; 위에서 겪은 그 삽질입니다. VRAM을 넘기면 속도가 확 죽어요. 8GB면 7~8B Q4가 정답입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="앱이랑-붙이기--openai-호환-api"&gt;앱이랑 붙이기 — OpenAI 호환 API
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;llama-server&lt;/code&gt;가 진짜 편한 건, &lt;strong&gt;OpenAI랑 똑같은 형식의 API&lt;/strong&gt;를 열어준다는 점이에요. OpenAI 쓰던 코드에서 &lt;strong&gt;주소만 로컬로 바꾸면&lt;/strong&gt; 그대로 붙습니다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://127.0.0.1:8080/v1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;local&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;local&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;안녕, 자기소개 해줘&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;문서 요약, 코드 자동완성, 번역 같은 걸 &lt;strong&gt;오프라인·무과금&lt;/strong&gt;으로 돌리는 나만의 백엔드가 이걸로 완성됩니다.&lt;/p&gt;
&lt;h2 id="어느-정도-빠를까요"&gt;어느 정도 빠를까요
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;7&lt;del&gt;8B Q4_K_M을 전 레이어 GPU에 올린 기준으로 **초당 40&lt;/del&gt;60토큰 정도**. 눈으로 따라 읽기 벅찰 만큼 빠릅니다.&lt;/li&gt;
&lt;li&gt;첫 응답까지는 모델을 VRAM에 올리는 시간 포함 몇 초.&lt;/li&gt;
&lt;li&gt;컨텍스트를 길게(예: 16k) 주면 VRAM이 부족해질 수 있는데, 그땐 &lt;code&gt;-ngl&lt;/code&gt; 숫자를 낮춰 일부를 RAM으로 내리면 됩니다. 조금 느려지는 대신 돌아는 가요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="솔직한-결론--어디까지-되고-어디부터-안-되나"&gt;솔직한 결론 — 어디까지 되고, 어디부터 안 되나
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;됩니다:&lt;/strong&gt; 공짜로, 인터넷 없이, 내 노트북에서 꽤 쓸 만한 LLM이 돌아갑니다. 요약·번역·분류·코딩 보조 같은 실무엔 7~8B로도 충분해요. 무엇보다 &lt;strong&gt;토큰 걱정 없이 마음껏&lt;/strong&gt; 굴릴 수 있는 게 크죠.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;한계:&lt;/strong&gt; 아무리 좋은 로컬 모델도 최상위 클라우드 모델(클로드 등)만큼 똑똑하진 않습니다. 복잡한 추론이나 긴 코드 설계는 아직 클라우드가 낫습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;현실적인 조합:&lt;/strong&gt; 그래서 저는 &lt;strong&gt;민감한 데이터·대량 반복 작업은 로컬, 어려운 문제는 클라우드&lt;/strong&gt;로 나눠 쓰는 게 제일 낫다고 봐요. 둘은 경쟁이 아니라 역할 분담입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;돈 안 들이고 노트북 한 대로 여기까지 된다는 것 자체가, AI 문턱이 얼마나 낮아졌는지 보여주는 것 같습니다. 다음엔 이 로컬 LLM을 클로드 코드 같은 도구에 물려서 &lt;strong&gt;완전 오프라인 코딩 도우미&lt;/strong&gt;로 만들어볼 생각이에요.&lt;/p&gt;</description></item><item><title>집 컴퓨터로 AI 가상 인물 만들기 — 무료로 '말하는 아나운서' 영상까지</title><link>https://junstellar.github.io/p/ai-virtual-human/</link><pubDate>Sat, 04 Jul 2026 18:00:00 +0900</pubDate><guid>https://junstellar.github.io/p/ai-virtual-human/</guid><description>&lt;img src="https://junstellar.github.io/p/ai-virtual-human/cover.png" alt="Featured image of post 집 컴퓨터로 AI 가상 인물 만들기 — 무료로 '말하는 아나운서' 영상까지" /&gt;&lt;p&gt;요즘 유튜브나 뉴스에서 **AI가 만든 가상 인물(버추얼 휴먼)**이 부쩍 많이 보입니다. 실존하지 않는 사람이 아나운서처럼 또박또박 설명을 하죠. &amp;ldquo;저거 만들려면 비싼 서비스 써야 하는 거 아냐?&amp;rdquo; 싶은데, 결론부터 말하면 &lt;strong&gt;집에 있는 게이밍 노트북 한 대로, 돈 한 푼 안 들이고&lt;/strong&gt; 꽤 그럴듯하게 만들 수 있습니다. 이 글은 실제로 &amp;lsquo;아리&amp;rsquo;라는 가상 아나운서를 만들어 자기소개 영상까지 뽑아본 기록입니다.&lt;/p&gt;
&lt;h2 id="결과부터--아리의-자기소개"&gt;결과부터 — &amp;lsquo;아리&amp;rsquo;의 자기소개
&lt;/h2&gt;&lt;p&gt;말보다 영상이 빠르죠. 아래가 이번에 만든 결과물입니다. 실존하지 않는 사람이고, 목소리도 얼굴도 전부 AI로 생성했습니다.&lt;/p&gt;
&lt;video controls playsinline poster="cover.png" style="width:100%;max-width:520px;border-radius:14px;display:block;margin:1.2rem auto;"&gt;
 &lt;source src="ari-intro.mp4" type="video/mp4"&gt;
&lt;/video&gt;
&lt;p style="text-align:center;color:#888;font-size:0.9em;margin-top:-0.4rem;"&gt;"안녕하세요, 저는 AI로 생성된 아리입니다. 반갑습니다."&lt;/p&gt;
&lt;h2 id="가상-인물-영상은-3가지-재료로-만들어집니다"&gt;가상 인물 영상은 &amp;lsquo;3가지 재료&amp;rsquo;로 만들어집니다
&lt;/h2&gt;&lt;p&gt;챗GPT나 클로드 하나로 &amp;ldquo;영상 만들어줘&amp;rdquo; 하면 되는 게 아닙니다. 말하는 가상 인물은 &lt;strong&gt;세 가지를 각각 만들어서 합치는&lt;/strong&gt; 작업이에요.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;재료&lt;/th&gt;
					&lt;th&gt;하는 일&lt;/th&gt;
					&lt;th&gt;이번에 쓴 도구&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;① 얼굴&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;존재하지 않는 인물의 사진&lt;/td&gt;
					&lt;td&gt;SDXL (로컬 이미지 생성)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;② 목소리&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;대본을 사람 음성으로&lt;/td&gt;
					&lt;td&gt;edge-tts (무료)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;③ 입 움직임&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;음성에 맞춰 입을 립싱크&lt;/td&gt;
					&lt;td&gt;SadTalker (무료·로컬)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;셋 다 &lt;strong&gt;무료이고, 인터넷 없이 내 GPU에서&lt;/strong&gt; 돌아갑니다. 하나씩 볼게요.&lt;/p&gt;
&lt;h2 id="-얼굴--sdxl로-아리를-빚다"&gt;① 얼굴 — SDXL로 &amp;lsquo;아리&amp;rsquo;를 빚다
&lt;/h2&gt;&lt;p&gt;먼저 세상에 없는 얼굴이 필요합니다. 저는 로컬에서 SDXL(Stable Diffusion XL)로 &amp;ldquo;단정하고 신뢰감 있는 한국 여성 아나운서&amp;quot;를 여러 장 생성한 뒤, 마음에 드는 얼굴을 골랐습니다. 이때 &lt;strong&gt;시드(seed)를 고정&lt;/strong&gt;하면 같은 인물의 표정·각도만 바꿔가며 여러 컷을 뽑을 수 있어요. 이렇게 &amp;lsquo;아리&amp;rsquo;라는 고정 캐릭터가 탄생했습니다.&lt;/p&gt;
&lt;p&gt;&lt;img alt="AI로 생성한 가상 아나운서 ‘아리’의 얼굴" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://junstellar.github.io/p/ai-virtual-human/cover.png" srcset="https://junstellar.github.io/p/ai-virtual-human/cover_hu_ffca894a472976fd.png 800w, https://junstellar.github.io/p/ai-virtual-human/cover.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;h2 id="-목소리--edge-tts로-공짜-한국어-음성"&gt;② 목소리 — edge-tts로 공짜 한국어 음성
&lt;/h2&gt;&lt;p&gt;대본은 아주 짧게 잡았습니다. &lt;em&gt;&amp;ldquo;안녕하세요, 저는 AI로 생성된 아리입니다. 반갑습니다.&amp;rdquo;&lt;/em&gt; 이 문장을 마이크로소프트의 &lt;strong&gt;edge-tts&lt;/strong&gt;(무료 TTS)로 한국어 음성 파일로 만들었습니다. 여성 음성 &lt;code&gt;ko-KR-SunHiNeural&lt;/code&gt;을 쓰면 발음이 꽤 자연스럽습니다.&lt;/p&gt;
&lt;h2 id="-입-움직임--sadtalker로-립싱크"&gt;③ 입 움직임 — SadTalker로 립싱크
&lt;/h2&gt;&lt;p&gt;핵심은 여기입니다. &lt;strong&gt;SadTalker&lt;/strong&gt;는 사진 한 장과 음성 파일만 주면, 음성에 맞춰 입과 표정을 움직이는 영상을 만들어 주는 오픈소스 프로젝트예요. 완전 무료이고 내 GPU에서 돌아갑니다. 얼굴 사진 + 아까 만든 음성을 넣으면 끝.&lt;/p&gt;
&lt;p&gt;그런데 여기서부터 &lt;strong&gt;삽질&lt;/strong&gt;이 시작됐습니다. 그냥은 안 예쁘게 나오더라고요. 실제로 통했던 팁을 공유합니다.&lt;/p&gt;
&lt;h3 id="팁-1-소스-사진은-반드시-입을-다문-얼굴로"&gt;팁 1. 소스 사진은 반드시 &amp;lsquo;입을 다문&amp;rsquo; 얼굴로
&lt;/h3&gt;&lt;p&gt;처음엔 활짝 웃으며 이빨이 보이는 사진을 넣었더니, 입 주변이 뭉개지면서 &lt;strong&gt;에일리언처럼&lt;/strong&gt; 어색했습니다. 알고 보니 SadTalker는 &lt;strong&gt;입을 다문 무표정 사진&lt;/strong&gt;을 소스로 줄 때 립싱크가 훨씬 자연스럽게 나옵니다. 입 벌린 사진은 그 벌어진 입 위에 억지로 립싱크를 얹느라 망가지는 거죠.&lt;/p&gt;
&lt;p&gt;&lt;img alt="입 벌린 소스(왼쪽)는 립싱크가 어색하고, 입 다문 소스(오른쪽)가 훨씬 자연스럽다" class="gallery-image" data-flex-basis="489px" data-flex-grow="203" height="512" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://junstellar.github.io/p/ai-virtual-human/src-comparison.png" srcset="https://junstellar.github.io/p/ai-virtual-human/src-comparison_hu_9d566e9c97ae602d.png 800w, https://junstellar.github.io/p/ai-virtual-human/src-comparison.png 1044w" width="1044"&gt;&lt;/p&gt;
&lt;p&gt;같은 인물(시드 고정)로 &lt;strong&gt;입 다문 버전&lt;/strong&gt;을 새로 뽑아 소스로 교체하니 확연히 좋아졌습니다.&lt;/p&gt;
&lt;h3 id="팁-2-expression_scale은-과하지-않게"&gt;팁 2. &amp;rsquo;expression_scale&amp;rsquo;은 과하지 않게
&lt;/h3&gt;&lt;p&gt;표정 강도 옵션(&lt;code&gt;expression_scale&lt;/code&gt;)을 1.2로 주면 입이 과장돼서 부자연스럽습니다. &lt;strong&gt;1.0 정도&lt;/strong&gt;가 딱 적당했어요.&lt;/p&gt;
&lt;h3 id="팁-3-어깨까지-나오게-하려면-_full-결과물을-쓰세요"&gt;팁 3. 어깨까지 나오게 하려면 &amp;lsquo;_full&amp;rsquo; 결과물을 쓰세요
&lt;/h3&gt;&lt;p&gt;SadTalker는 결과 영상을 두 개 만듭니다. 하나는 &lt;strong&gt;얼굴만 크롭한 버전&lt;/strong&gt;, 다른 하나는 파일명에 &lt;code&gt;_full&lt;/code&gt;이 붙은 &lt;strong&gt;원본 사진 전체(어깨·상반신 포함)에 얼굴을 합성한 버전&lt;/strong&gt;입니다. 얼굴만 크게 나와서 답답하다면 &lt;code&gt;_full&lt;/code&gt; 쪽을 쓰면 됩니다. 저도 이걸 몰라서 한참 헤맸어요.&lt;/p&gt;
&lt;h3 id="팁-4-설치-pytorch는-cu121-조합이-안전"&gt;팁 4. (설치) PyTorch는 cu121 조합이 안전
&lt;/h3&gt;&lt;p&gt;설치할 때 가장 흔한 함정이 GPU용 PyTorch입니다. 최신 그래픽 드라이버가 깔린 PC에서는 오래된 &lt;code&gt;cu118&lt;/code&gt;(torch 2.0.1) 조합이 &lt;code&gt;c10_cuda.dll&lt;/code&gt; 로딩 에러(WinError 127)를 내는 경우가 있어요. &lt;strong&gt;&lt;code&gt;torch 2.1.2 + torchvision 0.16.2&lt;/code&gt; (cu121)&lt;/strong&gt; 조합으로 설치하면 안정적이고, SadTalker가 요구하는 라이브러리와도 호환됩니다.&lt;/p&gt;
&lt;h2 id="어느-정도-gpu가-필요할까"&gt;어느 정도 GPU가 필요할까
&lt;/h2&gt;&lt;p&gt;무겁지 않습니다. &lt;strong&gt;VRAM 8GB면 충분&lt;/strong&gt;해요. 저는 노트북용 RTX 4060(8GB)으로 돌렸고, RTX 3070급이면 동일하게 됩니다. 짧은 6초 클립은 몇 분이면 나오고, 화질 보정(gfpgan)까지 켜도 부담 없습니다. 다만 &lt;strong&gt;8분짜리 긴 영상&lt;/strong&gt;을 통째로 립싱크하면 프레임이 수만 장이라 꽤 오래 걸리니, 긴 강의 영상은 발표자를 화면 한켠에 작게 넣는 식이 현실적입니다.&lt;/p&gt;
&lt;h2 id="솔직한-결론--어디까지-되고-어디부터-안-되나"&gt;솔직한 결론 — 어디까지 되고, 어디부터 안 되나
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;된다:&lt;/strong&gt; 공짜로, 내 PC에서, 세상에 없는 인물이 내 대본을 읽는 영상을 만들 수 있다. 개인 프로젝트·학습·프로토타입엔 충분하다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;한계:&lt;/strong&gt; 아무리 팁을 써도 입 주변은 &amp;lsquo;완벽하게 자연스럽다&amp;rsquo;까진 못 간다. 자세히 보면 티가 난다. &lt;strong&gt;방송급으로 매끈한 걸 원하면&lt;/strong&gt; HeyGen·Synthesia 같은 상업 웹서비스(유료)가 답이다. 이때도 얼굴은 지금처럼 SDXL로 만든 걸 아바타로 넣으면 된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;라이선스 주의:&lt;/strong&gt; SadTalker는 본래 연구용으로 공개된 프로젝트라, 수익화 콘텐츠에 쓸 땐 라이선스를 한 번 확인하는 게 안전하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;돈 안 들이고 여기까지 만들 수 있다는 것 자체가, AI 도구가 얼마나 문턱을 낮춰놨는지 보여주는 것 같습니다. 다음엔 이 &amp;lsquo;아리&amp;rsquo;에게 슬라이드를 붙여 진짜 강의를 시켜볼 생각입니다.&lt;/p&gt;</description></item></channel></rss>