文字起こしの「最後の仕上げ」をClaudeに管理者用と作業員用、ちょっと奇妙な2本立て
録った音声を後から、AIで仕上げまで文字起こしするMacアプリを作った。Claudeを使う管理者用と、聞いて直すだけの作業員用の2本立て。理由のひとつは「課金」。依頼から2.1.0まで3日半。
シルバーウィークのもう1本。脚本エディタの裏で、文字起こしのアプリも作っていた。
役所でも、文字起こしはきっとやっている。議事録、聞き取り、会議の記録。もしかしたら、リアルタイムで字幕を出しているところもあるかもしれない。
うちはそこまでではない。録った音声を後から、AIの力で最後の仕上げまで。 そこを狙ったMacのアプリが CacaoTrans である。Transは Transcription(文字起こし) のTrans。長いので縮めた。翻訳(Translation)ではない。
そしてこのアプリ、ちょっと奇妙な作りになっている。同じソースから、2本のアプリが出てくる。
Claudeは耳を持っていなかった
9月20日の昼前、AIにこう頼んだ。「Claudeへログインして、Claudeベースで文字起こしをするアプリを作りたい。話者1・2・3のように分けて。60分以上の音声もある。最初はMac専用、Swiftで」。
最初の返事は「作れます。ただし先に2点」だった。
- Claudeは音声ファイルを直接聞けない。 受け取れるのはテキスト・画像・PDF。
- 「Claudeへログイン」はできない。 claude.aiの月額契約(Pro/Max)は外部のアプリからは使えない。使うにはAnthropic ConsoleのAPIキーが要り、こちらは使った分だけの従量課金になる。
「Claudeで文字起こし」は、最初の返事で崩れた。むむむ。
ただ、崩れた先の形のほうがよかった。音声を文字にするのはMacに任せ、Claudeには仕上げだけを頼む。三段構えである。
| 工程 | 担当 | 場所 | 費用 |
|---|---|---|---|
| 音声 → 文字 | Apple SpeechAnalyzer(macOS 26の純正オンデバイス認識) | Mac内 | 0円 |
| 話者分離(話者1・2・3…) | FluidAudio(CoreML版のpyannote) | Mac内 | 0円 |
| 誤変換・句読点・話者の補正 | Claude API | Anthropic | 60分で1〜2ドル程度 |
| 検索・置換、書き出し(Word・テキスト・Markdown・SRT字幕・CSV) | 自前 | Mac内 | 0円 |
音声はMacの外に出ない。 Claudeに送るのはテキストだけだ。そもそもClaude APIが音声を受け取らないのだから、出しようがない。役所の聞き取りのように、中身を外に出したくない音声には、ここが効くと思う。
Claudeの仕事は「機械/機会」のような誤変換を直し、句読点を打ち、話者の取り違えを補正し、固有名詞の表記をそろえること。プロンプトには「意味を変えない」「推測で創作しない」と書いてある。文字起こしを約2,500文字ずつに切って、前後の発話を少し添えて、3本並行で投げる。

1か所の失敗で、全部消えた
最初の長い音声で、いきなりつまずいた。
Claudeの出力には上限がある。その上限に「考える分」のトークンも含まれていて、あるチャンクの返事が途中で切れた。そこまではいい。問題は、1チャンク失敗しただけで、文字起こし全体を捨てて初期画面に戻る作りだったことだ。数十分かけた認識結果が、跡形もなく消えた。そのときの結果は戻らず、音声を開き直した。
直し方は3つ。上限を倍にする。それでも切れたらチャンクを半分に割ってやり直す。そして、Claudeが失敗しても認識と話者分離の結果は必ず残す。 Claudeの校正はできた分だけ反映し、「Claudeで校正だけやり直す」で再試行できるようにした。
お金も時間もかかる工程の結果は、何があっても捨てない。当たり前のことだが、当たり前は最初から入っているとは限らないのである。
「仕様ですか?」と聞いたら、仕様ではなかった
設定でClaudeのモデルを選べるのだが、安いHaiku 4.5が選択肢に無かった。「何か問題があって選べない仕様なのか」と聞いた。
仕様ではなかった。Haiku 4.5は、ほかのモデルと同じ「思考の深さ(effort)」の指定を受け付けない。それだけの実装の都合だった。モデルごとに送り方を切り替えて、選べるようにした。
| モデル | 100万トークンあたり 入力/出力 | ひとこと |
|---|---|---|
| Opus 5 | $5 / $25 | 標準 |
| Sonnet 5 | $2 / $10 | 半分以下 |
| Haiku 4.5 | $1 / $5 | 60分で20〜30円。思考なしで精度はやや落ちる |
| Fable 5.1 | $10 / $50 | 最上位。Opusの2倍 |
安いモデルを選べることも、課金の話の一部である。
なぜ2本立てなのか
9月21日の午前3時ごろ、「このバージョンはCacaoClaudeTransとして確定。次はClaude APIなしで編集するアプリをCacaoTransとして」と頼んだ。同じソースから、フラグ1つで2本を出し分ける。
| CacaoClaudeTrans(管理者用) | CacaoTrans(作業員用) | |
|---|---|---|
| 役割 | 音声 → 文字起こし → 話者分離 → Claudeで校正 → 編集 → 書き出し | .ccot を開いて、聞いて、直して、書き出す |
| Claude API | 使う(キーはmacOSのキーチェーン) | 入っていない。キー不要、ネットにもつながない |
| 音声認識エンジン | 入っている | 入っていない |
| サイズ | 43MB | 3MB |
1本で済みそうなのに、なぜ2本か。理由はいくつかある。
1つめは課金の壁。 Claudeを外部のアプリから使うには、APIキーが要る。APIキーは、言ってみれば財布だ。作業員全員にキーを配れば、キーの管理も請求の把握もばらばらになる。だから財布を持つのは管理者だけにした。作業員のアプリには、そもそもClaudeのコードが入っていない。
2つめは、お金のかかる仕事は1回だけにしたかった。 Claudeの校正は音声1本につき1回、60分で1〜2ドル。そのあとの「聞いて直す」作業は、何時間かかっても0円である。人の時間がかかる工程に、AIの従量課金を乗せない。
3つめは、作業員のMacを軽くしたかった。 認識モデルも話者分離のモデルも、APIキーも要らない。3MBで、設定画面すら無い。
4つめは、仕事の分け方がそのままアプリの分け方になった。 管理者は、音声を受け取り、背景と用語集を書き、仕上げまで流して、.ccot を1つ渡す。作業員は、開いて、F8で聞いて、直して、書き出す。
それでもソースは1つ。編集画面も再生も置換も書き出しも共通で、直せば両方に効く。
分けた直後、思わずこう書いた。「管理者がClaudeを使って文字起こしするClaudeTransと、作業員が編集するCacaoTransで作業分割できる、理想の作業環境ができました」。
背景を話せば、精度は上がるか
「事前に内容を説明すれば、精度は上がるか」と聞いた。
答えは切り分けてあった。上がるのはClaudeの校正のほう。誤変換の判断、固有名詞の統一、話者の補正には効く。音声認識そのものには効かない。 聞き取りが崩れている箇所は、Claudeにも直せない。創作しないように指示しているからだ。
そのうえでAIから「背景と用語集を、プロジェクト(.ccot)ごとに持たせては」と提案があり、採用した。開始時に「この音声について」のシートが出る。似た音声を続けて処理することが多いので、あとで「共通の背景」と「この音声だけの追記」の2段にした。
そして、Claudeにも直せないところは、作業員が耳で直す。だから作業員用のアプリには、再生のキーがどんどん増えていった。
作業員の声で、アプリが育った
9月21日の昼前にβ1.00を配った。GitHubも公開にした。作業員向けには、Applicationsへドラッグするだけのdmgと、マニュアルのPDFを付けた。
そこから先は、作業員の声で動いた。
| 版 | 日時 | きっかけ | 入ったもの |
|---|---|---|---|
| β1.00 | 9/21 11:19 | 配布開始 | 2本立て、dmg、マニュアルPDF |
| 1.1.0 | 9/21 14:01 | 「Tabで次の発話へ」「F8で再生と停止」 | Tab/⇧Tab、F8、メディアキー |
| 1.2.0 | 9/22 朝 | 「使いやすい」→「ccotだけ渡したい」 | 音声の同梱、背景の共通+追記、一致した発話だけ表示 |
| 2.0.0 | 9/22 10:26 | 同じ発話を何度も聞きたい | Spaceで頭から繰り返し再生 |
| 2.1.0 | 9/23 0:27 | 前後を行き来したい | F7前/F8再生/F9次(入力中でも効く) |
1.1.0は、要望が届いてから13分でリリースになった。仕様書は無い。「Tabで次へ行きたい」の一言で足りた。
9月22日の朝には「作業員から使いやすいというレポートが届いた」。うれしい。そのうえで欲が出た。音声と .ccot を別々に渡すのは面倒だ。.ccot の中に音声を入れてしまえば、1ファイル渡すだけで済む。 AACのモノラル48kbpsに圧縮して、1時間で約20MB。ZIPにはあえてしなかった。古い版のCacaoTransでも開けるように、JSONの中にそのまま入れた。
F7・F8・F9は、文字を打ちながら、耳で確かめるためのキーである。手をキーボードから離さずに、前の発話に戻り、聞き、次へ進む。

AIの仕上げでも、最後は人
Claudeが直した行には ✨ が付く。そこから校正前の原文が見られて、右クリックで「校正前の文に戻す」ができる。
これは「AIの出力なので、最終確認は人」という前提を、アプリの形にしたものだ。そして、それが作業員用アプリの存在理由でもある。
落とし穴をいくつか
再生バーで落ちる。 頻繁に書き換わる部品を、サイドバー付きの画面(NavigationSplitView)の列に置くと、AppKitの例外で落ちる。一度直したのに、検索パネルの「N件」を横並びにしたら同じクラッシュが再発した。置き場所ごと変えて決着。
再ビルドのたびにキーチェーンが聞いてくる。 正式な署名ではなくアドホック署名なので、ビルドが変わるたびに「このアプリにキーを渡していいか」の確認が一度出る。実害は無い。別のMacでは、初回だけ右クリック →「開く」が要る。
配布の中身
GitHubで公開している。MITライセンス。→ ICTCacao/CacaoTrans
macOS 26以降専用。話者分離のFluidAudio(Apache 2.0)のライセンスも同梱している。管理者用のCacaoClaudeTransを使うには、Anthropic ConsoleのAPIキーが要る。作業員用のCacaoTransは、キーも何も要らない。
数字で見る
| 項目 | 値 |
|---|---|
| 依頼から2.1.0まで | 約3日半(9/20 11:21 → 9/23 0:27) |
| コード | 約4,300行(Swift / SwiftUI) |
| アプリのサイズ | 管理者用43MB / 作業員用3MB |
| Claudeの校正費用 | 60分で1〜2ドル程度(Haikuなら20〜30円) |
| Claudeに投げる1チャンク | 約2,500文字、3本並行 |
| 同梱した音声 | 1時間で約20MB |
| 作業員の要望からリリースまで | 13分(1.1.0) |
AIとの協働作業での学び
最初に「できない」を言ってくれた。 「作れます。ただし先に2点」。音声は聞けない、契約では使えない。ここで言われなければ、私はログイン画面を作ろうとしていたかもしれない。できないことを先に聞けたので、Macの認識+Claudeの仕上げという、むしろ安くて、音声を外に出さない形に落ち着いた。
「仕様ですか?」と聞くと、実装の都合が出てくる。 Haikuの件がそれだ。AIが作ったものの「できない」は、AIの都合のこともある。遠慮せずに聞く。
2本立ては私の発想、背景をプロジェクトごとに持つのはAIの提案。 「事前に説明すれば精度は上がるか」という素朴な質問に、効くところと効かないところを分けて答え、そのうえで運用の形まで出してきた。どちらか片方だけでは、この形にはならなかったと思う。
現場の声が、そのまま仕様書になる。 「この発話を何回でも聞きたい」「前にも戻りたい」。作業員の一言がそのまま次の版になった。3日半で5回リリースできたのは、間に仕様書を挟まなかったからだ。
AIの仕上げでも、最後は人。 校正前の原文を残し、戻せるようにした。AIに仕上げを任せるほど、人が確かめる場所をちゃんと用意しておく。作業員用のアプリは、そのために生まれたのである。