プロダクト概要

Whisper Wrapperは、whisper.cpp をGUIから扱うためのラッパーアプリである。

whisper.cpp はローカル環境で音声文字起こしができる便利なツールだが、基本的にはCUIで操作する必要がある。 また、入力できる音声ファイルの形式にも制約があるため、iPhoneなどで録音した音声をそのまま投げることが難しい。

そのため、音声ファイルを ffmpeg で変換し、その後 whisper.cpp をコマンドで実行する必要があった。

この一連の作業を毎回行うのが面倒だったため、GUIから音声ファイルを選択して、文字起こしまで実行できるアプリを作成した。

スクリーンショット

リポジトリ

https://github.com/syut-htnk/whisper-wrapper

背景

最近、音声の文字起こしをする機会が増えた。

文字起こし自体には whisper.cpp を使っていた。 ローカルで動作するため扱いやすく、精度も十分だったので、ツールとしてはかなり便利である。

しかし、実際に使っていると次のような手間があった。

  • CUIで操作する必要がある
  • 対応している音声形式が限られている
  • iPhoneで録音したファイルをそのまま使えない
  • 毎回 ffmpeg でwavに変換する必要がある
  • 変換後に、改めて whisper.cpp のコマンドを実行する必要がある

一回だけならそこまで気にならない。 ただ、頻繁に使うとなると、毎回この作業をするのはかなり面倒である。

特に、文字起こしをしたいだけなのに、ファイル形式やコマンドのことを考える必要があるのがあまり良くないと感じた。

そこで、GUI上で音声ファイルを選択するだけで、変換から文字起こしまで実行できるようにした。

使用技術

  • Tauri
  • Rust
  • ffmpeg
  • whisper.cpp

フレームワークにはTauriを使用した。

選定理由としては、まずXcodeをあまり使いたくなかったというのがある。 macOS向けのアプリを作る場合、素直に作るならXcodeを使う選択肢もあると思う。 しかし、今回はそこまで本格的なネイティブアプリを作りたい訳ではなく、普段の開発に近い感覚でデスクトップアプリを作りたかった。

また、Electronと比較してTauriはメモリ消費が少ないという話を聞いていた。 実際に厳密に比較した訳ではないので、本当にどれくらい軽いのかは分からない。 ただ、今回のような小さめのGUIアプリであれば、Tauriはちょうど良い選択肢だったと思う。

作成したもの

今回作成したのは、whisper.cpp をGUIから操作するためのアプリである。

主に、以下の作業をGUI上で完結できるようにすることを目指した。

  • 音声ファイルの選択
  • ffmpeg による音声形式の変換
  • whisper.cpp の実行
  • 文字起こし結果の取得

もともとは、これらをすべて手動で行っていた。

具体的には、録音ファイルを用意して、ffmpeg で対応形式に変換し、その変換後のファイルを指定して whisper.cpp を実行する、という流れである。

これをGUIで包むことで、コマンドを毎回書かなくても文字起こしができるようにした。

工夫した点

音声を分割してから文字起こしするようにした

今回の実装では、音声ファイルをそのまま whisper.cpp に渡すのではなく、一度1分ごとに分割してから、それぞれの音声に対して文字起こしを行うようにした。

理由としては、長時間の音声をそのまま whisper.cpp に渡したときに、同じ文章が延々と生成され続ける現象があったためである。

短い音声であれば問題なく文字起こしできるが、長めの音声になると、途中から出力が崩れてしまい、実際には話されていない文章が繰り返し生成されることがあった。

そのため、長時間の音声を一度に処理するのではなく、以下のような流れで処理するようにした。

  1. 入力された音声ファイルを受け取る
  2. ffmpeg を使って音声を1分ごとに分割する
  3. 分割された各音声ファイルに対して whisper.cpp を実行する
  4. それぞれの文字起こし結果を最後に統合する

このようにすることで、whisper.cpp に渡す音声の長さを一定以下に抑えることができる。

結果として、長時間音声を処理したときに発生していた、同じ文章が繰り返し生成される問題をある程度回避できた。

変換と実行をまとめた

もともと whisper.cpp を使う場合、音声ファイルの形式を事前に整える必要がある。

特に、iPhoneで録音したファイルなどは、そのままでは扱えないことがある。 そのため、毎回 ffmpeg でwav形式に変換してから、whisper.cpp を実行していた。

この作業を毎回手動で行うのは面倒なので、アプリ側でまとめて処理するようにした。

ユーザーは音声ファイルを選択するだけでよく、その後の形式変換、音声分割、文字起こし、結果の統合はアプリ側で行う。

CUIを意識しなくて良いようにした

whisper.cpp は基本的にCUIで操作する。

CUIに慣れていれば問題ないが、毎回コマンドを打つのは少し面倒である。 また、ファイルパスを指定したり、モデルを指定したり、変換後のファイルを管理したりする必要がある。

そこで、GUIから操作できるようにすることで、文字起こしを始めるまでの手間を減らした。

特に今回のアプリでは、内部的には ffmpegwhisper.cpp を使っているが、ユーザー側から見ると、音声ファイルを選んで実行するだけで済むようにした。

MVPとして最低限に絞った

現時点ではMVPなので、実装はかなり最低限である。

最初から多機能にするよりも、まずは自分が毎回面倒に感じていた作業を減らすことを優先した。

そのため、現段階では以下の処理を中心に実装している。

  • 音声ファイルを選択する
  • ffmpeg で扱いやすい形式に変換する
  • 音声を1分ごとに分割する
  • 分割した音声をそれぞれ文字起こしする
  • 最後に文字起こし結果を統合する

細かい設定機能はまだ不足しているが、少なくとも自分が使う上で必要だったワークフローはGUI化できたと思う。

現状の課題

まだライトユーザー向けのアプリとしては不十分な部分がある。

特に、whisper.cpp の場所やモデルの管理については、ユーザー側にある程度の知識を求めてしまっている。

本来であれば、GUIアプリとして使う以上、ユーザーが whisper.cpp のフォルダ構成やモデルの配置場所を意識しなくても使えるべきだと思う。

現状ではそのあたりがまだ弱い。

今後やりたいこと

今後は、よりGUIだけで完結するようにしていきたい。

具体的には、以下の機能を追加したい。

  • whisper.cpp が入っているフォルダの自動検知
  • models フォルダの走査
  • 使用可能なモデルのプルダウン表示
  • GUI上でのモデルダウンロード
  • 文字起こし結果の保存先指定
  • 複数ファイルの一括処理

特に、モデルの選択とダウンロードはGUI上で完結できるようにしたい。

現状だと、モデルをどこから落として、どこに置くべきかをユーザーが理解している必要がある。 これは、CUIに慣れていないユーザーにとってはかなり面倒だと思う。

そのため、アプリ側で利用可能なモデルを表示し、必要であればそのままダウンロードできるようにしたい。

所感

whisper.cpp は便利な文字起こしツールである。

しかし、日常的に使う場合、音声ファイルの変換やコマンド実行の手間がある。 特に、iPhoneで録音したファイルをそのまま使えない点は、頻繁に使う上では少し面倒だった。

そこで、ffmpeg による変換と whisper.cpp の実行をGUIから行えるようにするラッパーアプリを作成した。

まだMVP段階ではあるが、自分が毎回面倒に感じていた作業はある程度減らせたと思う。

今後は、whisper.cpp の自動検知やモデル管理機能を追加し、よりライトユーザーでも使いやすいアプリにしていきたい。