見出し画像

ChatGPTでAIにWindows用文字起こしアプリを作ってもらって販売した話

注:最後のアプリの売り上げに関する部分と、アプリ開発時のChatGPTとの会話の完全なやり取りのオマケ部分のみ有料となります。

Whisperを使って誰でも手軽にサクッと高精度文字起こしができるWindows用アプリ「MyWhisper(マイウィスパー)」をChatGPTに作ってもらってboothで販売したという話です。

https://umiyuki.booth.pm/items/4663311


MyWhisperのスクショ

経緯


この前、けんすうさんが音声文字起こしの文章をChatGPTに整形してもらうというアイデアを紹介していました。

これまで私は音声文字起こしを有効活用できてませんでした。というのも、音声だと途中で「あ~」とか「え~」とか言っちゃったり言い間違えした部分まで文字起こしされちゃうし、それだと修正が面倒でイチから書き直した方がよくね?みたいな気分になりがちです。かと言って、言い間違えないように喋ろうとすると緊張して何も言えなくなります。

けんすうさんの方法で音声文字起こしをChatGPTに整形してまとめてもらえばテキトーに喋った内容でも大丈夫になりそうです。

じゃあ早速Windowsのボイスレコーダーで録音した音声を文字起こししよう!と思って、高精度文字起こしできるWhisperのWindowsアプリを探しましたが、見つかりませんでした。

うせやろ?
OpenAIがWhisperをオープンソースで公開したのは2022年の9月、あんだけ精度がスゴイ!って話題になってたのに、それから半年も経って、まだ誰も手軽にサクッとWhisper文字起こしできるWindowsアプリを作ってない?
これは由々しき事態ですね。

ちなみにMac用のアプリはあります↓
https://goodsnooze.gumroad.com/l/macwhisper

しゃ~ないから自分で作るか。でも面倒だなあ、と思いました。
そこで思い付いたのが、ChatGPTにアプリ作ってもらえばいんじゃね?と言う事です。

ChatGPTにアプリ作ってもらった!みたいな記事はすでに一杯出ています。
私もChatGPTのプログラミング能力がそんなに凄いなら試してみたかったのですが、作ってもらうべきものが思いつかないでいました。
意味ないもの作らせてもしょうがないし。

アプリといってもWhisper.cppをビルドするだけでWindowsバイナリができあがります。しかしコマンドラインアプリなところが取っつきにくいので、あと必要なのはコマンドを設定できるガワのGUIだけです。
Whisperのコマンドを叩くだけ(ちなみにWhisper.cppは16000Hzのwavファイルしか入力できないので、オーディオファイルの変換処理も必要です)のGUIのガワアプリなら手軽で実験として丁度いいですね。自分も使いたいアプリだし。C#のWindowsフォームアプリなら、最悪ChatGPTが使いモンにならなくても自力でフォローして作れますし。

アプリの開発

さて、実際にChatGPTにコード書かせてみてどうだったのかというと、驚きの結果でした。
ちなみに、ChatGPTのモデルは全てGPT-4を使用しました。
ChatGPTとの最初のやり取りを掲載します。↓


USER

.netframeworkとC#を使用して、GUIから複数のオーディオまたはビデオファイルを開き、サンプルレート16000Hzのwavファイルに変換し、Whisperというアプリケーションを使用して、オーディオファイルをテキストに書き起こします。 Visualstudio Whisperアプリケーションを使用して、オーディオファイルをテキストに書き起こすWindowsアプリケーションを作成します。対応するファイル形式は、wav、mp3、m4a、mp3、aviです。

例えばWhisperというアプリケーションは、次のようなコマンドで実行できます。" main -m ggml-model-whisper-small.bin -t 4 -otxt -f file.wav" これで、音声を書き起こし、テキストファイルを同じディレクトリに保存します。ファイル.wavは入力するwavファイルへのパスです .

ASSISTANT

複数のオーディオまたはビデオファイルを開き、サンプルレート16000HzのWAVに変換し、Whisperアプリケーションを使って書き起こすWindowsアプリケーションを、.NET Frameworkを使用してC#で作成するには、以下の手順が必要です:

  1. Visual Studio で新しい Windows Forms アプリケーションを作成します。

  2. ボタン、ラベル、選択したファイルを表示するファイルリストボックスなど、必要なコントロールを含むGUIをデザインする。

  3. 3.オーディオ変換のためのNAudio(https://github.com/naudio/NAudio)、ビデオ変換のためのMediaToolkit(https://github.com/AydinAdn/MediaToolkit)など、必要な依存関係を追加します。

  4. ファイル変換とWhisperアプリケーションを実行するためのロジックを実装します。

以下はその実装例です:

using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using NAudio.Wave;
using MediaToolkit;
using MediaToolkit.Model;

namespace AudioTranscriptionApp
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void btnBrowse_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog
            {
                Multiselect = true,
                Filter = "Audio/Video files|*.wav;*.mp3;*.m4a;*.mp4;*.avi"
            };

            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                foreach (string file in openFileDialog.FileNames)
                {
                    fileList.Items.Add(file);
                }
            }
        }

        private void btnTranscribe_Click(object sender, EventArgs e)
        {
            string whisperCommand = "main";
            string whisperArguments = "-m ggml-model-whisper-small.bin -t 4 -otxt";

            foreach (string file in fileList.Items)
            {
                string outputWavPath = Path.ChangeExtension(file, ".wav");
                string outputPath = Path.ChangeExtension(file, ".txt");

                ConvertToWav(file, outputWavPath);
                string arguments = $"{whisperArguments} -f \"{outputWavPath}\" -o \"{outputPath}\"";
                RunWhisper(whisperCommand, arguments);
            }
        }

        private void ConvertToWav(string inputPath, string outputPath)
        {
            string extension = Path.GetExtension(inputPath).ToLower();

            if (extension == ".mp4" || extension == ".avi")
            {
                ConvertVideoToWav(inputPath, outputPath);
            }
            else
            {
                ConvertAudioToWav(inputPath, outputPath);
            }
        }

        private void ConvertAudioToWav(string inputPath, string outputPath)
        {
            using (var reader = new MediaFoundationReader(inputPath))
            using (var resampler = new MediaFoundationResampler(reader, new WaveFormat(16000, 1)))
            {
                WaveFileWriter.CreateWaveFile(outputPath, resampler);
            }
        }

        private void ConvertVideoToWav(string inputPath, string outputPath)
        {
            string tempOutputPath = Path.ChangeExtension(inputPath, ".temp.wav");

            var inputFile = new MediaFile { Filename = inputPath };
            var outputFile = new MediaFile { Filename = tempOutputPath };

            using (var engine = new Engine())
            {
                engine.GetMetadata(inputFile);
                engine.Convert(inputFile, outputFile);
            }

            ConvertAudioToWav(tempOutputPath, outputPath);
            File.Delete(tempOutputPath);
        }

        private void RunWhisper(string command, string arguments)
        {
            var process = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = command,
                    Arguments = arguments,
                    RedirectStandardOutput = true,
                    UseShellExecute = false,
                   

### USER
go on

### ASSISTANT
CreateWindowStyle = ProcessWindowStyle.Hidden
                }
            };

            process.Start();
            process.WaitForExit();
        }
    }
}

このコードサンプルは、`fileList` という名前のファイルリストボックス、`btnBrowse` という名前の "Browse" ボタン、`btnTranscribe` という名前の "Transcribe" ボタンといった必要なコントロールを備えた Windows Forms アプリケーションを設計していることを前提としています。

NuGet Package Managerを使用して、必要な依存関係をインストールすることを忘れないでください:

  • NAudio

  • メディアツールキット

パッケージのインストールは、Visual StudioのPackage Manager Consoleを使用して、以下のコマンドで行うことができます:

Install-Package NAudio
Install-Package MediaToolkit

このサンプルアプリケーションでは、以下のことを行ってください:

  1. 参照」ボタンをクリックすると、ファイルダイアログが開き、複数の音声ファイルや動画ファイルを選択できる。

  2. 選択されたファイルを 16000Hz の WAV ファイルに変換する。

  3. 3.提供されたコマンドと引数でWhisperアプリケーションを実行し、WAVファイルの文字起こしを行う。

  4. テキストファイルとして、入力ファイルと同じディレクトリに保存します。

変数 `whisperCommand` でWhisperアプリケーションへのパスを調整する必要があるかもしれないことに注意してください。


ご覧のとおり、私は「オーディオファイルを変換してWhisperで文字起こししてくれるアプリを作って。Whisperはこんな感じのコマンドで使います」という感じで、どうせ無理だろうなと思いつつ相当な無茶振りをかましました。
もしも相手が人間だったらこんなん言ったらキレられるかも。

しかし、ChatGPTは完璧なコードを出力しました!すごい!ChatGPTはコードは書いてくれますが、GUI部分は人間が作る必要がありますが、それについてもChatGPTは丁寧に手順を説明してくれてます。
す…すごすぎる…。

その後も長々とChatGPTとやり取りましたが、気になった点を細々と追加要求した感じです。(ChatGPTのとの全てのやり取りは有料部分にて掲載してます。)例えば処理の進捗を表示して欲しい、とか、Whisperのパラメータを細かくGUIで調整できるようにしたい、とか多言語対応したい、とかです。
ChatGPTの言いなりでコードをコピペしてたら、なんかエラーが出てしまう時もありました。その時は「エラーが出ちゃいました」と言って表示されてるエラーを貼り付けると、ChatGPTはエラーの修正方法を的確に教えてくれます。素晴らしいです。まあそれだったら最初から正しい方法を教えてくれてたら一番良かったけど。ChatGPTが「混乱させて申し訳ありません」って謝ってくる時は「ヤベッ、やらかした」と思ってる時です。

ちなみに、ChatGPTとのやり取りは実際にはすべて英語で行いました。先ほど掲載した会話はDeepLで日本語翻訳したものです。GPT-4は日本語でもかなり性能が出るようになったと言われていますが、やはりまだまだ日本語と英語で性能差を感じます。まどマギの4コマ漫画のネタを考えさせた事がありますが、日本語と英語でネタのクオリティがまったく違いました

私の場合は、ChatGPTに質問する時はまずNotionに日本語で書きます。それからDeepL翻訳で英語にしてChatGPTに入力します。するとChatGPTの出力も英語で返ってくるので、またDeepL翻訳で日本語にしてからNotionにコピペして読んでます。
回りくどいですが、最高の回答を求めるなら英語が安牌です。

ChatGPTはコンテキスト枠が4096トークンです。コンテキスト枠というのは要するに記憶の容量みたいなもんです。
だから会話が長くなってくるとChatGPTは最初の方に話してた事をどんどん忘れていきがちです。そんなわけですからChatGPTが話の流れをだんだんと忘れていかないかビクビクしながら会話してたわけですが、今回については結局最終的に相当長い会話になったにも拘わらず、ChatGPTの回答は破綻せずに済んでたように感じました。

あと、今回は実験だったし上手く行くか分からないのでアプリが完成するまでバージョン管理してませんでした。しかし、完成度が上がってきた段階でChatGPTの書いたコードコピペしてエラーが出ると結構ドキッとするのでちゃんとバージョン管理して、こまめにコミットして巻き戻せるようにしてた方がいいなと思いました。まあ今回の実験の範囲ではChatGPTはちゃんとエラー修正してくれてたのであんま心配いらないかもしれませんが。

ちなみに、ChatGPTにほとんどのコードは書いてもらったものの、本当に全部書いてもらったわけでも無く、一部私が勝手に追加したり修正したコードもあります。まあやり取りを増やせば完全に全てのコードを書いてもらう事も可能だったと思いますが、細かい事をイチイチ訊くことで会話が長引いてコンテキストを忘却されるのが怖かったという事もあります。

アプリの開発期間ですが、タラタラやってたので3日くらいかかりました。もしもChatGPTを使わないで自力で開発してたら、3倍の9日くらいかかってたかも?という感じです。
こういうアプリの開発って、結局ドキュメント読んだりググったりしてる時間がほとんどなので、そこをChatGPTはいきなり答え出してくれてググッて情報探す手間がスキップできちゃうのがエグいですね。GitHub Copilotはまだ使った事ないですが、ChatGPTと組み合わせたらさらに高速に開発できちゃうんだろうか?
GPT-4は回答にやや時間がかかるという事もあります。次は高速なGPT-3.5-Turboモデルでも開発できるか試してみたいですね。

アプリが完成して、リリースについて

さて、MyWhisperアプリはこうして完成しましたが、自分で使うのもいいですが、どうせならみんなに配布したいですよね。

Whisperによる高品質な文字起こしができるアプリというのは、自分で言うのも何ですが(そして私じゃなくてOpenAIの手柄ですが)なかなか便利だと思います。自分で喋った音声や、インタビュー、動画音声も文字起こしできます
srt形式で出力する事もできるので、Youtube動画用の字幕なんかもサクッと作れるでしょう。
また、WebサービスやAPI、クラウドなどに比べて、ローカルで処理が完結するアプリはセキュリティ面でも安心できるでしょう。社内の機密情報なども入力できます。

とは言えWindowsアプリってなかなか配布するストアとか目ぼしいものが無いんですよね。Steamみたいな所がベストですが、Steamは細々した実用アプリを買う印象ないですからね。

Gumroadはどうだろう?
MacでWhisperが使えるMacWhisperはGumroadで販売しています。
ちなみにMacWhisperの有料版は16ユーロ(約2300円)です。無料版だとTinyモデルとBaseモデルしか使用できません。ちなみにこれには理由があります。Gumroadだと無料アプリは250MBまでしかアップロードできません。
有料アプリなら無制限(1ファイルあたり16GBまで)です。

WhisperモデルはTinyが75MB、Baseが144MB、Smallが476MB、Mediumが1.5GB、Largeが3GBあって、かなりでかいです。

そこで、MyWhisperはboothで配布する事にしました。boothは無料アプリでも10GBまでアップできて太っ腹です。ただし、1ファイル1GBが上限なので、それ以上のサイズだと分割して圧縮する必要があります。

そしてMacWhisperにならって有料版と無料版を設定しました。ファイルサイズ制限がないので、MyWhisperは無料版でもLarge以外の全てのモデルが使用できるようにしました。英語ならMediumでも十分な品質が得られますし、日本語もそれなりの品質なので、無料版で十分使えるでしょう。

MacWhisperに比べて価格を抑えているのは、あっちよりも機能が少ないし、実験で作った感じなので好評でなければアプデする予定もないし、サポートも最小限しかできないと思われるからです。払い戻し対応もできないので、諦めがつくくらいの価格にさせていただきました。

ちなみにGPUで処理するオリジナルのWhisperではなく、CPUで処理するWhisper.cppを採用したのは、その方が多くのPCで動作するからです。GPU処理の方が高速かもしれませんが、動作する環境が限られてしまいます。そうなるとトラブルが増えてサポートコストが増えてしまいます。サポートに時間を取られるのは避けたい事態です。

あと、MyWhisperのソースコードはGitHubにてオープンソース(GPLライセンス)で公開しています。
https://github.com/umiyuki/MyWhisper

正直オープンでもオープンじゃなくてもどっちでも良かったんですけど、アプリの中で使ってるMediaToolkitというライブラリが内部でFFMpegを使ってて、これのライセンスがGPLだかLGPLらしいので、とりあえずGPLライセンスにしました。
でもソースコードほとんどChatGPTに書いてもらったし、ChatGPTの出力に著作権は無いだかいう話らしいのに、ライセンスとか付けていいんだろうか。

おわり

というわけで、ChatGPTを使ってMyWhisperというアプリを作って販売してみた話でした。
MyWhisperをダウンロードしてくれた皆様、そして購入してくれた皆様、ありがとうございました。

次はUnityゲームをChatGPTに作ってもらいたいですね。本当はUnityよりUE5がいいんですが、UEはコードじゃなくてブループリントだからChatGPTには無理でしょうね。

さて、この後は有料部分に続きますが、まず昨日からMyWhisperを販売開始してみて結局何本売れたのか?について簡単に書きます。それからアプリ開発の中でのChatGPTとのやり取りの会話を全文載せています。英語のやり取りと、それをDeepL翻訳で日本語にしたもの両方を掲載しました。
ChatGPTでアプリ開発する際の参考になるかもしれないし、ならないかもしれません。

まあ有料部分はオマケみたいなもんなので、よっぽど興味がない限り購入しなくても大丈夫です。

ここから先は

92,512字 / 1画像

¥ 1,500

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