NGW TECH BLOG
← 記事一覧へ
·#096

文字起こしの「最後の仕上げ」を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点」だった。

  1. Claudeは音声ファイルを直接聞けない。 受け取れるのはテキスト・画像・PDF。
  2. 「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 APIAnthropic60分で1〜2ドル程度
検索・置換、書き出し(Word・テキスト・Markdown・SRT字幕・CSV)自前Mac内0円

音声はMacの外に出ない。 Claudeに送るのはテキストだけだ。そもそもClaude APIが音声を受け取らないのだから、出しようがない。役所の聞き取りのように、中身を外に出したくない音声には、ここが効くと思う。

Claudeの仕事は「機械/機会」のような誤変換を直し、句読点を打ち、話者の取り違えを補正し、固有名詞の表記をそろえること。プロンプトには「意味を変えない」「推測で創作しない」と書いてある。文字起こしを約2,500文字ずつに切って、前後の発話を少し添えて、3本並行で投げる。

CacaoTransの編集画面。左のサイドバーにファイル名「インタビュー(佐藤).m4a」、長さ0:00:40、発話数11、文字数219。その下に「この音声について」として「地域の子育て支援に関する聞き取り。聞き手は山田、語り手は佐藤さん。」と用語集2件、話者1=山田・話者2=佐藤さんの名前付け。右側は発話が1行ずつ並び、各行に選択用の丸、再生ボタン、時刻(0:00:00〜0:00:36)、話者名のプルダウン、本文(「こんにちは。」「まず地域の子育て支援について現在の課題を教えてください。」「一番の大きな課題は人手不足です。」など)。画面下に前へ・再生・次へのボタン、再生位置のバー、速度1x、連続再生のチェック、話者「全員」の絞り込み(架空の音声で撮影)

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 / $560分で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のキーチェーン)入っていない。キー不要、ネットにもつながない
音声認識エンジン入っている入っていない
サイズ43MB3MB

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.009/21 11:19配布開始2本立て、dmg、マニュアルPDF
1.1.09/21 14:01「Tabで次の発話へ」「F8で再生と停止」Tab/⇧Tab、F8、メディアキー
1.2.09/22 朝「使いやすい」→「ccotだけ渡したい」音声の同梱、背景の共通+追記、一致した発話だけ表示
2.0.09/22 10:26同じ発話を何度も聞きたいSpaceで頭から繰り返し再生
2.1.09/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は、文字を打ちながら、耳で確かめるためのキーである。手をキーボードから離さずに、前の発話に戻り、聞き、次へ進む。

検索・置換のパネル。「検索する語句」「置き換える語句」の入力欄、「大文字と小文字を区別」「正規表現を使う」「一致する発話だけ表示」のスイッチ、「すべて置換」「元に戻す」のボタン。下の「使い方のヒント」には「漢字の誤変換は『機械 → 機会』のように語句で置換できます」「正規表現をオンにすると『機械(が|を)』→『機会$1』のような置換も可能です」「置換は全発話にまとめて適用され、⌘Zで元に戻せます」、発話の分割(⌘↩)・統合(⌥⌘↑/⌥⌘↓)、被った発言の挿入(⇧⌘↩)、複数の発話をまとめてつなげる(⌘J)の説明が並ぶ

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に仕上げを任せるほど、人が確かめる場所をちゃんと用意しておく。作業員用のアプリは、そのために生まれたのである。