5
2

マイクからの音声入力でLLMと話す(Whisper.cpp の example を利用)

Last updated at Posted at 2024-02-10

TL;DR

  1. WhisperはOpenAIによって開発された音声認識システムで、多言語対応の高精度なテキスト変換機能を提供します。
  2. whisper.cppはWhisperモデルのC++実装であり、マイク入力からのリアルタイム文字起こしや、音声ベースのアプリケーション開発を容易に行うことができます。
  3. 修正されたwhisper.cppllama.cppを組み合わせることで、マイクからの日本語音声入力を基にLLMと日本語で対話するシステムを構築できます。

使用環境

  • MacBook Pro
  • CPU : Apple M2 Pro, 12core
  • MEM : 32 GB
  • OS : Sonoma 14.2.1

whisper と whisper.cpp

WhisperはOpenAIによって開発された最先端の音声認識システムであり、様々な言語の音声をテキストに変換する能力を持っています。このシステムは、公開されているモデルを通じて、広範囲の言語や方言に対応し、さまざまな音声の環境下で高い精度の音声認識を実現します。特に、雑音が含まれる環境やさまざまな話者の声にも強く、リアルタイムでの使用にも適しています。

whisper.cppは、WhisperモデルをC++で実装したもの. 特に Mac での動作にして聞かされています. この実装例を通じて、開発者はWhisperモデルを自分のアプリケーションに組み込む方法を学ぶことができ、マイクから直接音声を入力し、リアルタイムでの文字起こしや、さらには音声を基にした会話AIとのインタラクションを実現することが可能です。また、whisper.cppを使用することで、Whisperの強力な音声認識機能を活用し、様々な言語での対話システムや音声ベースのアプリケーション開発を容易に行えます。

この記事では、whisper.cppを日本語化し、マイクからの音声入力を文字起こしした後、それを用いてLLM(Language Learning Model)と会話する talk-llama という例を修正することにより, 日本語を用いたLLMとの対話を実現させた.

whiper.cpp での文字起こし

本家は以下のリポジトリにあります.
https://github.com/ggerganov/whisper.cpp

後々, talk-llamaをクローンするので下記のフォークしたリポジトリを利用すると楽かも
https://github.com/nagato0614/whisper.cpp

基本的な使い方はリポジトリにありますが,
まずリポジトリをクローン

git clone https://github.com/ggerganov/whisper.cpp.git

ソースコードのビルド

make

モデルのダウンロード.
日本語で使えるようにするため, モデル名の末尾にある, .en がないモデルをダウンロードしてください.

bash ./models/download-ggml-model.sh base
bash ./models/download-ggml-large-v3.sh base

そして実行.
オプションはそれぞれ,

  • -l ja : 使用言語を日本語に
  • -t 4 : 使用するスレッド数
  • -m ./model/ggml-base.bin : 使用するモデルの選択

下記のコマンドを実行するとマイクからの入力から文字起こし可能です.

./stream -l ja -t 4 -m ./model/ggml-base.bin

llama.cpp の準備

llm との会話する部分は llama.cppを使用する.

以下のリポジトリからクローン.
whisper.cppとおなじクローンしてください.
ディレクトリ構成は以下のような感じ

  • ./
    • llama.cpp
    • whisper.cpp

クローン後ビルド

cd llama.cpp
make

モデルのダウンロードは huggingface に公開されているものをダウンロード.
自分がダウンロードしたのは, swallow-7b-instruct.Q4_K_S.gguf.
違いはイマイチわかっていない. :rolling_eyes:
ダウンロードしたモデルは ./models に保存

  • -m ./models/swallow-13b-instruct.Q6_K.gguf : 使用するモデルを指定
  • -n 256 : 生成するトークン(単語や文字列の単位)の数を指定
  • --repeat_penalty 1.0 : 繰り返しペナルティを指定
  • --color : 出力に色を使用するオプション
  • -i : 対話モードで実行
  • -r "User:" : 入力の際にユーザーからの発言を示すプレフィックス(接頭辞)を指定
  • -f : 事前に入力するプロンプト
./main -m ./models/swallow-13b-instruct.Q6_K.gguf -n 256 --repeat_penalty 1.0 --color -i -r "User:" -f ./prompts/chat-with-bob.txt

whisper.cpp + llama.cpp

whisper.cpp の example ディレクトリが存在しており, whiper.cpp ディレクトリないでビルドすることが可能.
今回使用するexample も以下のようにビルドすることができる.

make talk-llama

今回修正したコードは本形をフォークしたリポジトリをクローンすることで使用することができる.
whisper.cpp, llama.cpp と同じ階層にクローンする.
準備はwhisper.cpp と同様にしておく.

git clone https://github.com/nagato0614/whisper.cpp
cd whisper.cpp
make talk-llama
./talk-llama  -mw ./models/ggml-large-v3.bin -ml ../llama.cpp/models/swallow-7b-instruct.Q4_K_S.gguf  -p "User:" -t 8  -l ja

これで日本語を用いてllmと対話が可能になる.

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2