月曜日, 8月 4, 2025
月曜日, 8月 4, 2025
- Advertisment -
ホームニューステックニュース一家に一台Anneliちゃん!LM Studio × AivisSpeechで簡易AIコンパニオンを作ろう

一家に一台Anneliちゃん!LM Studio × AivisSpeechで簡易AIコンパニオンを作ろう


はじめに

先日、LM Studioをダウンロードし、ローカルLLM環境を手に入れました。私はMacBookのバックグラウンドで常時稼働させています。詳しくはこちら↓

https://zenn.dev/r4ynode/articles/local-llm-intro-with-obsidian

また、最近AivisSpeechという日本語音声合成エンジンを知りました。これがなかなか良くて、Anneliが可愛いだけでなく、合成音声の処理速度が速いです。

https://aivis-project.com/

ここでふと思いつきました。

「完全ローカル環境で、自律的に動くAnneliちゃん作れるじゃん!」

ということで本記事では、「LM Studio × AivisSpeech」で完全にオフラインで動作する対話型のAnneliAIコンパニオンを作ります。また最後に音声認識機能を追加して、Anneliと会話できる機能も実装します。(こちらの機能はAPI依存なのでオフラインで動作しません)

デモ

先にデモをお見せします。ブラウザ上でテキストを入力すると、Anneliが応答してくれます。
また、記事後半にはおまけとして音声認識版のデモを用意してます。

https://x.com/r4ynode/status/1949623661268246736

ローカルLLMってロマンありません?

世の中にはOpenAIやAnthropicなどAIで有名な会社が多くあります。企業が提供するAIを使うのが良いのは分かっていますが、ネットワーク環境がないと使えませんし、APIの制限もあります。

前回LM Studioを導入してみて、ネットワークを介さずにLLMが動く環境に少し感動しました。ローカルLLMの主なメリットは以下だと考えます。

  • コストの心配なし
  • オフラインで動作
  • プライバシーの完全な保護

本記事では完全ローカル環境で動作するAnneliAIを目指します。

LM Studioとは

https://lmstudio.ai/

LM Studioは、ローカル環境でLLMを実行できるツールで、OpenAIライクなインターフェースを持っています。

セットアップ

簡単にセットアップ方法を説明します。詳しくは前回の記事をご覧ください↓

https://zenn.dev/r4ynode/articles/local-llm-intro-with-obsidian

  1. LM Studio 公式サイトからダウンロード。
  2. モデルをダウンロード。今回は「google/gemma-3-12b」を使用します。
  3. サーバーを起動
$ lms server start --cors --port 1234
$ lms status

┌ Status ──────────────────────────────┐
│                                      │
│   Server:  ON  (Port: 1234)          │
│                                      │
│   Loaded Models                      │
│     · google/gemma-3-12b - 8.07 GB   │
│                                      │
└──────────────────────────────────────┘

AivisSpeechとは

https://aivis-project.com/

AivisSpeechは、AivisProjectが開発した無料の合成音声ソフトウェアです。

最大の特徴はAnneliちゃんがかわいいです! (゜∀゜)

AivisSpeechの特徴

  • 高音質&高品質な音声
  • 処理が高速
  • 豊富なキャラクター
  • API提供
  • ローカル実行

最近はAivis Cloud APIがベータ版でリリースされました。サービスに組み込みたい場合はこちらを利用するのが良いでしょう。

セットアップ

1. AivisSpeechを公式サイトからダウンロード

AivisSpeechは執筆時点(2025年8月2日)では、コード署名(プログラムの正当性を証明する電子署名)が行えておらず、インストール時に警告が出ます。AivisSpeechを信頼できる場合はインストールしましょう。インストールするとこんな感じです。

aivis-speech-app

Anneliがデフォルトでインストールされていたかは忘れてしまいました…Anneliや他のモデルは以下のAivis Hubからダウンロードできます。

https://hub.aivis-project.com/

2. エンジンの起動

AivisSpeechはGUIのアプリケーションですが、AivisSpeech Engineが同梱されており、Engineのみを起動することもできます。詳しくは公式GitHubを参照してください。


$ /Applications/AivisSpeech.app/Contents/Resources/AivisSpeech-Engine/run
省略
emitting double-array: 100% |

done!
[2025/08/01 00:23:49] INFO:     User dictionary applied. (0.00s)
[2025/08/01 00:23:49] INFO:     Started server process [7955]
[2025/08/01 00:23:49] INFO:     Waiting for application startup.
[2025/08/01 00:23:49] INFO:     Application startup complete.
[2025/08/01 00:23:49] INFO:     Uvicorn running on http://localhost:10101 (Press CTRL+C to quit)
[2025/08/01 00:23:50] INFO:     Scanning installed models ...
[2025/08/01 00:23:50] INFO:     Scanned 3 installed models. (0.24s)
[2025/08/01 00:23:50] INFO:     Updated latest version information.

APIサーバーがhttp://localhost:10101で起動します。

バイブコーディング実践

今回の開発では、VSCodeのCopilotのAgentモードにて、Claude Sonnet4にすべてを任せました。ちなみにバイブコーディングは初めてです。バイブなんで全部なんとなくでやってみます。

仕様について

今回のシステムでは、以下の仕様を満たすことを目指しました。

  1. ユーザーがテキストを入力すると、Anneliが応答する。
  2. 完全にオフラインで動作する。
  3. 追加仕様:音声入力に対応し、ユーザーが話しかけるとAnneliが音声で応答する。

プログラム作成のプロンプト

決めた仕様を元にCopilotにすべて投げました。普通に忘れてましたが、プロンプトもChatGPTに作らせていました。

アプリケーション作成のプロンプト

過去の履歴から取ってきました。仕様もすり合わせながらプロンプトを作成してもらいました。

ChatGPTへの相談

# 1回目の指示
LM Studioをローカルで立ち上げています。LM Studioの出力結果をAivisSpeechの合成音声で再生したいです。可能なら、文章出力中に順次合成音声で喋らせたいです

# 2回目の指示
AivisSpeechに関しては、ネットで最新情報を検索して。ただし、すべてローカルで実行したいです。

以下は参考の資料です
https://github.com/Aivis-Project

# 3回目の指示
Copilotにコーディングさせたいです。プロンプトを作成して

できたプロンプト。絵文字があるのはAIっぽいですね。

## 💡 タスク概要

以下の要件を満たす Python スクリプトを作成してください。

---

### 🎯 目的
ローカルで起動している **LM Studio のストリーミング出力**を受信し、  
文章が一区切りするたびにローカルの **AivisSpeech(VOICEVOX互換API)**を使って音声合成し、**即座に再生**する。

---

### 🔧 前提条件

- LM Studio は `http://localhost:1234/v1/chat/completions` にて OpenAI 互換 API として動作しています
- `stream: true` によるストリーミング出力が可能です
- AivisSpeech は `http://127.0.0.1:10101` にて起動しています
  - `/speakers` でスタイルIDを取得できます
  - `/audio_query` + `/synthesis` によって音声合成ができます
  - 音声出力は `.wav` 形式のバイナリで取得できます

---

### 🔁 必須の処理フロー

1. ユーザーが入力したプロンプトを LM Studio に送信
2. ストリーミングで返されるテキストチャンクを順次受信
3. 文末記号(「。」「!」「?」)で区切ってバッファ処理
4. バッファが1文以上溜まったら AivisSpeech API に送信して音声を合成
5. 合成された音声を即座に再生する

---

### 📦 使用ライブラリ

- `requests`: API 通信
- `pydub`: 音声データの読み込み・再生(`AudioSegment.from_file + play`- `io`: バイナリデータ処理用

---

### ✅ 出力条件

- 完全な Python スクリプトとして書いてください
- `if __name__ == "__main__"` から実行できる構造にしてください
- 複雑な処理は関数に切り出してください
- 任意の `speaker_id` は変数としてスクリプト内で指定してOKです

---

### 🧪 参考プロンプト

例: 「今日はどんな天気ですか?」

---

## 📝 コードの作成をお願いします

完成したシステム

アーキテクチャ概要

architecture

リアルタイム音声処理の実装

音声対話システムで重要なのはレスポンスの速さです。
デモでお見せしたように、レスポンスは結構速いと思います。これはすべての文章が作成完了してから合成音声処理をしているわけではなく、LM Studioからの応答をストリーミングで受信し、文章が完成した段階で音声合成をしているためです。

ここから分かることは、AivisSpeechの合成音声の処理が非常に高速であることです。

リファクタリング

作成されたプログラムは確かに動くものができました。ただ、コードが肥大化して複雑すぎたため、リファクタリングもお願いしました。以下使用したプロンプトです。こちらはすべて自分でそれっぽく作成しました。

リファクタリングで使用したプロンプト
# 指示

リファクタリングをして

# 役割

あなたはソフトウェア設計の専門家です。
与えられたコードを保守性・可読性・拡張性の観点からリファクタリングします。

# リファクタリングの手順  

1. READMEを確認
2. フロントエンドの内容を確認
3. バックエンドの内容を確認
4. 全体のコードを確認
5. コードの問題点を洗い出し
6. システム構造とモデリングを提案
7. 最適なソフトウェア設計を提案
8. ソフトウェア設計に基づきコードをリファクタリング

# ソフトウェア設計

ソフトウェア設計は最低限以下について観点にいれること

## 基本

- わかりやすい命名

## クラス設計

- ドメインの概念を反映
- 単一責任の原則
- 完全コンストラクタ
- 値オブジェクト
- 浅いネスト
- 関心の分離

## ファイル構成

ドメインや機能ごとにフォルダとファイルを分ける

採用されたアーキテクチャ

Clean Architectureが採用されました。私には馴染みがあるのでだいぶ読みやすいです。

src/
├── domain/          # ドメイン層(ビジネスルール)
├── application/     # アプリケーション層(ユースケース)
├── infrastructure/ # インフラ層(外部API連携)
└── presentation/   # プレゼンテーション層(UI・通信)

音声入力機能をつけてみた

対話でAnneliと話せると面白いなと思い、音声入力機能を追加しました。
ローカルをテーマにやってきましたが、ここではブラウザのWeb Speech APIを使いました(というかCopilotがこのAPIを採用しました)。

プロンプト

音声入力機能をつけて

見返しましたが、なんという雑な指示なんでしょう。

実装について

できた実装は以下です。

  • Web Speech API による音声認識
  • 視覚的フィードバック
    • 緑色のマイクボタン
    • 録音中の赤いパルスアニメーション
    • ステータス表示で進行状況を通知
  • ユーザビリティ
    • 入力方法の自由な選択(テキスト/音声)
  • 処理フロー
    • 音声認識→テキスト変換→AI応答→音声再生

音声入力デモ

Anneliに無理やり英語を喋らせました。AivisSpeechは日本語の合成音声エンジンなので、英語は喋れませんが、システムプロンプトで無理やり喋らせました。

音量が大きいので注意!!

https://x.com/r4ynode/status/1949829984614314100

日本人特有のカタコト英語感があってかわいいですね。

音声入力機能を追加して思ったこと

音声入力機能を依頼してみて、ひとつ技術的な課題に気づきました。
上でデモした機能では、Anneliが喋っている間は音声入力を強制的にブロックしています。これは、Anneliが喋った音声をマイクが拾い、そのまま入力として使われてしまうためです。今回はどうしようもなかったので、音声入力をブロックする仕様にしました。

最近有名なAIコンパニオンとして、X(旧Twitter)のAniやSesameなどがありますが、これらはAIの音声をマイクが拾いません。声質から判定しているのか、どういった技術を使っているのか気になります。また時間のあるときにでも調べてみます。

https://www.sesame.com/

バイブコーディングの改善ポイント

実は今回初めてバイブコーディングをしました。
今回の経験を通して以下の観点を意識すればうまくいきやすいなと感じました。

  • 仕様を明確にする
  • ソフトウェア設計に基づく実装観点をプロンプトに組み込む
  • テスト駆動開発でコーディングさせる

仕様に関しては大方針は決めつつ、細かい部分はChatGPT等で考えてもよいでしょう。なんならアイデア想起から任せても良いですね。

また、人間側がソフトウェア設計の理解がなければ、バイブコーディングで生成されたコードは大変複雑なものになると学びました。AIはテストが結構得意なので、テスト駆動開発でコーディングさせると確実なものができるのではないかと思いました。

それと基本的なことかもしれませんが、AIに実装をお願いする場合は事前の変更点をちゃんとコミットしておかないと、AIがそれを破壊する危険性があります。修正を確定したくない場合はとりあえずブランチだけ切って、納得のいくものでなければ破棄すればよいでしょう。

まとめ

前回LM Studioを導入し、AivisSpeechを知ったところから、ふと思いつきで実装してみました。
実はベースとなるシステムはAIによって1時間ほどで完成しています。リファクタリングや細かい機能追加・修正等の方が時間がかかりました。

思い立ったらすぐ実装できるなんて、とても良い時代になりましたね。これからも何か思いついたらバイブっていこうと思います。



Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -