Whisper C++入門:高速・高精度な音声認識を始めよう

Whisper C++入門:高速・高精度な音声認識を始めよう

はじめに:音声認識技術の夜明けとWhisperの衝撃

現代社会において、音声認識技術は私たちの生活や仕事を劇的に変化させています。スマートスピーカーへの指示、スマートフォンの音声入力、議事録の自動作成、動画コンテンツの字幕生成、コールセンターでの音声分析など、その応用範囲は広がる一方です。音声インターフェースは、特にアクセシビリティの向上やハンズフリー操作の実現において、重要な役割を果たしています。

しかし、一口に「音声認識」と言っても、その精度や速度、対応言語には大きなばらつきがありました。特に、多様なアクセント、ノイズの多い環境、専門用語を含む音声、そして多言語対応といった課題は、従来の音声認識システムにとって大きな壁でした。高精度な認識を実現するためには、大量の特定ドメインデータでの学習や、複雑なパイプライン構築が必要となることが多く、開発コストや導入の敷居が高いという側面がありました。

そんな中、2022年9月にOpenAIが発表した音声認識モデル「Whisper」は、その圧倒的な性能と汎用性で、音声認識技術の世界に大きな衝撃を与えました。Whisperは、インターネットから収集された膨大な音声データとテキストデータのペアセットで学習されており、これにより、多様な言語、アクセント、そしてバックグラウンドノイズに対して非常に堅牢な音声認識を実現しています。さらに、単に音声をテキストに変換するだけでなく、話し言葉をそのまま書き起こす(transcription)だけでなく、ある言語の音声を別の言語に翻訳しながら書き起こす(translation)というタスクもこなすことができます。

Whisperの登場により、これまで難しかった多様な音声への対応や多言語対応が、比較的容易に、かつ高い精度で実現可能となりました。これは、多くの開発者や企業にとって、音声認識を活用した新しいアプリケーションやサービスを開発する大きなチャンスをもたらしました。

OpenAIはWhisperモデル自体をオープンソースとして公開し、Pythonを含む様々なプログラミング言語から利用できるようになりました。しかし、多くのリアルタイムアプリケーションや、リソースが限られた環境(例えば組み込みシステムやエッジデバイス)での利用を考えた場合、Pythonのような高レベル言語のインタープリタを介した実行では、パフォーマンスやメモリ使用量に課題が生じることがあります。より低レベルで効率的な実行環境が求められる場面が出てくるのです。

そこで登場するのが、「whisper.cpp」です。これは、WhisperモデルをC++で軽量かつ効率的に実装し直したプロジェクトです。Python版と比較して、依存関係が非常に少なく、コンパイルすれば単一の実行ファイルやライブラリとして動作するため、様々な環境への移植が容易です。CPUリソースを効率的に利用するよう最適化されており、場合によってはPython版よりも高速に動作することもあります。また、様々なハードウェアアクセラレーション(GPUなど)への対応も進められており、さらなる高速化の可能性を秘めています。

この記事では、このwhisper.cppに焦点を当て、「高速・高精度な音声認識」をあなたの手で実現するための第一歩を踏み出すための詳細な入門ガイドを提供します。開発環境の準備から、whisper.cppのビルド、モデルファイルのダウンロード、基本的な音声認識の実行方法、そしてさらに高度なオプションや応用方法に至るまで、初心者の方でも安心して取り組めるように、具体的な手順を追って解説していきます。

さあ、whisper.cppの世界へ飛び込み、音声認識の新たな可能性を探求しましょう。

Whisperとは:大規模データが生んだ汎用音声認識モデル

whisper.cppについて掘り下げる前に、まずはその基盤となるWhisperモデル自体について理解を深めましょう。Whisperは、OpenAIが研究開発し、2022年にオープンソースとして公開したニューラルネットワークベースの音声認識モデルです。その最大の特徴は、これまでの音声認識モデルの常識を覆すような、驚異的な「汎用性」と「精度」にあります。

従来の音声認識システムは、特定の言語やドメインに特化して学習されることが一般的でした。例えば、ニュース音声を認識するモデル、医療音声を認識するモデルといった具合です。これは、特定の種類の音声データに特化することで精度を高めるというアプローチですが、その反面、学習データに含まれない種類の音声や、異なる言語、アクセント、ノイズ環境に対しては性能が低下しやすいという欠点がありました。

Whisperは、このアプローチとは一線を画しています。OpenAIは、インターネット上から収集した、約68万時間に及ぶ膨大な音声データと、それに対応するテキストデータのペアセットを用いて、モデルをゼロから学習させました。このデータセットは、多種多様な言語(90以上の言語)、アクセント、話し方、そして様々なバックグラウンドノイズを含む、非常に多様なものです。

このような超大規模かつ多様なデータセットでの学習により、Whisperは特定の言語や環境に偏らない、非常に汎用性の高いモデルとなりました。具体的には、以下の能力を備えています。

  1. 多言語対応: 日本語、英語はもちろん、フランス語、スペイン語、中国語など、学習データに十分に登場した様々な言語を高精度に認識できます。
  2. 多様なアクセントへの対応: 地域や個人によるアクセントの違いにも比較的強く、標準的な話し方でなくとも認識が可能です。
  3. バックグラウンドノイズへの堅牢性: ある程度のノイズが含まれる環境下でも、音声を聞き取り、認識する能力があります。
  4. 技術用語や専門用語への対応: 学習データに含まれる可能性がある幅広い単語に対応できます。
  5. 転写(Transcription)と翻訳(Translation): 入力された音声が英語であれば英語のテキストに変換(転写)、日本語であれば日本語のテキストに変換します。さらに、入力音声が例えば日本語であっても、それを英語に「翻訳しながら転写」するタスク(翻訳)もこなすことができます。

Whisperのモデルアーキテクチャは、Transformerベースの「Encoder-Decoder」モデルです。入力された音声は、まずメルスペクトログラムという形式に変換され、Encoderに入力されます。Encoderは音声の特徴量を抽出し、その情報をDecoderに渡します。Decoderは、Encoderからの情報と、それまでに出力したテキストに基づいて、次に続く単語や文字を予測していきます。このプロセスを繰り返すことで、音声全体に対応するテキストを生成します。

特に、Whisperは予測時に特殊なトークン([startoftext], [endoftext], 言語指定トークン, タスク指定トークンなど)を利用することで、転写と翻訳のタスクを区別したり、入力言語を指定したりすることができます。例えば、[startoftext][ja]というトークンを与えると、入力音声を日本語として認識しようとします。[startoftext][en][translate]というトークンを与えると、入力音声がどの言語であっても、それを英語に翻訳しながら認識しようとします。

モデルサイズは、tiny, base, small, medium, large の5種類が公開されています。それぞれのサイズは、モデルのパラメータ数(つまり賢さ)と計算量、メモリ使用量に関係します。

  • tiny: 最小サイズ。認識精度は低いが、最も高速でメモリ使用量も少ない。
  • base: tinyよりやや大きく、精度も向上。
  • small: 多くの一般的な用途に適したバランスの取れたモデル。
  • medium: より大規模で、高い精度を求める場合に適しているが、計算リソースを多く消費する。
  • large: 最大サイズで、最高精度が期待できるが、最も低速でリソースも要求する。

これらのモデルには、英語に特化した.enモデルと、多言語対応のモデルがあります。.enモデルは英語のみを認識する場合に多言語モデルよりも効率的(わずかにサイズが小さく、高速)な場合がありますが、多言語モデルでも英語の認識は非常に高い精度で行えます。

Whisperの学習と設計思想は、特定のタスクや言語に特化するのではなく、多様な音声データを大量に学習することで、様々な状況に対応できる汎用的な基盤モデルを構築することに成功したと言えます。これにより、開発者は複雑なデータ収集やモデルチューニングなしに、高い性能の音声認識機能を様々なアプリケーションに組み込むことができるようになりました。そして、その強力なモデルを、より多くの環境で、より効率的に実行可能にするのが、次に説明するwhisper.cppというわけです。

whisper.cppとは:C++で実現する軽量・高速なWhisper実行環境

OpenAIが公開したオリジナルのWhisperモデルは、主にPythonライブラリとして提供されていました。これは、研究開発やプロトタイピングには非常に適していますが、前述のように、パフォーマンスが重視されるアプリケーションや、Pythonの実行環境を導入しにくい組み込みシステム、モバイルデバイスなどでは、利用が難しい場合があります。

このような背景から誕生したのが、「whisper.cpp」プロジェクトです。これは、Gabriel Melquizedek氏によって開始された、Whisperモデルを純粋なC/C++で再実装する試みです。このプロジェクトの目的は、Whisperの強力な音声認識能力を、より多くの環境で、より効率的に利用できるようにすることにあります。

whisper.cppの主な特徴と利点は以下の通りです。

  1. 軽量で依存関係が少ない: whisper.cppは、外部ライブラリへの依存を最小限に抑えるように設計されています。コンパイルに必要なのは、標準的なC++コンパイラ(C++11以降)とCMakeだけです。これは、PythonやPyTorch、TensorFlowといった大規模なライブラリのインストールが不要であることを意味します。これにより、ビルドやデプロイメントが非常に容易になります。
  2. 純粋なC/C++実装: プロジェクトのコア部分は全てC/C++で書かれています。これにより、OSの低レベルAPIへのアクセスや、ハードウェアリソースのより直接的な制御が可能となり、効率的な実行が実現されます。
  3. クロスプラットフォーム: C++とCMakeをベースにしているため、Windows、macOS、Linuxといった主要なデスクトップOSはもちろん、iOS、Android、WebAssembly、そしてRaspberry Piのような組み込みデバイスまで、非常に幅広いプラットフォームでビルド・実行が可能です。
  4. 最適化: CPU上での高速な実行を目指して、様々な最適化が施されています。特に、行列演算など、ニューラルネットワークの推論において計算量の多い部分には、CPUのSIMD命令(AVX、AVX2、NEONなど)を活用した最適化や、マルチスレッド化が積極的に行われています。これにより、同じハードウェア上でも、Python版と比較して推論速度が向上したり、より少ないリソースで動作したりすることがあります。
  5. ハードウェアアクセラレーション対応: 最近では、GPUや専用ハードウェアを活用するための機能も追加されています。Metal (macOS/iOS)、CUDA (NVIDIA GPU)、OpenCL、Vulkanなど、様々なバックエンドを介したハードウェアアクセラレーションの利用が可能になりつつあります。これにより、CPUだけでは難しかったリアルタイム処理や、大規模モデルでの高速推論が、より現実的になっています。
  6. シンプルなAPI: ライブラリとして利用する場合、シンプルで直感的なCスタイルのAPIが提供されています。これにより、既存のC/C++プロジェクトへの組み込みが容易です。
  7. ggmlフォーマット: whisper.cppは、ニューラルネットワークモデルのテンソル計算を効率的に行うための独自のライブラリ「ggml」の上に構築されています。ggmlは、メモリ効率が高く、様々なCPUアーキテクチャやハードウェアバックエンドに対応しやすいように設計されています。Whisperモデルも、このggmlで扱えるフォーマット(.ggml または .bin ビス)に変換されたものが利用されます。

なぜPython版ではなくwhisper.cppを選ぶのか? 主な理由は以下の通りです。

  • デプロイメントの容易さ: Python実行環境や大量のライブラリをインストールすることなく、コンパイル済みのバイナリだけで配布したい場合。
  • リソースの制約: メモリやCPUパワーが限られた環境(組み込みシステム、古いPC、モバイルデバイスなど)で動作させたい場合。
  • パフォーマンス: 特にリアルタイム処理や、大量の音声をバッチ処理する場合に、最大限の速度やスループットを追求したい場合。
  • 既存のC/C++プロジェクトへの統合: 既にC/C++で開発されているアプリケーションに音声認識機能を組み込みたい場合。
  • 依存関係の管理をシンプルにしたい: 大規模なPythonライブラリの依存関係に起因する問題を避けたい場合。

もちろん、プロトタイピングの速度や、データ処理・機械学習ライブラリとの連携の容易さといった点では、Python版に分がある場合もあります。しかし、一旦アプリケーションとして完成させ、様々な環境に配布することを考えるならば、whisper.cppは非常に魅力的な選択肢となります。

このプロジェクトはオープンソースとして活発に開発が続けられており、世界中の多くの貢献者によって機能改善や最適化が進められています。次に、実際にこのwhisper.cppを自分のコンピュータ上で動かすためのステップを見ていきましょう。

開発環境の準備:ビルドに必要なツールを揃える

whisper.cppをビルドして実行するためには、いくつかの開発ツールが必要です。主要なOS(Windows, macOS, Linux)ごとに必要なツールと準備手順を解説します。基本的な考え方は同じですが、コマンドやパッケージ管理システムが異なります。

必要なツール:

  1. Git: whisper.cppのソースコードを取得するために必要です。
  2. CMake: プロジェクトのビルド設定を行うために必要です。様々なプラットフォームで標準的な方法でビルドを行うことができます。
  3. C++コンパイラ: C++11以降をサポートしているコンパイラが必要です。
    • Linux: GCC または Clang
    • macOS: Clang (Xcodeに含まれる)
    • Windows: MSVC (Visual Studioに含まれる) または MinGW/MSYS2 (GCC/Clang)

これらのツールが既にインストールされているか確認し、もしインストールされていなければ以下の手順で準備してください。

Linuxの場合

多くのLinuxディストリビューションでは、これらのツールはパッケージ管理システムを使って容易にインストールできます。

  1. Git, CMake, Build Essentials (GCC, makeなど) のインストール:
    • Debian/Ubuntu系:
      bash
      sudo apt update
      sudo apt install git cmake build-essential
    • Fedora/CentOS/RHEL系:
      bash
      sudo dnf install git cmake gcc gcc-c++ make
      # または yum for older versions
      # sudo yum install git cmake gcc gcc-c++ make
    • Arch Linux系:
      bash
      sudo pacman -S git cmake base-devel
  2. インストール確認:
    bash
    git --version
    cmake --version
    gcc --version
    g++ --version

    それぞれバージョン情報が表示されればOKです。

macOSの場合

macOSでは、XcodeCommand Line Toolsをインストールすることで、Git、Clang(C++コンパイラ)、makeといった基本的な開発ツールがまとめて手に入ります。CMakeは別途インストールが必要です。

  1. Xcode Command Line Toolsのインストール:
    ターミナルを開いて以下のコマンドを実行します。
    bash
    xcode-select --install

    インストールが開始され、ダイアログが表示されるので指示に従ってください。既にインストールされている場合は、「command line tools are already installed」といったメッセージが表示されます。
  2. CMakeのインストール:
    • Homebrewを使っている場合(推奨):
      bash
      brew install cmake
    • 公式サイトからダウンロードする場合:CMake公式サイトのダウンロードページからmacOS用のインストーラ(.dmgファイル)をダウンロードし、GUIに従ってインストールします。
  3. インストール確認:
    bash
    git --version
    cmake --version
    clang --version

    それぞれバージョン情報が表示されればOKです。

Windowsの場合

Windowsの場合、C++開発環境の準備にはいくつかの方法があります。ここでは、Visual Studioを使う方法(推奨)と、MSYS2を使う方法を紹介します。

方法1:Visual Studioを使う(推奨)

Visual Studioは統合開発環境ですが、そのインストーラに含まれる「C++によるデスクトップ開発」ワークロードを選択することで、MSVCコンパイラやCMakeなどがインストールされます。

  1. Visual Studioのダウンロードとインストール:
    Visual Studio公式サイトからCommunity版(無料)をダウンロードします。
    インストーラを実行し、「ワークロード」の選択画面で「C++によるデスクトップ開発」にチェックを入れてインストールします。このワークロードには、C++コンパイラ、Windows SDK、CMakeなどが含まれています。
  2. Gitのインストール:
    Git公式サイトからWindows版インストーラをダウンロードし、指示に従ってインストールします。インストール中のオプションで「Git from the command line and also from 3rd party software」を選択すると、コマンドプロンプトやPowerShellからgitコマンドが使えるようになり便利です。
  3. CMakeの確認:
    Visual Studioのインストール時にCMakeを含めた場合、CMakeはインストールされています。コマンドプロンプトまたはPower Studioを開き、cmake --versionを実行して確認できます。もしインストールされていない、または古い場合は、CMake公式サイトからWindows Installer (.msiファイル) をダウンロードしてインストールしてください。パスを通すオプションに注意してインストールすると、コマンドプロンプト等からcmakeコマンドが使えるようになります。
  4. 開発者コマンドプロンプト/PowerShell:
    Visual Studioインストール後、Windowsのスタートメニューから「Visual Studio 20xx」フォルダを探し、その中の「Developer Command Prompt for VS 20xx」または「Developer PowerShell for VS 20xx」を起動してください。これらのシェルは、MSVCコンパイラやMSBuild(Visual Studioのビルドツール)へのパスが設定済みです。whisper.cppのビルドはこの環境で行うのが最もスムーズです。
方法2:MSYS2を使う

MSYS2は、Windows上でUnix-ライクな環境とパッケージ管理システム(pacman)を提供するプロジェクトです。GCCやClang、CMakeなどを導入するのに便利です。

  1. MSYS2のダウンロードとインストール:
    MSYS2公式サイトからインストーラをダウンロードし、指示に従ってインストールします。インストール先フォルダに空白を含めないことを推奨します(例: C:\msys64)。
  2. MSYS2環境の初期設定:
    インストール完了後、MSYS2 msys環境を起動します。以下のコマンドでパッケージデータベースを更新します。
    bash
    pacman -Syu

    更新が必要なパッケージがある場合、一度ウィンドウが閉じる可能性があります。その場合は再度MSYS2 msys環境を起動し、pacman -Syuをもう一度実行して、全ての更新が完了するまで繰り返します。
  3. 開発ツールのインストール:
    MSYS2にはいくつかの環境がありますが、MinGW-w64環境(64-bit)を使うのが一般的です。MSYS2 MinGW x64環境を起動し、必要なツールをインストールします。
    bash
    pacman -S git cmake mingw-w64-x86_64-gcc

    これでGit, CMake, GCC (MinGW-w64版) がインストールされます。
  4. インストール確認:
    MSYS2 MinGW x64環境で以下のコマンドを実行します。
    bash
    git --version
    cmake --version
    gcc --version
    g++ --version

    バージョン情報が表示されればOKです。ビルドはこのMSYS2 MinGW x64環境で行います。

これで、whisper.cppのソースコードをダウンロードし、ビルドするための準備が整いました。次に、実際にソースコードを取得してビルドを行う手順に進みましょう。

whisper.cppのビルド:ソースコードの取得とコンパイル

開発環境の準備が整ったら、いよいよwhisper.cppのソースコードを取得し、コンパイルして実行ファイルを作成します。CMakeを使うことで、OSによらず比較的統一された手順でビルドできます。

以下の手順は、Windowsの場合は「Developer Command Prompt for VS」または「MSYS2 MinGW x64」、macOS/Linuxの場合は通常のターミナルで行います。

  1. ソースコードの取得:
    まず、GitHubからwhisper.cppのリポジトリをクローンします。プロジェクトを配置したいディレクトリに移動し、以下のコマンドを実行します。
    bash
    git clone https://github.com/ggerganov/whisper.cpp.git
    cd whisper.cpp

    これで、現在のディレクトリにwhisper.cppというフォルダが作成され、その中にソースコードがダウンロードされます。cd whisper.cppでそのフォルダ内に移動しておきます。

  2. ビルドディレクトリの作成:
    ソースコードがあるディレクトリとは別に、ビルドするための一時ファイルや生成された実行ファイルを格納するディレクトリを作成するのがCMakeの慣習です。これにより、ソースディレクトリがクリーンに保たれます。
    bash
    mkdir build
    cd build

    whisper.cppディレクトリの直下にbuildディレクトリを作成し、その中に移動します。

  3. CMakeを使ったプロジェクトの生成:
    buildディレクトリ内で、cmakeコマンドを実行してビルドプロジェクトを生成します。CMakeLists.txtファイルは親ディレクトリ(..で指定)にあるため、..を引数に指定します。
    bash
    cmake ..

    このコマンドは、現在のシステム環境(OS、コンパイラなど)を検出して、それに適したビルドシステム(Linux/macOSならMakefile、Windows with MSVCならVisual Studio Solution、Windows with MinGWならMakefileなど)のプロジェクトファイルをbuildディレクトリ内に生成します。

    特別なビルドオプションを指定したい場合は、cmakeコマンドに引数を追加します。よく使うオプションとしては以下のようなものがあります。
    * -DCMAKE_BUILD_TYPE=Release: 最適化されたリリースビルドを行います(通常推奨)。指定しない場合はデバッグビルドになることがあります。
    * -DWHISPER_BUILD_TESTS=ON: テストコードをビルドに含めます(開発者向け)。
    * -DWHISPER_BUILD_EXAMPLES=ON: サンプルコードをビルドに含めます(通常ONになっています)。
    * -DWHISPER_NO_AVX=ON: AVX命令セットによる最適化を無効にします(古いCPUなどで問題が出る場合)。同様に-DWHISPER_NO_AVX2=ON, -DWHISPER_NO_FMA=ON, -DWHISPER_NO_F16C=ONなどがあります。
    * -DWHISPER_USE_CUDA=ON: NVIDIA GPU (CUDA) を使用するためのビルドを行います(対応環境が必要)。
    * -DWHISPER_USE_METAL=ON: Apple Metal API (macOS/iOS) を使用するためのビルドを行います(macOS/iOSで自動的にONになることが多い)。
    * -DWHISPER_USE_OPENCL=ON: OpenCLを使用するためのビルドを行います。
    * -DWHISPER_USE_VULKAN=ON: Vulkanを使用するためのビルドを行います。

    例えば、リリースビルドを行いたい場合は以下のように実行します。
    bash
    cmake .. -DCMAKE_BUILD_TYPE=Release

    GPUアクセラレーションを有効にしたい場合は、対応するオプションを追加します。例えばCUDAを使う場合(Linux/Windows with NVIDIA GPU):
    bash
    cmake .. -DCMAKE_BUILD_TYPE=Release -DWHISPER_USE_CUDA=ON

    Metalを使う場合(macOS/iOS、通常は自動検出):
    bash
    cmake .. -DCMAKE_BUILD_TYPE=Release -DWHISPER_USE_METAL=ON

    CMakeの実行が成功すると、buildディレクトリ内にMakefileや.slnファイルなどのビルドプロジェクトファイルが生成された旨のメッセージが表示されます。

  4. ビルドの実行:
    CMakeがプロジェクトファイルを生成したら、次にビルドツールを使ってコンパイルとリンクを行います。buildディレクトリ内で、生成されたプロジェクトに対応するコマンドを実行します。

    • Linux/macOS (Makefileジェネレータの場合):
      bash
      make
      # 高速化のために並列ビルドを行う場合 (例: 4スレッド)
      # make -j4

      MacPortsやHomebrewでインストールしたCMakeの場合、デフォルトでNinjaジェネレータが使われることもあります。その場合は代わりにninjaコマンドを使います。
      bash
      # CMake実行時に Ninja ジェネレータが使われた場合
      ninja
      # 高速化のために並列ビルドを行う場合
      # ninja -j4

      どちらのコマンドを使うべきかは、cmake ..を実行した際の出力で確認できます(”Generating with …” の行)。

    • Windows with MSVC (Visual Studio Solutionジェネレータの場合):
      Developer Command PromptまたはDeveloper PowerShellで、buildディレクトリに移動し、以下のコマンドを実行します。CMakeはデフォルトでMSBuildを使うように設定されます。
      bash
      cmake --build . --config Release

      .は現在のディレクトリ(buildディレクトリ)を意味します。--config Releaseは、CMake生成時に-DCMAKE_BUILD_TYPE=Releaseを指定した場合に対応する設定でビルドすることを示します。Visual Studio IDEを開いて.slnファイルを開き、ビルドすることも可能です。

    • Windows with MinGW (Makefileジェネレータの場合):
      MSYS2 MinGW x64環境で、buildディレクトリに移動し、makeまたはninjaコマンドを実行します。
      bash
      make
      # または ninja
      # ninja

    ビルドには数分かかる場合があります。プログレスが表示され、エラーが出ずに完了すればビルド成功です。

  5. ビルド成功の確認:
    ビルドが成功すると、build/binディレクトリ(またはbuild/Releaseディレクトリなど、環境によって異なる)に実行ファイルが生成されます。

    • Linux/macOS: build/bin/main または build/bin/whisper
    • Windows: build\bin\Release\main.exe または build\bin\Release\whisper.exe (MSBuildの場合)
      build\bin\main.exe または build\bin\whisper.exe (MinGWの場合)

    例えばLinux/macOSなら、ls build/binを実行してmainまたはwhisperというファイルが存在することを確認します。mainは基本的な音声認識を行うサンプルプログラム、whisperはより多くのオプションを持つコマンドラインツールです(最近のバージョンではwhisperが推奨されます)。

    これで、whisper.cppの実行ファイルが無事にビルドできました。次に、音声認識に必要なモデルファイルをダウンロードする手順に進みます。

モデルファイルのダウンロード:Whisperモデルを用意する

whisper.cppを使って音声認識を行うには、Whisperモデルのデータファイルが必要です。これらのモデルファイルは、OpenAIが公開しているオリジナルのモデルパラメータを、whisper.cppが使用する「ggml」フォーマットに変換したものです。モデルファイルは、モデルサイズに応じて複数種類が提供されています。

モデルサイズと特徴については既に述べましたが、ここではどのモデルを選ぶべきか、そして具体的なダウンロード方法を解説します。

モデルサイズの選択肢(小さい順):

  • tiny (約75MB, 英語のみ約39MB)
  • base (約240MB, 英語のみ約74MB)
  • small (約960MB, 英語のみ約244MB)
  • medium (約2.9GB, 英語のみ約769MB)
  • large (約6.1GB, large-v1 / large-v2 / large-v3 があり、v3が最新かつ最大精度)
  • large-v1, large-v2, large-v3 は精度が向上していますが、ファイルサイズはほぼ同じです。通常は最新のlarge-v3を選べば良いでしょう。

選択の目安は以下の通りです。

  • 最速・最小限のリソース: tiny.en (英語のみ), tiny (多言語)
  • バランス(速度と精度): base.en (英語のみ), base (多言語)
  • 良い精度: small.en (英語のみ), small (多言語)
  • 高精度: medium.en (英語のみ), medium (多言語)
  • 最高精度: large (多言語)

日本語の認識を行いたい場合は、.enが付いていない多言語モデル (tiny, base, small, medium, large) を選択する必要があります。英語のみを扱う場合は、.enモデルの方が若干小さく高速な場合があります。

モデルファイルは、whisper.cppリポジトリのルートにあるmodelsディレクトリ内に配置するのが標準的です。

ダウンロード方法:

whisper.cppリポジトリには、モデルファイルを簡単にダウンロードするためのシェルスクリプトが用意されています。

  1. whisper.cppディレクトリに移動:
    ビルドを行ったディレクトリではなく、Gitクローンしたwhisper.cppリポジトリのルートディレクトリに移動します。
    bash
    cd /path/to/your/whisper.cpp

    /path/to/your/whisper.cppは、あなたがリポジトリをクローンした実際のパスに置き換えてください。ビルドディレクトリの中にいる場合は、cd ..で一つ上の階層に戻れます。)

  2. ダウンロードスクリプトの実行:
    modelsディレクトリにあるdownload-ggml-model.shスクリプトを実行します。ダウンロードしたいモデルサイズを引数に指定します。

    • 例:baseモデルをダウンロードする場合
      bash
      ./models/download-ggml-model.sh base
    • 例:small.enモデルをダウンロードする場合
      bash
      ./models/download-ggml-model.sh small.en
    • 例:large-v3モデルをダウンロードする場合
      bash
      ./models/download-ggml-model.sh large-v3

    スクリプトを実行すると、指定したモデルファイルがmodelsディレクトリ内にダウンロードされます。ダウンロードにはモデルサイズに応じた時間とネットワーク帯域が必要になります。

    Windowsの場合の注意点: download-ggml-model.shはシェルスクリプトなので、そのままではWindowsのコマンドプロンプトやPowerShellでは実行できません。
    * MSYS2を使用している場合: MSYS2 MinGW x64環境などのMSYS2シェル内であれば、上記コマンドをそのまま実行できます。
    * WSL (Windows Subsystem for Linux) を使用している場合: WSL環境内であれば、上記コマンドをそのまま実行できます。
    * PowerShellで実行する場合: powershell -c "Invoke-WebRequest -Uri https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.bin -OutFile models\ggml-base.bin" のように、Invoke-WebRequestコマンドレットを使って手動でダウンロードすることも可能です。ファイル名はggml-<モデル名>.binという形式になります(例: ggml-base.bin, ggml-small.en.bin, ggml-large-v3.bin)。
    * ブラウザで手動ダウンロード: Hugging Faceのggerganov/whisper.cppリポジトリのmainブランチにあるモデルファイル一覧から、必要な.binファイルをブラウザでダウンロードし、whisper.cppディレクトリ直下のmodelsフォルダに手動で配置することもできます。

ダウンロードしたモデルファイルは、実行時に -m オプションで指定します。例えば、baseモデルならファイル名は通常ggml-base.binとなります。

これで、whisper.cppを実行して音声認識を行う準備が全て整いました。次に、実際に音声ファイルを認識させてみましょう。

基本的な音声認識の実行:コマンドラインツールを使ってみる

whisper.cppをビルドすると、いくつかの実行ファイルが生成されます。最も基本的なサンプルプログラムはmain(またはmain.exe)、より多機能なコマンドラインツールはwhisper(またはwhisper.exe)です。ここでは、これらのツールを使って、音声ファイルをテキストに変換する基本的な手順を解説します。

対応音声フォーマット:
whisper.cppは、入力音声ファイルとして一般的に16kHzサンプリングレートのモノラルWAVファイル形式を推奨しています。他のフォーマット(MP3, MP4, FLACなど)を使用する場合、内部的にFFmpegライブラリを利用してデコードとリサンプリングを行います。そのため、FFmpegがシステムにインストールされているか、またはFFmpegを有効にしてwhisper.cppをビルドしている必要があります。簡単に始めるには、事前に音声を16kHzモノラルのWAVファイルに変換しておくのが確実です。ffmpegコマンドラインツールを使えば簡単に変換できます。

“`bash

例:input.mp3を16kHzモノラルWAVに変換

ffmpeg -i input.mp3 -ar 16000 -ac 1 -c:a pcm_s16le output.wav
“`

実行ファイルの場所:
ビルドした実行ファイルは、通常whisper.cpp/build/bin/ディレクトリ(Windows MSVCの場合はwhisper.cpp/build/Release/など)にあります。コマンドを実行する際は、このディレクトリに移動するか、実行ファイルへのフルパスを指定する必要があります。ここでは、build/binに移動して実行する例で進めます。

“`bash

Linux/macOSの場合

cd /path/to/your/whisper.cpp/build/bin/

Windows MSVC Developer Command Promptの場合

cd C:\path\to\your\whisper.cpp\build\Release\

Windows MSYS2 MinGW x64の場合

cd /c/path/to/your/whisper.cpp/build/bin/
“`

基本的な実行コマンド:
音声認識を実行するための基本的なコマンドは以下の形式です。

bash
./main -m /path/to/model/ggml-model-name.bin -f /path/to/audio/your_audio_file.wav

または(より推奨されるツール)
bash
./whisper -m /path/to/model/ggml-model-name.bin -f /path/to/audio/your_audio_file.wav

(Windowsの場合は ./main.exe./whisper.exe となります。)

  • -m /path/to/model/ggml-model-name.bin: 使用するモデルファイルを指定します。ダウンロードしたモデルファイル(例: ggml-base.bin, ggml-small.en.binなど)へのパスを指定してください。絶対パスでも相対パスでも構いません。whisper.cppディレクトリ直下のmodelsディレクトリにダウンロードした場合、../../models/ggml-base.bin のように相対パスで指定できます。
  • -f /path/to/audio/your_audio_file.wav: 認識させたい音声ファイルを指定します。16kHzモノラルWAVファイルが推奨されます。

実行例:
whisper.cppリポジトリには、サンプルの音声ファイル(samples/jfk.wav)が含まれています。これを使って実行してみましょう。baseモデルをダウンロード済みと仮定します。

“`bash

build/bin ディレクトリにいるとして

./whisper -m ../../models/ggml-base.bin -f ../../samples/jfk.wav
(Windows MSVCなら)batch
.\whisper.exe -m ….\models\ggml-base.bin -f ….\samples\jfk.wav
“`

このコマンドを実行すると、whisper.cppが起動し、指定されたモデルと音声ファイルを使って音声認識処理が開始されます。処理中は、モデルのロード状況や認識の進行状況がコンソールに表示されます。

認識結果の出力:
処理が完了すると、認識されたテキストが標準出力に表示されます。デフォルトの出力形式は、セグメント(音声の短い区間)ごとにタイムスタンプと認識テキストが表示される形式です。

[ 0m0.000s -> 0m4.960s ] And so, my fellow Americans: ask not what your country can do for you...
[ 0m4.960s -> 0m9.500s ] ask what you can do for your country.

これは、サンプルのjfk.wav(ケネディ大統領の演説の一部)を認識させた場合の出力例です。各行が1つのセグメントに対応しており、[開始時刻 -> 終了時刻] の後にその区間で認識されたテキストが続きます。

日本語音声の認識例:
日本語音声を認識させる場合は、日本語を含む多言語モデル(base, small, medium, largeなど)を使用し、必要であれば言語を明示的に指定します(後述のオプション-l jaを使用)。

“`bash

日本語の音声ファイル (japanese_audio.wav) を small モデルで認識させる例

./whisper -m ../../models/ggml-small.bin -f /path/to/your/japanese_audio.wav -l ja
“`
認識結果が日本語で出力されます。

これで、基本的な音声認識を実行することができました。しかし、whisper.cppにはこれ以外にも多くの便利な機能やオプションが用意されています。次に、それらの高度な使い方を見ていきましょう。

高度な使い方とオプション:認識をカスタマイズする

whisper.cppのコマンドラインツールwhisper(またはmain)は、様々なオプションを使って認識処理を細かく制御したり、出力形式を変更したりすることができます。主要なオプションをいくつか紹介します。

実行時に利用可能なオプションの全リストは、-h または --help オプションで確認できます。

bash
./whisper --help

以下は特によく利用されるオプションとその説明です。

1. モデルと音声ファイルの指定

  • -m <model_path>: 使用するggmlモデルファイルへのパスを指定します。(必須)
  • -f <audio_path>: 入力音声ファイルへのパスを指定します。(必須)FFmpegが利用可能な場合は、WAV以外の様々な形式が使えます。

2. 言語とタスクの指定

  • -l <lang_code>: 入力音声の言語を明示的に指定します。例えば日本語なら -l ja、英語なら -l en です。モデルが多言語対応であれば、このオプションで90以上の言語を指定できます。指定しない場合(-l autoがデフォルト)は、音声から言語を自動検出します。精度を高めたい場合や、短い音声で自動検出が難しい場合は、言語指定が有効です。
  • -oj: 認識結果をJSON形式で出力します。他のアプリケーションとの連携に便利です。
  • -otxt: シンプルなテキスト形式で出力します(タイムスタンプなし)。
  • -osrt: SRT字幕形式で出力します。動画に字幕を付ける場合に便利です。
  • -ovtt: VTT字幕形式で出力します。ウェブ上の動画などに使われます。
  • -ocsv: CSV形式で出力します。
  • -ml <lines>: 出力される認識テキストの最大行数を指定します。
  • -mc <chars>: 出力される認識テキストの最大文字数を指定します。
  • -sow: 各セグメントの開始タイムスタンプのみを出力します。デフォルトは開始・終了タイムスタンプです。
  • -wo timestamps: 単語単位のタイムスタンプを出力します。非常に詳細なタイミング情報が得られます。ただし、モデルの種類によっては単語レベルのタイムスタンプ精度が低い場合があります。
  • -translate: 認識タスクを「転写」から「翻訳」に変更します。入力音声が日本語であれば、それを英語に翻訳しながら英語でテキスト化します。出力言語はデフォルトで英語になりますが、-lオプションで翻訳先の言語を指定することも可能です(例: -translate -l frでフランス語に翻訳)。

3. 認識精度と速度の制御

  • -t <nthreads>: 推論に使うCPUスレッド数を指定します。デフォルトはシステムのコア数に応じた値ですが、手動で調整することでパフォーマンスが変わる場合があります。
  • -p <n_past>: デコーダーが過去のトークンを考慮する数を制限します。大きな値は精度を向上させる可能性がありますが、メモリ使用量が増えます。
  • -cb <beam_size>: Beam searchのビームサイズを指定します。1より大きい値を指定するとBeam searchが有効になり、より高品質な認識結果が得られる可能性がありますが、計算コストが増加します。デフォルトは1(Greedy search)です。
  • -cd <patience>: Beam searchのペナルティパラメータ。
  • -cp <probability>: 候補トークンをサンプリングする際の閾値。
  • -rg <threshold>: Repeated tokens suppression threshold (0 to 1).
  • -rc <threshold>: Rapid speech suppression threshold (0 to 1).
  • -ts <threshold>: Token suppression threshold (0 to 1).
  • -thold-pt <threshold>: Pitch threshold.
  • -thold-ts <threshold>: Text similarity threshold.
  • -offset <seconds>: 指定した秒数だけオフセットして認識を開始します。音声ファイルの一部だけを認識したい場合に便利です。
  • -duration <seconds>: 指定した秒数だけ認識を行います。音声ファイルの一部だけを認識したい場合に便利です。
  • -prompt <text>: 認識のプロンプトとして事前にテキストを与えます。例えば、音声の冒頭で特定の単語が頻繁に登場することが分かっている場合、その単語をプロンプトとして与えることで、モデルがその単語を出力しやすくなり、認識精度が向上する可能性があります。ただし、プロンプトの与え方にはコツが必要です。

4. ハードウェアアクセラレーション (GPUオフロード)

  • -ngl <n_gpu_layers>: モデルのレイヤーのうち、指定した数をGPUにオフロードして計算させます。残りのレイヤーはCPUで計算されます。-1を指定すると可能な限り多くのレイヤーをGPUにオフロードします。0を指定するとGPUを使用せず全てCPUで計算します。このオプションを利用するには、ビルド時に対応するバックエンド(CUDA, Metal, OpenCL, Vulkanなど)を有効にする必要があります(例: cmake .. -DWHISPER_USE_CUDA=ON)。GPUを搭載しているシステムで、大きなモデルを高速に実行したい場合に非常に有効です。利用可能なGPUメモリ量と相談して適切な値を指定する必要があります。

5. リアルタイム音声認識 (マイク入力)

  • -c: 連続モード(Continuous mode)を有効にします。このモードでは、音声ファイルではなく、マイクからの入力をリアルタイムで認識します。
  • -id <device_id>: マイクデバイスのIDを指定します。./whisper -l auto -c -id -1のように-id -1を指定して一度実行すると、利用可能なデバイスリストが表示されます。
  • -cad <duration>: 音声のアクティビティがないと判断されて音声認識セグメントが終了するまでの時間(秒)。
  • -cv <threshold>: 音声認識を開始または終了するためのボリューム閾値。
  • -vth <threshold>: Voice Activity Detection (VAD) の音声検出閾値。高いほど感度が下がる。
  • -vms <milliseconds>: VADが音声と判断する最小の継続時間(ミリ秒)。
  • -no-vad: VADを無効にします。常にマイク入力を認識し続けます。
  • -sa: 音声を保存します。リアルタイム認識中に、認識されたセグメントに対応する音声がWAVファイルとして保存されます。デバッグや後処理に便利です。

6. その他のオプション

  • -ni: 進行状況などを表示するプログレスバーを非表示にします。
  • -nf: File input mode. Treat input as file paths rather than audio data.
  • -no-timestamps: 出力にタイムスタンプを含めません。
  • -no-segment-timestamps: セグメントごとのタイムスタンプを非表示にしますが、単語レベルのタイムスタンプ(-wo timestamps)は表示します。

オプションの組み合わせ例:

  • 日本語音声をmediumモデルで認識し、SRT形式で出力、GPUを最大限利用(Metalの場合):
    bash
    ./whisper -m ../../models/ggml-medium.bin -f /path/to/your/japanese_audio.wav -l ja -osrt -ngl 100 # nglの値はモデルサイズによる

    ngl 100 は medium モデルの層数を超える十分大きな値を指定して、可能な限り全てをGPUにオフロードするという意図です。モデルの実際の層数を確認して正確な値を指定しても良いですが、通常は大きな値を指定すれば可能な限りオフロードされます。)

  • 英語音声をbase.enモデルで認識し、単語単位のタイムスタンプ付きJSONで出力:
    bash
    ./whisper -m ../../models/ggml-base.en.bin -f /path/to/your/english_audio.wav -l en -oj -wo timestamps

  • マイクからの英語入力をリアルタイムで認識し、音声をファイルに保存:
    bash
    ./whisper -m ../../models/ggml-base.en.bin -l en -c -sa
    # マイクデバイスIDを指定する場合
    # ./whisper -m ../../models/ggml-base.en.bin -l en -c -sa -id 0

    -id 0 はデバイスリストで確認したIDに置き換えてください。)

これらのオプションを組み合わせることで、様々なユースケースに対応した音声認識を実現できます。コマンドラインツールとしてだけでなく、whisper.cppはライブラリとしても利用可能です。次にその方法を見ていきましょう。

カスタムビルドとインテグレーション:あなたのC++プロジェクトに組み込む

whisper.cppの強力な機能を、開発中の独自のC++アプリケーションに組み込みたい場合、コマンドラインツールとして実行するのではなく、ライブラリとしてリンクして使用することができます。whisper.cppは、シンプルなCスタイルのAPIを提供しており、既存のC++プロジェクトに比較的容易に統合できます。

whisper.cppをライブラリとしてビルドする

デフォルトのビルド設定では、静的ライブラリ(.a または .lib)と動的ライブラリ(.so, .dylib, または .dll)の両方がビルドされます。これらは、build/lib ディレクトリ(Windows MSVCの場合はbuild/Release/libなど)に生成されます。

ライブラリとして利用するには、ビルドプロセスで生成されたヘッダーファイルとライブラリファイルを、あなたのプロジェクトが参照できるように設定する必要があります。

独自のC++プロジェクトに組み込む方法 (CMakeを使用)

最も一般的な方法は、あなたのプロジェクトのCMakeLists.txtファイルで、whisper.cppをサブプロジェクトとして組み込むか、または既にビルド済みのwhisper.cppライブラリを参照するように設定することです。

方法1:whisper.cppをサブディレクトリとして追加する

この方法は、whisper.cppのソースコードをあなたのプロジェクトのサブディレクトリに置き、あなたのプロジェクトのビルド時に一緒にビルドするものです。

  1. whisper.cppソースコードをコピーまたはGitサブモジュールとして追加:
    あなたのプロジェクトのルートディレクトリ内に、例えばthird_party/whisper.cppのようなサブディレクトリを作成し、そこにwhisper.cppのソースコード一式を配置します。Gitサブモジュールを使うと、whisper.cppの更新を追従しやすくなります。
    bash
    cd /path/to/your/project
    git submodule add https://github.com/ggerganov/whisper.cpp.git third_party/whisper.cpp
    git submodule update --init --recursive

  2. あなたのプロジェクトのCMakeLists.txtを編集:
    あなたのプロジェクトのルートディレクトリにあるCMakeLists.txtファイルを開き、whisper.cppをビルドプロセスに含める設定を追加します。

    “`cmake

    プロジェクトの設定

    cmake_minimum_required(VERSION 3.15)
    project(YourProjectName CXX)

    whisper.cppをサブディレクトリとして追加

    add_subdirectory(third_party/whisper.cpp)

    実行ファイルまたはライブラリの定義

    add_executable(your_app your_main.cpp) # 例: 実行ファイルの場合

    add_library(your_lib your_source.cpp) # 例: ライブラリの場合

    whisper.cppライブラリへのリンクとインクルードディレクトリの設定

    target_link_libraries(your_app PRIVATE whisper_static) # または whisper_shared
    target_include_directories(your_app PRIVATE third_party/whisper.cpp)
    ``
    *
    add_subdirectory(third_party/whisper.cpp): whisper.cppプロジェクトのCMakeLists.txtを処理し、そのターゲット(whisper_static,whisper_sharedなど)をあなたのプロジェクト内で利用可能にします。
    *
    target_link_libraries(your_app PRIVATE whisper_static): あなたのターゲット(ここではyour_appという実行ファイル)が、whisper.cppの静的ライブラリ(whisper_static)に依存することを宣言します。動的ライブラリを使いたい場合はwhisper_sharedを指定します。
    *
    target_include_directories(your_app PRIVATE third_party/whisper.cpp): あなたのソースファイルがwhisper.cppのヘッダーファイル(whisper.h`など)を見つけられるように、whisper.cppのソースディレクトリをインクルードパスに追加します。

  3. ビルド:
    あなたのプロジェクトのルートディレクトリでビルドを行います。
    bash
    mkdir build && cd build
    cmake ..
    make # または ninja, MSBuild

    これで、あなたのアプリケーションと一緒にwhisper.cppライブラリもビルドされ、リンクされます。

方法2:インストール済みのwhisper.cppライブラリを参照する

この方法は、whisper.cppを単独でビルド・インストールし、そのインストールされたライブラリファイルをあなたのプロジェクトから参照するものです。システム全体や特定のディレクトリにライブラリをインストールする場合に適しています。

  1. whisper.cppをビルドしてインストール:
    まず、標準的な手順でwhisper.cppをビルドします。そして、インストールコマンドを実行します。
    bash
    cd /path/to/your/whisper.cpp/build
    cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/install/whisper.cpp # インストール先を指定
    make
    make install # または ninja install, cmake --build . --config Release --target install

    CMAKE_INSTALL_PREFIXでインストール先のディレクトリを指定します。指定しない場合、システム標準のディレクトリ(例: /usr/local)にインストールされることが多いですが、管理者権限が必要になる場合があります。特定のディレクトリにインストールするのが一般的です。

  2. あなたのプロジェクトのCMakeLists.txtを編集:
    あなたのプロジェクトのCMakeLists.txtファイルを開き、インストールされたwhisper.cppライブラリを見つけてリンクする設定を追加します。

    “`cmake

    プロジェクトの設定

    cmake_minimum_required(VERSION 3.15)
    project(YourProjectName CXX)

    whisper.cppを見つける

    find_package(whisper CONFIG REQUIRED) # whisperConfig.cmake を探す

    実行ファイルまたはライブラリの定義

    add_executable(your_app your_main.cpp)

    見つかったwhisperターゲットへのリンク

    target_link_libraries(your_app PRIVATE whisper::whisper_static) # または whisper::whisper_shared
    ``
    *
    find_package(whisper CONFIG REQUIRED): CMakeに、whisperConfig.cmakeというファイルを探させ、whisperライブラリのインストール情報を読み込ませます。インストール先にwhisperConfig.cmakeが正しく配置されていれば成功します。CMakeがデフォルトの検索パスで見つけられない場合は、CMAKE_PREFIX_PATH環境変数や-DCMAKE_PREFIX_PATH=/path/to/install/whisper.cppのようにCMakeコマンドでインストール先ディレクトリを指定する必要があります。
    *
    target_link_libraries(your_app PRIVATE whisper::whisper_static): 見つかったwhisperパッケージが提供するターゲット(名前空間whisper::`付き)に依存することを宣言します。

  3. ビルド:
    あなたのプロジェクトのルートディレクトリでビルドを行います。find_packageがライブラリを見つけられるように、必要に応じて環境変数CMAKE_PREFIX_PATHを設定するか、cmakeコマンドで-DCMAKE_PREFIX_PATHを指定します。
    bash
    mkdir build && cd build
    cmake .. -DCMAKE_PREFIX_PATH=/path/to/install/whisper.cpp # 必要に応じて指定
    make # または ninja, MSBuild

ライブラリAPIの使い方

whisper.cppはシンプルなCスタイルのAPIをwhisper.hヘッダーファイルで提供しています。主要な関数は以下の通りです。

  • whisper_init_from_file(const char * path_model): モデルファイルをロードしてWhisperコンテキストを作成します。成功するとstruct whisper_context *型のポインタを返します。エラーの場合はnullptrを返します。
  • whisper_free(struct whisper_context * ctx): Whisperコンテキストを解放し、使用していたメモリを解放します。
  • whisper_full_params whisper_full_default_params(enum whisper_sampling_strategy strategy): 認識パラメータのデフォルト値を構造体として取得します。サンプリング戦略(Greedy searchかBeam searchか)を指定します。
  • whisper_full(struct whisper_context * ctx, struct whisper_full_params params, const float * samples, int n_samples): 音声データ(float型のPCMサンプル配列)を認識します。認識パラメータ、音声データ、サンプル数を渡します。成功すると0を返し、エラーの場合は負の値を返します。
  • whisper_full_n_segments(struct whisper_context * ctx): 認識結果として得られたセグメントの数を取得します。
  • whisper_full_get_segment_t0(struct whisper_context * ctx, int i): i番目のセグメントの開始時刻(ミリ秒)を取得します。
  • whisper_full_get_segment_t1(struct whisper_context * ctx, int i): i番目のセグメントの終了時刻(ミリ秒)を取得します。
  • whisper_full_get_segment_text(struct whisper_context * ctx, int i): i番目のセグメントのテキスト(Cスタイルの文字列)を取得します。
  • whisper_full_n_tokens(struct whisper_context * ctx, int i): i番目のセグメントに含まれるトークン数を取得します。
  • whisper_full_get_token_text(struct whisper_context * ctx, int i, int j): i番目のセグメントのj番目のトークンのテキストを取得します。
  • whisper_full_get_token_id(struct whisper_context * ctx, int i, int j): i番目のセグメントのj番目のトークンのIDを取得します。
  • whisper_full_get_token_data(struct whisper_context * ctx, int i, int j): i番目のセグメントのj番目のトークンの詳細なデータ(オフセット、確率など)を取得します。

簡単な使用例の疑似コード:

“`cpp

include “whisper.h” // whisper.cppのヘッダーファイルをインクルード

// 音声データをロードする関数(仮)
// std::vector load_wav(const std::string& filename);

int main() {
// 1. モデルをロードしてコンテキストを作成
struct whisper_context * ctx = whisper_init_from_file(“path/to/your/ggml-model.bin”);

if (!ctx) {
    fprintf(stderr, "Error: Failed to initialize whisper context.\n");
    return 1;
}

// 2. 音声データを準備(例: 16kHz floatモノラルPCM)
std::vector<float> audio_samples = load_wav("path/to/your/audio.wav"); // あなたの実装が必要

// 3. 認識パラメータを設定(デフォルトを使用)
struct whisper_full_params params = whisper_full_default_params(WHISPER_SAMPLING_GREEDY);

// 必要に応じてパラメータをカスタマイズ(例: 言語を指定)
// params.language = "ja";
// params.translate = true; // 翻訳タスクにする場合

// 4. 音声認識を実行
if (whisper_full(ctx, params, audio_samples.data(), audio_samples.size()) != 0) {
    fprintf(stderr, "Error: Failed to run whisper inference.\n");
    whisper_free(ctx);
    return 1;
}

// 5. 認識結果を取得して表示
const int n_segments = whisper_full_n_segments(ctx);
for (int i = 0; i < n_segments; ++i) {
    const char * text = whisper_full_get_segment_text(ctx, i);
    const int64_t t0 = whisper_full_get_segment_t0(ctx, i);
    const int64_t t1 = whisper_full_get_segment_t1(ctx, i);

    printf("[%lldms -> %lldms] %s\n", t0, t1, text);

    // 単語レベルの情報を取得する場合
    /*
    const int n_tokens = whisper_full_n_tokens(ctx, i);
    for (int j = 0; j < n_tokens; ++j) {
        struct whisper_token_data token = whisper_full_get_token_data(ctx, i, j);
        printf("  [%lldms -> %lldms] %s (prob: %.2f)\n", token.t0, token.t1, whisper_full_get_token_text(ctx, i, j), token.p);
    }
    */
}

// 6. コンテキストを解放
whisper_free(ctx);

return 0;

}
``
この疑似コードは、ライブラリとしてwhisper.cppを使用する際の基本的な流れを示しています。音声データのロード部分は、使用するファイル形式に応じて自分で実装する必要があります。
whisper.cpp/examples/main.cpp`や他のサンプルコードも、ライブラリの使い方を学ぶ上で非常に参考になります。

ライブラリとして組み込むことで、GUIアプリケーション、ゲーム、組み込みシステムなど、様々な種類のアプリケーションに高性能な音声認識機能を柔軟に統合することが可能になります。

トラブルシューティング:よくある問題とその解決策

whisper.cppのビルドや実行中に遭遇する可能性のある、いくつかの一般的な問題と解決策を紹介します。

1. ビルド関連のトラブル

  • コンパイラが見つからない / CMakeがコンパイラを検出できない:
    • 原因: C++コンパイラがインストールされていないか、環境変数PATHが正しく設定されていない。Windowsの場合は、通常のコマンドプロンプト/PowerShellではなく、Visual Studio付属の「Developer Command Prompt/PowerShell」を使用する必要がある。
    • 解決策: コンパイラ(GCC, Clang, Visual Studioの「C++によるデスクトップ開発」ワークロード)を正しくインストールし、コマンドラインから使用できるようPATHを設定するか、適切な開発者コマンドプロンプト/シェルを使用する。
  • CMakeLists.txtの処理中にエラー:
    • 原因: CMakeのバージョンが古い、または必要な開発ツール(make, ninjaなど)が見つからない。
    • 解決策: CMakeを最新版にアップデートする。Linux/macOSの場合はbuild-essentialまたはbase-develパッケージがインストールされているか確認する。Windows MSVCの場合はVisual Studioのワークロードに「CMake tools for Visual Studio」が含まれているか確認する。
  • コンパイルエラー (大量のエラーメッセージ):
    • 原因: C++11以降をサポートしていない古いコンパイラを使用している、または特定のハードウェアアクセラレーション(AVXなど)がCPUでサポートされていないにも関わらず無効化していない。
    • 解決策: C++11以上をサポートする最新のコンパイラを使用する。古いCPUの場合は、cmake .. -DWHISPER_NO_AVX=ON -DWHISPER_NO_AVX2=ON ...のように、対応していない命令セットの最適化を無効にしてビルドしてみる。
  • リンクエラー:
    • 原因: 必要なライブラリファイルが見つからないか、依存関係が解決できない。GPUアクセラレーションを有効にしてビルドしたが、対応するSDKやライブラリ(CUDA Toolkit, Metal SDKなど)が正しくインストール・設定されていない。
    • 解決策: ビルドログを確認して、どのライブラリが見つからないか特定する。GPUを有効にした場合は、対応するGPUドライバーとSDKが正しくインストールされているか確認する。

2. 実行関連のトラブル

  • ./whisper: No such file or directory または Windowsで実行ファイルが見つからない:
    • 原因: コマンドを実行しているディレクトリが間違っている。実行ファイルは通常build/bin(Windows MSVCの場合はbuild/Releaseなど)にある。
    • 解決策: ビルドディレクトリ内の実行ファイルがある場所(build/binなど)に移動して実行するか、実行ファイルへのフルパスを指定する。
  • error: failed to open model file ...:
    • 原因: -mオプションで指定したモデルファイルへのパスが間違っている、またはファイルが存在しない。
    • 解決策: 指定したパスにモデルファイル(例: ggml-base.bin)が正しく存在するか確認する。パスは相対パスでも絶対パスでも指定可能。
  • error: could not open file ... (音声ファイル):
    • 原因: -fオプションで指定した音声ファイルへのパスが間違っている、またはファイルが存在しない。
    • 解決策: 指定したパスに音声ファイルが正しく存在するか確認する。
  • 音声ファイル形式に関するエラー (FFmpeg is not enabled):
    • 原因: 入力音声ファイルが16kHzモノラルのWAV形式ではないのに、whisper.cppがFFmpegサポート付きでビルドされていない。
    • 解決策:
      1. 入力音声ファイルを事前に16kHzモノラルのWAV形式に変換する(推奨)。ffmpeg -i input.mp3 -ar 16000 -ac 1 -c:a pcm_s16le output.wav
      2. whisper.cppをFFmpegサポートを有効にしてビルドし直す。FFmpegライブラリがシステムにインストールされている状態で、CMake実行時に-DWHISPER_BUILD_TESTS=ON -DWHISPER_BUILD_EXAMPLES=ONを指定すると、通常FFmpegが検出されて有効になります。詳細はwhisper.cppのCMakeLists.txtやドキュメントを参照してください。
  • メモリ不足のエラー:
    • 原因: 使用しているモデルサイズが大きすぎる、または音声ファイルが長すぎる。特にGPUオフロードなしで大きなモデルを使用する場合や、-ngl 0を指定した場合に発生しやすい。
    • 解決策: より小さなモデルを使用する(例: largeからmediumへ)。または、GPUオフロードを有効にする(-ngl -1など)ことで、GPUメモリが使用され、CPUメモリの負担が軽減される。システムに十分なRAMやVRAMがあるか確認する。
  • GPU (CUDA/Metal/OpenCL/Vulkan) が利用できない / オフロード数が指定できない:
    • 原因: whisper.cppがGPUサポートを有効にしてビルドされていない、またはシステムに互換性のあるGPUやドライバー、SDKがインストールされていない。-nglオプションは、GPUサポートが有効なビルドでのみ機能する。
    • 解決策: CMake実行時に-DWHISPER_USE_CUDA=ONなどの適切なオプションを指定してビルドし直す。NVIDIA GPUの場合はCUDA ToolkitとcuDNN、ドライバーを正しくインストールする。Apple Silicon Macの場合はMetalが自動的に有効になることが多いが、古いMacでOpenCLなどを試す場合は別途設定が必要になることがある。
  • 認識精度が低い:
    • 原因:
      • モデルサイズが小さすぎる(tinybaseモデルで複雑な音声を認識しようとしている)。
      • 音声の品質が悪い(ノイズが多い、不明瞭な話し方、録音状態が悪い)。
      • 入力音声の言語がモデルの主要な学習言語でない(多言語モデルで、学習データが少ない言語を認識しようとしている)。
      • 入力音声の言語を明示的に指定していない(-l <lang_code>)。自動検出が失敗している可能性がある。
      • 特殊な用語が多い音声。
    • 解決策:
      • より大きなモデルを試す(small, medium, large)。ただし、リソースも必要になる。
      • 可能な限り、入力音声の品質を向上させる。
      • -l <lang_code>オプションで言語を明示的に指定する。
      • -prompt <text>オプションで、音声に頻出する単語などをプロンプトとして与えてみる。
      • Beam search (-cb <beam_size>) を試す。
  • リアルタイム認識 (マイク入力) がうまくいかない:
    • 原因:
      • マイクデバイスが正しく検出されていない。
      • マイクへのアクセス許可が与えられていない(特にmacOS)。
      • 音声認識の閾値(-cv, -vth)が環境に合っていない。
    • 解決策:
      • -id -1オプションで利用可能なマイクデバイスリストを確認し、適切なIDを指定する。
      • OSのセキュリティ設定で、ターミナルや実行ファイルにマイクへのアクセス許可を与える。
      • -cv, -vthオプションの値を調整してみる。-no-vadでVADを無効にして、常に認識させてみる。

これらのトラブルシューティング情報は、最も一般的なケースを網羅しています。より詳細な問題については、whisper.cppのGitHubリポジトリのIssueやDiscussionフォーラムを参照するか、エラーメッセージを正確に検索してみてください。活発なコミュニティが情報を提供していることが多いです。

応用例:whisper.cppの活用シーン

whisper.cppは、その高速性、軽量性、クロスプラットフォーム性、そして高性能な音声認識能力を活かして、様々なアプリケーションやサービスに組み込むことができます。コマンドラインツールとしてだけでなく、ライブラリとして利用することで、さらに幅広い応用が可能になります。

以下に、whisper.cppのいくつかの活用例を挙げます。

  1. デスクトップアプリケーション:

    • 議事録作成ツール: 会議中の音声をリアルタイムまたはファイルから取り込み、テキストに変換して編集・保存するアプリケーション。タイムスタンプ付きの出力を使えば、再生位置とテキストを同期させることができます。
    • 音声入力ソフトウェア: OS標準の音声入力機能よりも高精度な認識を求めるユーザー向けに、Whisperをバックエンドとした高機能な音声入力ツール。
    • オーディオ/ビデオ編集ツール: 動画や音声ファイルの音声トラックから自動的に字幕を生成する機能。SRT/VTT形式で出力できるため、編集ソフトに取り込みやすいです。
    • 学習支援ツール: 外国語学習者がリスニング練習をする際に、音声を聞きながらリアルタイムで文字起こしを表示したり、ネイティブの発音と自分の発音を比較したりする機能に活用。
  2. コマンドラインツール/スクリプト:

    • バッチ処理: 大量の音声ファイルをまとめてテキストに変換する自動化スクリプト。サーバーサイドでの音声処理パイプラインの一部として利用できます。
    • メディアファイルの分析: 音声認識結果を使って、キーワード検索、トピック分類、センチメント分析などを行うための前処理。
    • アクセシビリティツール: 音声コマンドでPC操作を可能にするツールや、聴覚障害者向けのリアルタイム字幕表示システム。
  3. モバイルアプリケーション:

    • オフライン音声認識: スマートフォンやタブレット上で、インターネット接続なしに音声認識を行うアプリケーション。whisper.cppの軽量性とCPU効率の高さは、モバイルデバイスでの実行に適しています。
    • 多言語対応のボイスメモアプリ: 音声を録音するだけでなく、自動的にテキスト化し、様々な言語での認識・翻訳に対応。
  4. 組み込みシステム/エッジデバイス:

    • スマート家電: 音声コマンドによる家電操作を、クラウドではなくデバイス内で行うことで、応答速度向上やプライバシー保護を実現。
    • 産業用機器: 騒音環境下での音声指示認識や、機器の状態を音声でレポートするシステム。
    • 自動車: 車載インフォテインメントシステムでの音声操作や、ドライブレコーダーの音声記録分析。
  5. サーバーサイドアプリケーション:

    • コールセンターの音声分析: 顧客との通話音声をテキスト化し、自動応答システムの改善やオペレーターの応対品質評価に利用。
    • メディアプラットフォーム: アップロードされた動画コンテンツの音声を自動的に認識し、字幕を生成したり、コンテンツ内容をインデックス化したりするサービス。
    • オンライン会議システム: 参加者の音声を認識してリアルタイム議事録を作成する機能。

これらの応用例からも分かるように、whisper.cppは非常に多様な場面で活用できます。特に、CPUリソースが限られている環境や、オフラインでの実行が必要な場合、そしてC++ベースの既存システムに統合したい場合に、whisper.cppはその強みを発揮します。

ただし、サーバーサイドで大量の同時リクエストを処理するようなスケーラビリティが求められる場合は、whisper.cpp単独での運用では限界があることも理解しておく必要があります。多数の同時セッションを効率的に処理するには、ロードバランシング、キューイング、複数のワーカープロセス/サーバー管理など、追加の設計やインフラが必要になります。また、リアルタイム処理において、GPUアクセラレーションは必須となるケースが多いでしょう。

プロジェクトを進める上で、whisper.cppのGitHubリポジトリを定期的にチェックし、最新のアップデートやコミュニティの議論から新しい機能や最適化情報を得ることも重要です。オープンソースプロジェクトであるため、活発なコミュニティが継続的な改善を支えています。

まとめと今後の展望:音声認識の未来へ

この記事では、OpenAIが開発した画期的な音声認識モデルWhisperを、C++で軽量かつ効率的に実装した「whisper.cpp」に焦点を当て、その導入から基本的な使い方、高度なオプション、そして独自のプロジェクトへの組み込み方法まで、詳細に解説してきました。

whisper.cppは、Whisperモデルの高い精度と汎用性を、Pythonなどの高レベル言語に依存することなく、C++という低レベル言語で実現しています。これにより、デスクトップ、モバイル、組み込みシステム、WebAssemblyなど、より幅広いプラットフォームでの実行が可能となり、リソースが限られた環境やリアルタイム性が求められるアプリケーションにおいて、その真価を発揮します。

開発環境の準備、CMakeを使ったビルド、ggmlフォーマットのモデルファイルのダウンロード、そしてコマンドラインツールによる基本的な実行は、whisper.cppを使い始めるための最初のステップです。さらに、豊富なコマンドラインオプションを利用することで、言語の指定、出力形式の変更、パフォーマンスチューニング、そしてリアルタイムマイク入力からの認識といった、様々な高度なタスクをこなすことができます。

独自のC++アプリケーションに音声認識機能を組み込みたい場合は、whisper.cppをライブラリとしてビルドし、CMakeなどを利用してプロジェクトに統合する方法を解説しました。これにより、デスクトップアプリケーションや組み込みシステムなど、より複雑なユースケースにwhisper.cppを適用することが可能になります。

もちろん、技術の導入にはトラブルがつきものです。一般的なビルドエラー、実行時エラー、パフォーマンスの問題、そして認識精度に関するトラブルシューティングについても触れました。これらの情報を参考に、問題解決に取り組んでみてください。

whisper.cppプロジェクトは、非常に活発に開発が進められています。CPU上でのさらなる最適化はもちろん、様々なGPUバックエンド(CUDA, Metal, OpenCL, Vulkan)への対応も進化しており、より高速で効率的な実行が今後も期待されます。また、基盤となるggmlライブラリも、新しいモデルフォーマット(GGUFなど)への対応や、他のニューラルネットワークモデルへの応用が進められています。

音声認識技術は、もはやSFの世界のものではありません。Whisperのような高性能なモデルがオープンソースとして公開され、whisper.cppのような優れた実装が登場したことで、誰でも、そして様々な環境で、高精度な音声認識を利用できる時代が到来しました。これは、人々のコミュニケーション方法、情報へのアクセス方法、そしてヒューマン・コンピュータインタラクションのあり方をさらに変革していくでしょう。

この記事が、あなたがwhisper.cppを始め、音声認識技術の可能性を探求する上での一助となれば幸いです。この強力なツールを使いこなし、あなたのアイデアを形にしてみてください。高速・高精度な音声認識の世界へ、ようこそ!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール