見出し画像

時間無制限、無料の文字起こしアプリを開発したので、アプリ紹介と学びまとめ。

みなさん、こんにちは!9月は久しぶりに個人開発をしてました。

今回はGeminiを使って、ちょっと変わった文字起こしアプリを開発したので、その裏側をお話ししていきたいと思います。その名も「無限もじおこし」です!

「無限もじおこし」はその名の通り、時間無制限、無料で使える文字起こしアプリです。普通に考えたら「え?大丈夫なの?」って感じですよね笑

でも、ちゃんと収益的に成り立つ算段を立てています。この記事ではそこらへんの考えや、アプリ開発における技術的な学びについてまとめていきたいと思います!




「無限もじおこし」の紹介

主な特徴

音声の文字起こしが無制限に可能
(10時間でも100時間でも!)
使いやすさにこだわった機能
(コピー、シェア、自動タイトル生成など)
「よく使う単語帳」に登録すると、文字起こしの変換精度アップ
バックアップ機能があるので、機種変更などが発生しても簡単に引き継げます


そして、無料版でも十分使えますが、サブスク版も用意してます。広告非表示、バックグラウンド処理、音声ファイルのインポートによる文字起こしなどの機能が使えるようになります!

もちろん無料でも時間無制限で文字起こしできます!



アプリ戦略:なぜ無料で無制限なの?

さて、ここからが本題。なぜ無料で無制限に使えるアプリを作ったのか?その裏側をお話しします。

これまでの文字起こしアプリは、大きく分けて2パターンあったと思っています。

  1. 資金力のある会社が提供する時間制限付きの無料トライアル

  2. デバイス内で処理を完結させる(でも品質イマイチ&バッテリー消費大)タイプ

ただ「無限もじおこし」は、どちらでありません。時間制限なし、高品質、デバイスに負荷をかけないという、いいとこ取りに挑戦しました!


秘密は、運用コスト<広告収入

ここがミソなんですが、運用コスト<アプリ広告収入という形に落とし込めました(多分)。

と言ってもユーザー体験がすごく悪くなるのは嫌なので、アプリ下部に表示されるバナー広告のみに現状は留めてます!(10秒くらい全画面で強制的に広告を見させられるやつは無いです)

運用コストについては、個人開発だから人件費ゼロ、サーバーを持たずにデバイス内で処理&データ管理をする構成、そしてGeminiを使った低価格の文字起こし処理方式を見つけたおかげで、コストをガクッと下げられました。

具体的には、Gemini 1.5 Flash APIを使っているのですが、OpenAIのWhisper APIと比べると、なんと1/30〜1/50のコストで済みます!

例えば、1時間の音声データを処理する場合、

  • Gemini 1.5 Flash:$0.00675 => 1.0125円 +(outputが0.1円ほど)

  • OpenAI Whisper:$0.36 => 54円

Gemini では、オーディオの 1 秒あたりを 25 トークンとして表します。たとえば、1 分間のオーディオは 1,500 トークンとして表されます。

出典:https://ai.google.dev/gemini-api/docs/audio?lang=python

Gemini 1.5 Flash価格
Input Pricing

$0.075 / 1 million tokens
output Pricing
$0.30 / 1 million tokens

出典:https://ai.google.dev/pricing

Whisper
$0.006 / 分(秒単位で丸められる)

出典:https://openai.com/api/pricing/

つまり、ほぼ1/50のコストなんです。すごくないですか?正直僕も意味がわからんなと思いました笑

実際はGeminiでの文字起こしをするためには後処理を加えたりするので、1/30くらいに落ち着いたかなと思ってます。


技術的な学び

さて、ここからは技術的な話をしていきます。Geminiを使った文字起こし、実はWhisperとはちょっと違う特徴がありました。

これまでWhisperを中心に使ってきましたが、Geminiを使ってみると、良い点も課題も見えてきました。

Geminiだとプロンプトで多様なタスクへ対応可能

まず良い点から。Geminiによる文字起こしの素晴らしいところは、プロンプト次第でかなり多様なチューニングが可能なことです。

例えば、タイムスタンプの追加や、「あー」「えー」の除去、さらには話者分離まで、プロンプトを工夫することでかなり柔軟に対応できます。

出典:僕の過去記事より
https://note.com/nyosubro/n/n07afba435ef6

これは今後の機能開発においてかなり有利だなと思っていて、開発コストを抑えられるので迅速なアップデートができそうな気がしてます!


Geminiの固有名詞の変換精度が高い

そして、実は固有名詞の変換精度が高いのも大きな魅力です。

音声認識をさせる際に、「よく使う単語帳」に登録されている単語と読み仮名も一緒に登録すると、変換精度が格段に上がりました。しかもWhisperとは違って、登録できる単語数にほぼ制限がないので、本当に便利ですね。

Whisper APIには`prompt`というパラメータがあり、ここにテキストを入力すると文字起こしされるテキストに影響を与えることができます。固有名詞の変換精度向上や、句読点形式の制御などに使えます。ただし文字数に制限があり224トークンまでとなっています。

https://cookbook.openai.com/examples/whisper_prompting_guide

一方で、課題もありました。

出力の安定性がやや欠ける

Geminiは出力の安定性にやや欠ける面がありました。具体的には、音声ファイルを渡した時に指示に従わないケースが多かったり、実際の発言内容と少し異なる出力が返ってくることもありました。また沈黙が多い場合に、断り文句を言ってくることも。

これらの課題に対処するため、今回の「無限もじおこし」では、2段階の文字起こし処理を導入しました。

まず1段階目で、そのまま文字起こしをします。これはハルシネーション(幻覚)を防ぐためです。そして2段階目で、「あー」「えー」の除去や句読点の追加などの整形を行います。こうすることで、話した内容の正確性を保ちつつ、可読性の高い文字起こしテキストを実現できました(多分)


音声データ大きくなりすぎる問題

また、技術面でもう一つ工夫したのが音声データの分割処理です。音声収録を通した文字起こしをする場合、音声データが大きくなりすぎると以下の問題が発生します。

  • 処理に結構時間がかかってしまう。音声時間が長いほど伸びていく

  • 出力トークン制限(最大8k)があるので、全て文字起こしができない

そこで、音声検出技術を使って、話しているタイミングと沈黙しているタイミングを区別し、一定時間の沈黙が現れたタイミングで文字起こしを行うようにしました。これにより、(おそらく)ほとんどのケースで音声データを適切なサイズに変換できるようになったはずです。

ちなみに、iOS環境では音声検出にSoundAnalysisの分類モデルを使っています。有名なVADなど他の技術も試してみましたが、SoundAnalysisの精度が断然高かったです。ただし、Apple関連のOS環境でしか使えないのがちょっとネックですね。。

以下の記事が大変参考になりました!


今後の展望と仮説

さて、これからどんな機能を追加していこうか考えているところなんですが、いくつかアイデアがあります!

1. 生成AIを活用した文字起こし内容の変換

文字起こしした内容をもとに、何らかの形に変換したい場面があると思います。例えば、

  • 議事録要約

  • 記事コンテンツ化

  • アイデアの企画化など

ここら辺について、Gemini 1.5 Flashを使えば、コストを抑えつつ既存のサブスクの範囲内で実現できそうだなと思ってます。

いくつかコスト削減について考えていることをまとめてみます!

Gemini 1.5 Flashは100万トークンあたりの価格が、

  • インプット$0.075(11.25円)

  • アウトプット$0.30(45円)

なので、100万文字処理しても10〜45円程度です。インプットに比重が集まる形なので20円前後かなと思ってます。これでも十分問題なさそうですが、使い放題にするには少し心許ない水準。

なのでさらにトークン圧縮という観点で、GeminiのPDFアップロード機能に注目しています。PDF形式でインプットするとトークン数の節約になる可能性があります。

  • 1枚のPDFのトークンが固定($0.00002 / 1枚 = 約1066文字)

ただし実際には1枚のPDFにもっと多くの文字を入れられるので圧縮ができます。多分1.5倍から2倍くらい入れられそう。

ただしPDFは画像認識の能力も用いているようなので、テキストサイズを小さくしすぎると、精度が落ちる可能性があるなと思っており、最適なバランスを探る必要がありそうです。あと長文の場合どこまで記憶してくれるのかは未検証です。

PDF は画像として扱われるため、PDF の 1 ページは 1 つの画像として扱われます。プロンプトで許可されるページ数は、モデルがサポートできる画像の数に制限されます。

ジェミニ 1.0 Pro ビジョン: 16 ページ
Gemini 1.5 Pro および Gemini 1.5 Flash : 1000 ページ

PDF トークン化
PDF は画像として扱われるため、PDF の各ページは画像と同じ方法でトークン化されます。

また、PDF の料金は Gemini の画像料金に従います。たとえば、2 ページの PDF を Gemini API 呼び出しに含めると、2 つの画像を処理する入力料金が発生します。

出典:https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/document-understanding


2. 話者分離機能の導入

実はGeminiを使って話者分離はできそうです。以前にGemini 1.5 Proで検証しました!

ただし長い音声データの場合、音声データを分割する兼ね合いで、話者の一貫性が保てなくなる問題があります。これに対して、2つのアプローチを考えています。

  1. 話者のサンプル音声を事前情報として渡す

    • Gemini APIに話者A、話者Bそれぞれのラベルと音声ファイルを渡した上で文字起こししてもらうことで一貫性を保つ(未検証)

    • 課題:話者の音声データをどのように用意するかを検討が必要

  2. 声の性質をパラメータ化

    • 類似するパラメータを紐づけて話者の一貫性を担保(未検証)

    • 課題:精度は少し落ちそう。ただし実装しやすい可能性が高いので

これらのアプローチを検証して、話者分離機能の実装も頑張ろうと思っています!(おそらく議事録作成におけるニーズは高いと思うので!)


おわりに

今回初めてGeminiをメインに使ってアプリ開発してみて、本当に可能性を感じました。マルチモーダルなモデルだけあって、できることが多いです。そして何よりこのコスト感!個人開発者にとっては、まさに味方です。

ちなみに、9/24にGeminiの新モデル「gemini-1.5-flash-002」がリリースされたんですが、これも結構よかったです。

以前のバージョンと比べて、漢字の変換精度が上がった気がします。文脈に合った適切な漢字変換がより正確になった感じ。これからの進化が楽しみですね!

これからも皆さんのフィードバックを受けながら、どんどん使いやすいアプリにしていきたいと思います。ぜひ「無限もじおこし」を使ってみてください!無料なので!



追記

バージョンアップ情報はこちらにまとめています!

この記事が気に入ったらサポートをしてみませんか?