ラズパイ5のCPUのみでASR + LLM + TTSを動かす
これはフィジカルAIアドベントカレンダー2025の記事です。
フィジカルAIから若干ずれてしまって申し訳ないのですが、
このようなお題目で書かせていただきました。
フィジカルAIの流れにより、日常にロボットが増えた場合、
オフラインで動く音声対話システムが重要になるかもしれません。
本記事では、ラズパイでCPUのみを使って、最新の音声対話関連モデルを動かす試みを説明します。使用するラズパイはRaspberry Pi 5の8GBモデルです。
結論として、現時点(2025年末)ではラズパイのみで自由に会話するシステムの構築は難しく、コマンドベースの音声対話システム程度であれば実現可能であることが分かりました。
つまり、かつてのスマートスピーカー「Alexa」程度の機能であれば、オフラインで個人でも、簡単に構築できるようになったということです。
本記事を参考に、音声対話機能が様々なロボットに組み込まれることを期待しています。
ラズパイ5の演算機
ラズパイ5には、ARM CPUの他にも、JPEGデコード処理やカメラ入力処理、動画処理など、様々な専用演算器が搭載されています。しかし、これらの演算器はディープラーニングのモデル実行には必ずしも適していないため、基本的にはCPUの汎用演算機能のみを使うことになります。一方、らずぱい5にはGPUが搭載されていると思われるかもしれませんが、GPUを活用するためのライブラリなどが整備されていないため、簡単に使うことはできません。
Raspberry Pi で使える演算機として、CPUのみに頼るしかありません。ただし、ラズパイのCPUはARMベースであり、8ビット整数演算や半精度浮動小数点演算などのSIMD命令が用意されているため、これらを活用することでモデルの実行を効率化することができる可能性があります。しかし、ARM専用、モバイル専用のONNX Runtimeバックエンドをつかって、量子化を行っても、あまり速度はあがらなかったため、バックエンドでの最適化ができない可能性があります。・
その辺は、深く調査できていないため、今後詳しく調べていきたいと思います。
システムの構成
今回は自然言語による対話を行うシステムとコマンド実行をするシステムを構築しました。
今回開発したシステムは次のコンポーネントから構成されています。
シンプルで誰もが真っ先に思いつく構成かと思います。
- 音声認識コンポーネント
- コマンド実行&簡易雑談機能
- 音声合成コンポーネント
これらのコンポーネントについて説明していきます。
音声認識コンポーネント
音声認識コンポーネントではユーザーが入力した音声をテキストに変換する処理を行います。
本アプリケーションでは、音声認識にはLiteASRと呼ばれるオープンソースソフトウェアを使用しています。これはKotoba Technology社が開発したもので、品質を保ったままモデルのサイズを軽量化しスピードを高める手法です。モデルサイズを半分以下にできるくらいのかなりの軽量化することができ、また実行時間も10%~20%ほど早くなるため、こういったエッジ環境における利用に非常に適しています。
コトバテクノロジーはLiteASRを適用したWhisperを複数公開しており、それらの中から自分の用途に適したものを選ぶことで様々なユースケースをカバーすることができます。本アプリケーションではWhisper TinyおよびWhisper Baseをベースとしたモデルを利用しています。
これはそのまま使っているため特筆すべき実装方法はありません。
会話返答コンポーネント
会話返答コンポーネントにはSoftbank社の開発しているSarashinaというモデルを使っています。それ以外にはAlibabaがかいはつしているQwenというモデルがあります。Qwenはモデルサイズが様々あり、例えば0.5Bなどもあります。それらを使うとCPUでもそこそこ速く動かすことが可能です。本アプリケーションでは実際にファインチューンしてみて性能が良かったSarashinaをベースモデルとして使用しています。
これに関しては学習データをQwen30Bといった大きめのモデルで生成し、そのモデルをSarashinaに学習させることでSarashinaに様々なコマンドに対応できるような能力を学習させています。
音声合成コンポーネント
音声合成コンポーネントにはkokoro-ttsと呼ばれるオープンソースのTTSを採用しました。kokoro-ttsは、StyleTTS2と呼ばれるオープンソースのソフトウェアを軽量化したものです。学習手法などは公開されていませんし、StyleTTS 2に見られるような、入力した声質をそのまま再現するようなゼロショットのTTS機能は使えませんが、非常に軽量でCPU上やGPU上で高速に動かすことができます。
どれくらい高速かといいますと、ラズパイ5のCPUで、RTF(Real Time Factor)0.9くらいでして、ストリームさえできればリアルタイム生成できるレベルなんですが、残念ながらモデルのアーキテクチャ上ストリーム生成は(品質を犠牲にせずにやるのは)難しそうです。そのため本システムでは、ストリーム処理ではなく、テキストを一括で生成するプログラムとしました。
このモデルに関しては、ONNXへの変換により高速化が実現できました。具体的には、約20%の高速化が達成されています。ONNXへの変換だけでこの程度の高速化が得られるのは有効です。具体的には、Convolutionの計算がONNXでは効率良く最適化されていたり、計算グラフのテンソル変換などのモジュールが変換されてテンソルコピー数などが削減されていることが理由のようです。
これに関してはONNXモデル に 変換 し その まま 、推論 さ せ て い ます 。
作ったシステム
作ったシステムの動画はこのような感じになります。私が発話している部分は入れていないので、ちょっと分かりにくいかもしれませんが大体3秒から6秒ぐらいでAIが音声で返答してくれている感じになっています。ラズベリーパイ5でもそのように音声を使った会話システムをオフラインのみで開発することができます。
次に、実装について説明していきます。
システムの実装
システムの実装は非常にシンプルに行っています。
ほとんどの実装はClaude CodeおよびCodexを用いており、自分で実装した部分はほとんどありません。モデルに関しても、ほぼONNXへの変換のみで、特に特殊な処理は行っていません。一点、Sarashinaに関しては、そのままでほぼ使い物にならなかったため、Qwen Next 80Bを使って学習データセットを生成し、そのデータセットで学習を行うことで動作の最適化を行っています。また、llama.cppを使ってGGUFファイルに変換し、4ビット量子化を行っています。
このようにモデルをダウンロードしてONNX変換を行い、軽微なファインチューニングを加えるだけで、オフラインで動作するコマンドベースの音声対話システムが完成しました。皆様もラズパイやJetson等を用いたシステムを開発される際は、この音声コマンドシステムをご活用いただければ幸いです。
Discussion