メインコンテンツへスキップ
見出し画像

Codexと3日で音声入力アプリを作った話|非エンジニアの個人開発

    こんにちは!ポケヌシです。

    今回は、僕がAIと一緒に開発してきたアプリの中から
    自分専用の音声入力ツールである

    『mojiline』

    モジライン

    の紹介をしていこうと思います!

    画像
    mojiline

    話した内容がそのまま文字になる。やっぱり音声入力は便利ですよね。


    mojilineを作ったきっかけ

    今回開発した『mojiline』は、機能としては「Aqua Voice」や「Typeless」といった、巷でよく知られている音声入力ツールとほぼ同じものです。

    ホットキーをポンと押して喋り始めると音声入力が開始され、話し終わるとその内容がテキストとして入力される。至ってシンプルな仕組みです。

    手入力よりも圧倒的に速いので、普段から執筆や文書作成をする方にはお馴染みのツールかもしれませんね。最近だと、CodexやClaude CodeなどのAIツールに対して、プロンプトを音声で入力するスタイルがAI界隈でもめちゃくちゃ流行っています(昨年の夏か秋くらいから流行り始めたイメージ)。

    そんな中、非エンジニアの僕がなぜこれを1から自作しようと思ったのか。理由は大きく2つあります。


    理由1:かさむAIサービスの固定費を削減したい!

    一番現実的な理由は「コスト」です。

    例えば、Aqua Voiceは月額約8ドル(今だと1,500円くらい?)。
    これだと年間で約18,000円になります。

    これ単体ならそこまで高額には見えないかもしれませんが、今って他にもたくさんのAIサービスがあるじゃないですか…。

    ・ChatGPT Pro:$200(30,000円)
    ・Claude Max:$110(16,500円)
    ・Geminiやその他サーバー代などなど……

    僕は、自分にとってレバレッジが大きく、生産性が上がるものにはガッツリ投資したい派です。
    ただ個人的に、音声入力アプリへの課金はChatGPTやClaudeに比べるとどうしても優先順位が下がってしまいます。

    「ここにかかる固定費をなんとか抑えられないか…?」
    というより
    「これ以上お金払いたくない」という感情が正しいかもしれません。笑

    こういったコスト面が1つ目の理由です。


    理由2:1から作り切る経験と、自分だけの「ベスト・オブ・ベスト」

    2つ目は、やっぱり僕自身の「個人開発の経験値」を積みたかったからです。

    既存のアプリを使っていて、ちょっとした不満ってありませんか?

    例えば設定画面が白すぎて眩しいとか(これはタイプレス)、そんな風にUI/UXがちょっと自分の好みに合わなかったり……。
    音声入力アプリって、普段そんなに設定を頻繁にいじらないせいか、開発側もそこまで設定画面に配慮していないケースが多い気がしているんです。

    というかこれは多分商業プロダクトの開発としては当たり前ですよね。
    音声入力アプリのUXの本丸は「音声入力」それ自体ですし。

    つまり、自分にとって本当に使いやすいデザイン、好きな機能だけで満たされた「オリジナルの最高傑作」を1から作り上げる。それをやりたいなと。

    そして非エンジニアだからこそ、この「最後まで作り切る経験」そのものに大きな価値があると思って開発を決めました。


    開発期間は…なんと3日!

    最初のコミットから、ほとんどの主要な機能が完成するまでにかかった期間は…

    なんと、3日。

    (バグ取りや細かいブラッシュアップを含めても5日です!)

    ちょっと異常ですよね。笑

    何度も言いますが、僕は個人開発だけをやっているわけではなく本業がありますし、何よりコードは1行も書けない非エンジニアです。

    基本的には全てローカル環境で動く仕組みにしたので、大きなセキュリティリスクもありません。本当に恐ろしい、そしてありがたい時代になりました……。


    非エンジニアゆえに苦労した?「デザインの壁」

    機能面に関しては、ゴールが「喋った文字を入力する」と明確だったのでAIとのやり取りもスムーズで大きな問題はありませんでした。

    今回僕が最も苦労し、同時にめちゃくちゃこだわったのが「見た目(UI)」です。

    せっかく自分専用で作るなら高級感や所有欲を出したいと思い、Appleの「Liquid Glass」をUIに採用しました。

    画像
    高級感!ありますよね!?

    Liquid Glassって賛否両論あるじゃないですか。
    個人的には結構好きで、ニュルンと動く感じとか(動的なアニメーション、屈折のことです)、透明感とか再現してみたかったんですよね。

    …が、これが本当に難しかった!笑

    macOSのネイティブアプリを作るのも初めてでしたし、何よりLiquid Glassの「光の屈折」や「背景の透明度」の性質を僕自身が全然理解していなかったんです。
    裏側が透けすぎて文字が見えなくなったり、UXとのバランスが取れなかったり。

    実装する側に立った時に「言語化」が全然できなくて、見た目と実装のギャップを埋めるために、Codexと何度も何度もやり取りを重ねました。
    Liquid Glassって、ただの静的なUIではなく「動的なエフェクト」なんだなぁと、身をもって再認識する良い経験になりました。

    他にも、喋っている時に画面にカプセル状のバー(HUD)を表示させて、リアルタイムで文字起こしされる様子が見えるようにしたり、音声入力の開始・終了時のエフェクト音をガラスの質感に合うようにこだわったり。

    画像
    リアルタイム文字起こし!カプセルもかわいい。

    僕の細かいこだわりに対して、Codexが本当に粘り強く頑張って形にしてくれました(ちょっと喧嘩もした)。


    自分専用だからこそ、こだわったこと

    自分専用アプリなので、機能のカスタマイズも自分が欲しい機能を詰め込んでいます。

    一番の工夫は、「ローカルLLM」と「クラウドのAPI」を両方使えるハイブリッド仕様にしたことだと思ってます。

    画像
    各ステップで色んなモデルを選択可能に

    音声入力の「文字起こし」や「テキストの整形(LLM)」のプロセスを段階的に分けて実装しています。

    ・スピード重視:Groqなどの高速な外部接続先(無料枠でも全然動きます)
    ・完全オフライン:「Whisper」や「Qwen」などのローカルLLM

    一般向けのサービスとしてマネタイズするなら「選べること」自体は不要かもしれませんが、こういう細かい設定を自分好みにガチャガチャ調整できるのが、個人開発のめちゃくちゃ面白いところです。

    画像
    Solidの見た目もあるけど使わない…笑

    実際にランニングコストはいくら?

    基本機能をローカルで動かせるように完結させているので、ベースの利用料は「無料」です。

    もちろん外部のGroqなどに繋いだ方が処理は速いのですが、Groqは無料プランの範囲でもかなり使えるので、今のところ実際の支払いは発生していません。

    ローカルLLM(Qwenなど)をフル回転させると、Macのメモリ使用量が跳ね上がったり本体が発熱したりするのでメイン使いはしていませんが、「完全ローカルでもいける」という選択肢があるだけで個人的には十分です。

    今回の開発を通して感じたのは、今後ローカルLLMの性能がさらに上がっていけば、この手の音声入力サービスにお金を払う必要は本当になくなっていくんだろうなということです。

    そもそもOS純正の音声入力機能がアップデートされてしまえばそれまでですし、これをビジネスとして成立させるのはなかなか難しい時代だな、とも痛感しました。


    アプリ作りはやっぱり楽しい!

    ビジネスにするのは難しくても、「自分が毎日使う愛着のあるツール」を、AIの力を借りて数日で作り切る。

    これって僕にとっては魔法のような体験ですし、何より「自分の考える力」や「AIを使つ力」がものすごく鍛えられます。誰でも作れる時代だからこそ、ぜひ皆さんも挑戦してみてください。

    もし「自分も音声入力アプリ作ったよ!」「こんな個人開発してるよ!」という方がいらっしゃいましたら、ぜひコメントで教えてください!

    今日はオリジナル音声入力アプリ『mojiline』の開発ログでした。

    この記事がいいなと思ったら、スキ、コメント、フォローをいただけると励みになります!

    それではまた、ポケットから🐈‍⬛


    付録:mojilineに実装済みの機能一覧

    実装済み機能
    (Codexに聞いたらいっぱい出てきました笑)

    macOS メニューバー常駐アプリ
    SwiftUI / AppKit ベースのネイティブ macOS アプリ
    `Option + M` によるグローバル音声入力ホットキー
    `Option + E` による Voice Edit ホットキー
    マイク権限・アクセシビリティ権限の状態表示と導線
    `AVAudioEngine` によるマイク音声キャプチャ
    音声データをファイル保存せず、メモリ上だけで扱う設計
    WhisperKit によるローカル文字起こし
    Apple Speech によるローカル文字起こしフォールバック
    Groq によるクラウド文字起こしオプション
    ローカル live transcript 表示
    録音中のコンパクト HUD
    波形表示・録音状態表示
    final transcript だけを挿入し、live transcript は挿入しない安全設計
    文字起こし後の文章整形
    ローカルルールによる簡易 cleanup
    Ollama / Qwen によるローカル cleanup
    OpenAI によるクラウド cleanup
    Groq によるクラウド cleanup
    辞書登録による固有名詞・専門用語補正
    置換ルール設定
    cleanup 前後の置換タイミング制御
    プロファイルごとの言語設定
    口調維持・丁寧さ設定
    フォーカス中アプリに応じたプロファイル切り替え
    Sensitive / Local Only プロファイル
    Sensitive プロファイルでの履歴保存・クラウド送信ブロック
    Accessibility API 優先のテキスト挿入
    クリップボード fallback によるテキスト挿入
    クリップボード内容の snapshot / restore
    選択範囲の読み取り
    選択範囲だけを対象にする Voice Edit
    Voice Edit の構造化出力パース
    選択テキストの要約・言い換え・箇条書き化などの編集フロー
    Voice Edit で選択範囲外を変更しないガード
    ask-about-selection の非破壊モード
    SQLite による履歴保存
    履歴検索
    履歴から再挿入
    履歴の再 cleanup
    履歴削除・全削除
    履歴保持期間設定
    Usage Ledger
    provider / model / latency / cost / token / audio seconds の記録
    raw transcript や音声を usage に保存しない設計
    Dashboard 表示
    音声入力時間、出力量、節約時間、入力ペース表示
    日本語向けに文字数/分ベースの Pace 表示
    provider 別 usage breakdown
    API キーの macOS Keychain 保存
    OpenAI / Groq API キー設定 UI
    Ollama readiness check
    WhisperKit モデル管理・ダウンロード UI
    provider 選択 UI
    local / cloud / cost / privacy / speed / quality が分かる provider 表示
    Glass / Solid appearance mode
    compact status HUD
    privacy-safe logging
    将来の Agentic Voice 用 no-op port
    Swift Testing によるユニットテスト群
    provider、routing、persistence、clipboard、privacy、Voice Edit まわりの自動テスト
    `script/build_and_run.sh` によるローカル build / sign / launch / verify


    ▼こちらも読んでいってね▼


     
     
    人を育てる力そのものを育てる|現場の課題を解く、マネジメントとAI活用の考え方・実践を発信|店舗経営・人材育成10年以上|OpenID AuthZEN WG参加|課題の見立てから仕組みづくり・開発まで支援|ROGNALIA|ご相談→contact@rognalia.com

    あなたへのおすすめ