Claude Code 플러그인, 통째로 깔지 않고 알맹이만 빼왔다

지난 편 → 6편 — 챗GPT랑 클로드, 왜 서로 대화는 못 시킬까 Claude Code로 한동안 일하다 보면, 남이 만들어 둔 도구를 가져다 쓰고 싶어지는 순간이 옵니다. 마켓플레이스에 올라온 플러그인 중 하나가 눈에 들어왔습니다. 코드를 필요 이상으로 부풀리지 않게, "게으른 시니어 개발자"처럼 최소로만 짜도록 붙잡아 주는 도구였습니다. 마음에 들었습니다. 그런데 막상 설치하려니 손이 멈췄습니다. 제가 원한 건 그 안에 담긴 원칙 하나 였는데, 플러그인은 그것 말고도 이런저런 것들을 통째로 데려옵니다. 안 쓸 기능까지 제 환경에 얹히는 게 영 내키지 않았습니다. 그래서 깔지 않고, 열어서 필요한 알맹이만 빼내기로 했습니다. 그러려면 먼저 "플러그인"과 "스킬"이 뭐가 다른지부터 알아야 했습니다. 스킬과 플러그인은 뭐가 다른가 한 줄로 하면 이렇습니다. 스킬은 부품 하나, 플러그인은 부품을 담은 상자. 스킬(Skill) 은 최소 단위입니다. SKILL.md 라는 마크다운 파일 하나가 전부고, 필요하면 옆에 보조 파일(스크립트·데이터)을 둘 수 있습니다. 두는 곳도 단순합니다. 개인용: ~/.claude/skills/<이름>/SKILL.md 프로젝트용: .claude/skills/<이름>/SKILL.md 파일 맨 위 frontmatter에 "이 스킬을 언제 써야 하는지"를 적어두면, Claude가 상황을 보고 알아서 불러 씁니다. 아니면 /스킬이름 으로 직접 부를 수도 있습니다. 말하자면 "이 일은 이렇게 처리해라"라고 적어둔 지침 한 장 입니다. 플러그인(Plugin) 은 그 부품들을 담아 배포하는 상자입니다. .claude-plugin/plugin.json 이라는 매니페스트를 중심으로, 여러 종류의 구성요소를 한 번에 묶습니다. skills/ — 스킬들 agents/ — 커스텀 에이전트(서브에이전트...

음성으로 코딩하기 (7편) — 소리를 키워도 안 됐다: 무료 모델의 벽

인식이 자꾸 약하길래 "소리가 작아서 그런가?" 했어요. 그래서 음량을 키워봤죠. 그런데 키워도, 더 키워도 안 됐습니다. 결국 마주한 건 무료 모델의 천장이었어요.

지난 편 → 6편 — 한국어로 말했는데 영어로 알아듣는 이유

"소리가 작아서 그런가?" — 게인을 넣었어요

핀마이크가 USB라 윈도우 입력 볼륨은 이미 최대(100%)였어요. 마이크 부스트 같은 것도 없었고요. 그래서 소프트웨어로 소리를 키우는(게인) 기능을 넣었어요. 인식기에 들어가기 직전에 음량을 몇 배로 증폭하는 거죠.

키워도, 더 키워도 안 됐어요

게인을 1.5배, 3배, 5배까지 올려봤어요. 로그로 레벨이 실제로 올라간 것도 확인했고요. 그런데 정작 인식은…

게인 배수입력 레벨"긁어온" 인식
×1.5낮음즐거운 ❌
×3중간즐거운 ❌
×5원음 수준즐거운 ❌

소리를 원음 수준까지 키웠는데도 "긁어온"이 여전히 "즐거운"으로 틀렸어요. 여기서 깨달았죠. 음량은 범인이 아니었구나. whisper의 음향 모델은 생각보다 튼튼해서, 소리가 좀 작아도 알아듣긴 하더라고요. (재밌게도, 게인이 없어도 인식하던 걸 데이터가 보여줬어요.)

진짜 벽은 모델 자체였어요

그러면 "긁어온"은 왜 안 될까? 이건 음량이 아니라 whisper 모델이 그 발음을 잘 못 잡는 문제였어요. 비슷한 걸 하나 더 발견했죠.

"싶어요"라고 말하면 자꾸 "싶습니다"로 바꿔서 인식했어요. whisper의 디코더는 사실 언어모델이라, 학습한 데이터(뉴스·문어)에 격식체(-습니다)가 훨씬 많다 보니, 음향이 조금만 애매해도 더 익숙한 "-습니다"로 완성해버리는 거였죠.

즉 모델이 "내가 아는 그럴듯한 말"로 밀어붙이는 경향이 있었어요. 이건 소리를 아무리 키워도 안 바뀌는, 모델의 성격 같은 거였죠.

initial_prompt도 양날이었어요

"긁어온"을 힌트 목록(initial_prompt)에 넣어봤어요. 그랬더니 "긁어온"은 잘 잡혔는데, 이번엔 음향이 비슷한 "읽어온"이 "긁어온"으로 끌려갔어요. 한쪽을 세우면 다른 쪽이 희생되는 거죠. 만능 해결책은 없었어요.

결론 — 여기까지가 무료 모델의 천장

정리하면 이랬어요.

  • 음량(게인) 은 어느 선까지만 도움 — 결정타는 아님
  • whisper large-v3 는 무료로 쓰기엔 훌륭하지만, 애매한 발음을 "익숙한 말"로 밀어붙이는 한계가 있음
  • initial_prompt 는 도메인 단어엔 좋지만 유사어 충돌 시 양날

이 이상은 모델을 바꾸거나(유료·대형·파인튜닝), 인식 후 LLM으로 교정하는 별도의 큰 작업이 필요했어요. 무료 모델로 갈 수 있는 데까지는 온 거죠. 한계를 명확히 아는 것도, 다음 결정을 위한 수확이었어요.

다음 편

이제 인식 싸움은 일단락. 다음은 매번 켜기 귀찮던 걸 자동화하고, 설정을 코드 수정 없이 바꾸는 이야기. → 8편 — 매번 켜기 귀찮아서: 자동화와 설정 철학


(이전 편: 6편 — 한국어로 말했는데 영어로 알아듣는 이유)

댓글