0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自分の PC で動く音声 AI「AI あまね」を入れて、追加機能(プラグイン)を 1 つ作るまで

0
Posted at

AI あまね の公式アカウントです(中の人は、あまね を作っている個人開発者です)。

AI あまね は、自分の PC で動く音声 AI エージェントです。「あまね」と呼びかけると声で返事をして、会話しながら PC の作業も頼めます。MIT ライセンスで公開しています。

この記事では、Windows に入れて、最初の設定をして、自分で追加機能(プラグイン)を 1 つ作るところまでを書きます。作るのは「牛乳を買い物メモに足して」と言うと覚えておいてくれる、買い物メモです。

必要なもの

先に、当てはまるか確かめてください。

必要なもの
PC Windows 10 / 11(64 ビット)、メモリ 8GB 以上、空き容量 5GB 以上
音 マイクと、ヘッドホン(スピーカーだと AI が自分の声を拾うことがあります)
ブラウザ Google Chrome か Microsoft Edge
契約 Claude の有料プラン(Pro 以上)。会話も作業も、プランの利用枠を使います
ソフト Node.js(LTS)、Python 3.10〜3.12、Claude Code、AivisSpeech(どれも下で入れます)
  • 料金のルールは 2026 年 10 月時点の話です。Claude のプランの決まりは変わることがあります。
  • 聞き取りも画面も日本語だけです。
  • 使っている間は PC をつけたままにします。

1. 入れる(約 30 分)

画面ごとの詳しい手順は README の「3. インストール」にあります。ここでは順番と、つまずきやすいところだけ書きます。

  1. Node.js の LTS を https://nodejs.org/ja から入れて、コマンドプロンプトを開き直して node -v を確かめます。

  2. Python 3.12 を https://www.python.org/downloads/ から入れます。インストーラーの最初の画面で 「Add python.exe to PATH」に必ずチェックを入れます。python と打って Microsoft Store が開くなら、このチェックが入っていません。

  3. Claude Code を公式の手順で入れて、claude を一度起動してログインします(終わったら /exit)。

    curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd
    
  4. AivisSpeech を https://aivis-project.com/ から入れて、一度起動します。最初の起動で声のモデルなど(約 900MB)をダウンロードするので、終わるまで待ちます。使っている間は起動したままにします。

  5. AI あまね を取得します。ZIP でも Git でもかまいません。置き場所は C:\ai-amane のような浅い場所にします(OneDrive の中は避けます)。

    git clone https://github.com/ai-amane/ai-amane.git C:\ai-amane
    
  6. フォルダの中の .env.example をコピーして .env にし、USER_NAME= の後ろに、AI から呼ばれたい名前を書きます(あとから画面でも変えられます)。

  7. start.bat をダブルクリックします。初回は部品のインストールと音声認識モデル(約 200MB)のダウンロードで数分かかります。

黒いウィンドウに次のような表示が出て、ブラウザで http://localhost:3939 が開けば成功です。

  AI AMANE is running: http://localhost:3939
  ...
[stt] ready on http://127.0.0.1:3941  engine=reazonspeech ...

黒いウィンドウは閉じないでください。閉じると あまね も止まります。

2. 最初の設定

画面右下の「設定」を押すと、大きな窓で開きます。「声」「聞き取り」「会話」「名前・性格」「作業」「見た目」「iPad・スマホ」に分かれていて、上の欄で設定を探すこともできます。最初は次の 4 つだけ見ておけば十分です。

設定の「声」の画面

  1. 声: 声のエンジンが「AivisSpeech」になっているか確かめて、「AivisSpeech の声」を選んで「試聴」します。「声に気持ちを込める」はオンのままにしておくと、文ごとに、うれしい・やさしい などの声の調子で話します。
  2. 会話: 「呼びかけの言葉」は最初「あまね」です。変えるなら、ふだんの会話やテレビに出てこない 3〜4 音の言葉が向いています。
  3. 名前・性格: AI の名前・呼び方・話し方・返事の長さ・キャラクター・守ってほしいルール・あなたについて(住んでいる地域など)を書いて「保存して反映」を押します。話し方は、執事・親しい友だち・元気なアシスタント・やさしい先生 のひな形から選べます。
  4. 作業: 「作業を頼む前に確認する」で、すべて・時間のかかる作業だけ・しない を選べます。最初はそのまま(確認する)がおすすめです。

「名前・性格」の画面

設定したら、画面を一度クリックして「待受をオン」を押し、マイクを許可して「あまね」と呼びかけます。返事があれば、そのまま話しかけてください。

言い方 何が起きるか
「あまね、今日の東京の天気は?」 呼びかけと質問を一息で言うと、すぐ答えます(Web 検索を使います)
「3分たったら教えて」 タイマーをセットして、残り時間を画面の上に出します
「東京駅からスカイツリーまで電車でどう行く?」 道順(Google マップのルート案内)を画面に出します
「簡単なブロック崩しを作って」→「お願い」 作業担当がゲームを作り、画面のパネルで遊べます
「ありがとう、おやすみ」 会話を終えて、待受に戻ります

つまずきやすいところ

症状 確かめること
呼んでも反応しない(「聞こえた言葉」は出る) 呼びかけは話し始めに言います。文の途中の「あまね」と、「あまねって」のように後ろに助詞が続くときは反応しません
返事が来ない(考えています のまま) コマンドプロンプトで claude を起動して、ログインできているか確かめます
AI が自分の声に反応して止まる ヘッドホンにします
返事が遅い 設定の「返事までにかかった時間を会話ログに出す」をオンにすると、どこで時間がかかっているか分かります

ほかの症状は README の「6. うまく動かないとき」にあります。

3. 追加機能を 1 つ作る(買い物メモ)

ここからが本題です。あまね には、plugins フォルダに機能ごとのフォルダを入れるだけで、機能を足せます。同梱の plugins/timer(タイマー)が見本で、作り方は docs/plugins.md にあります。

作るもの:

  • 「牛乳を買い物メモに足して」→ 覚える
  • 「買い物メモに何がある?」→ 中身を話す
  • 「買い物メモを消して」→ 画面のボタンで確かめてから消す

3-1. ファイルを置く

plugins\shopping\plugin.js を作って、次の内容にします。フォルダ名と id は同じにします(英小文字・数字・ハイフン)。

plugins/shopping/plugin.js
// 買い物メモ(自分で作る追加機能の見本)
//  「牛乳を買い物メモに足して」「買い物メモに何がある?」「買い物メモを消して」
//  中身は data/plugins/shopping.json に保存されるので、起動し直しても残る
const MAX_ITEMS = 50;
const itemsOf = (ctx) => {
  const v = ctx.store.load([]);
  return Array.isArray(v) ? v : [];
};

module.exports = {
  id: "shopping",
  name: "買い物メモ",
  description: "買うものを覚えておくメモ",
  requires: ["confirm"],
  prompt: `「〇〇を買い物メモに足して」「買い物メモに何がある?」「買い物メモを消して」と頼まれたら使う。
- item には品物の名前だけを短く書く(例: 牛乳、単三電池)。
- 中身を聞かれたら shopping.list を使う。`,
  actions: {
    add: {
      description: "買い物メモに品物を足す",
      usage: ['<act do="shopping.add" item="牛乳"/>'],
      params: { item: { type: "string", max: 30, desc: "品物" } },
      run: (args, ctx) => {
        const items = itemsOf(ctx);
        if (items.length >= MAX_ITEMS) throw new Error("買い物メモがいっぱいです。先に消してください");
        ctx.store.save([...items, args.item]);
        return `${args.item}を買い物メモに足しました。`;
      },
    },
    list: {
      kind: "query",
      description: "買い物メモの中身",
      run: (args, ctx) => {
        const items = itemsOf(ctx);
        return items.length ? `買い物メモ: ${items.join("、")}` : "買い物メモは空です。";
      },
    },
    clear: {
      description: "買い物メモを全部消す",
      confirm: "買い物メモを全部消しますか?",
      confirmLabel: "全部消す",
      run: (args, ctx) => {
        ctx.store.save([]);
        return "買い物メモを消しました。";
      },
    },
  },
};

書いていることを順に説明します。

  • prompt は、頭(会話の返事を考える Claude Code)への説明です。いつ使うか、引数をどう書くかを短く書きます。
  • actions の 1 つずつが動作です。頭は返事の中に <act do="shopping.add" item="牛乳"/> のようなタグを書き、画面がそれを見つけてサーバーに送ります。タグは読み上げられません。
  • params に書いた引数だけが run に渡ります。タグの属性は全部文字列なので、type に合わせて直してから渡されます。type: "number" なら min・max が必須です。文字列からは改行・制御文字と []<> が取り除かれます。
  • kind: "query" の動作は、run が返した文を頭が言葉にして話します。何も書かない動作(command)は、実行するだけです(頭はタグを書いたときに、もう「足しました」と話しています)。
  • new Error("理由") を投げると、その理由を頭がそのまま伝えます。「先に消してください」のように、次にどうするかまで書くと会話がつながります。
  • ctx.store は data/plugins/<id>.json に JSON で保存する部品です。
  • confirm を書いた動作は、すぐには実行されません。頼んだ画面に確認のカードを出し、「全部消す」を押すか、カードが出ている間に「お願い」と言ったときだけ実行されます。消す・送る・買うのような取り返しのつかない動作には、これを付けます。
  • requires: ["confirm"] は、使う本体の仕組みの宣言です。この仕組みがない古い本体では、黙って違う動きをせず、読み込まれません。

3-2. 起動し直して確かめる

start.bat をもう一度ダブルクリックします(二重に起動すると、新しいほうが古いほうを止めて入れ替わります)。黒いウィンドウに次の行が出れば読み込めています。

[plugins] 買い物メモ を使えます

plugins 買い物メモ を使えます の行

書き間違いがあると、理由を出して読み込みを飛ばします(ほかの機能はそのまま動きます)。たとえば id とフォルダ名が違うと「id(…)がフォルダ名(…)と違います」と出ます。

頭にどう説明されたかは、logs/brain-system-prompt.md で確かめられます。今回のプラグインは、後ろのほうにこう付きます。

## 買い物メモ(shopping)
「〇〇を買い物メモに足して」「買い物メモに何がある?」「買い物メモを消して」と頼まれたら使う。
- item には品物の名前だけを短く書く(例: 牛乳、単三電池)。
- 中身を聞かれたら shopping.list を使う。
- <act do="shopping.add" item="牛乳"/>: 買い物メモに品物を足す
- <act do="shopping.list"/>: 買い物メモの中身(確認)
- <act do="shopping.clear"/>: 買い物メモを全部消す(画面で確認)

3-3. 声で試す

「あまね、牛乳を買い物メモに足して」「単三電池も」「買い物メモに何がある?」と話しかけます。

会話ログの「牛乳を買い物メモに足しました。」

「買い物メモを消して」と言うと、画面に確認のカードが出ます。

確認のカード

カードは 60 秒で期限が切れます。声の「お願い」で決められるのは、初期値では設定の「会話中は、呼びかけた人の声だけを聞く」がオンのときだけです(テレビや家族の「お願い」で動かさないため)。オフのときは、ボタンを押します。

実行の記録は、すべて logs/plugins.jsonl に残ります(どの画面から、何を、どの引数で、結果はどうだったか)。

3-4. 気をつけること

  • プラグインはサーバーと同じ権限で動きます(ファイル・ネットワーク・.env の値を使えます)。人からもらったものは、信頼できる人が作ったものだけを入れてください。
  • API キーなどを使うときは .env に書き、名前を KEY・TOKEN・SECRET・PASSWORD などで終わる形にします。この形の名前は、作業担当や頭には渡りません。
  • run は 15 秒で打ち切られます。通信をするときは ctx.signal を渡しておくと、打ち切ったときに通信も止まります。
  • plugins フォルダは、同梱のタイマー以外は Git の管理に入らないようになっています(.gitignore)。自分で作ったものが、うっかり公開されないようにするためです。
  • 止めたいときは .env に PLUGINS_OFF=shopping と書きます。

おわりに

ここまでで、声で話しかけて、自分で作った機能を使えるところまで来ました。引数の型や、確認のカード、知らせ(ctx.notify)・画面の上に出す状態(ctx.setStatus)など、ほかの部品は docs/plugins.md にまとめています。

この記事は、中の人が生成 AI(Claude)を使って下書きし、載せたコードは公開版の本体で動くことを確かめてから出しています。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?