見出し画像

小春六花とおしゃべりしてみたくない?

序論です!
もういくつ寝るとクリスマス、次いで年の瀬ですね。
この時期といえば、Advent calender (アドベントカレンダー)という文化がありますが、皆さんはご存知でしょうか?
クリスマスまで毎日1日ずつお菓子を食べたりするやつです。
転じて昨今では、毎日1日ずつ記事を書く、みたいな文化が定着しつつあって、特にエンジニア文化 (つまりプログラミングする人たち)では盛んです。
(参考: https://qiita.com/advent-calendar/2025)


要するに

小春六花とおしゃべりしてみたくない?


というわけで、Voicepeakを使って小春六花とチャットでおしゃべりするためのミニ開発やってみた、という開発記事です。
なるべく基本的なことから書いていこうと思っていますので、開発ってこういう手順でやるんだぁ、くらいに思ってもらえたら嬉しいです。
逆に、厳密なことは基本的に書かず、"気持ち"の部分 (概要や目的)だけ伝えられればと思っています。

ちなみに、実装自体は2025/06/25に公開していて、デモとソースコードは以下のポストからアクセスできます。



1. 概要: やりたいこと と やったこと

Voicepeakというソフトウェアをご存知でしょうか?
合成音声を用いた読み上げソフトで、非常に自然な読み上げをしてくれる上に、いろんな感情での読み上げ方を簡単操作で表現できます。

読み上げの自然さもさることながら、このソフトの素晴らしい点の一つは
コマンドラインから実行できるようにしてくれていること
です。

コマンドラインとは、簡単に言えばPCをマウスカーソルじゃなくてキーボードで打つコマンドで操作する方式のこと。

つまりシンプルに言ってしまえば
マウスポチポチせずキーボードだけでVoicepeakを操作できるよ
ということです。

コマンドで実行できると
Voicepeakをいろんなものと組み合わせて自動化できます。

例えばマイクに向かって「ぬるぽ」とつぶやいたら「ガッ」とVoicepeakに読み上げさせたい、みたいな遊びを思いついたとします。
デスクトップで立ち上がるアプリではマイクでの入力ができないのでこれは実現できないですね。
一方で、コマンドでVoicepeakを実行できるなら以下のようなプログラムを書けばこの遊びを実現できます。

 1. マイクで音声信号を受け取る
    ↓ 音声が「ぬるぽ」だったら…
 2. Voicepeakに「ガッ」と読み上げさせるコマンドを実行する

こんなふうに、Voicepeakコマンドを使うとデスクトップアプリだけではできないことができる、というわけですね。

じゃあこの利点を使ってやりたいことをやりましょう。
小春六花とおしゃべりしたくない?

ということで、Voicepeakコマンドを駆使して小春六花と簡単なおしゃべりができるチャットボットを作ってみよう、というのが本開発の目的です。
現状ではMacOSのみでの動作確認、コマンドラインからのみ実行可能という限定的な実装ですが、以下につらつらと開発の手順を説明していきます。

2. 環境構築: プログラムを書く前に

野球って当然、試合してる時が一番楽しいですよね。
練習も、辛いけど上達が見えてまあまあ楽しいと感じる場面あります。
でも、グラウンド整備って大抵楽しくない、というか作業ですよね。

さて、適当な対応を取ると

野球での試合はプログラミングでのプログラムを書くこと
野球での練習はプログラミングでの勉強やデバッグ
野球でのグラウンド整備はプログラミングでの環境構築

みたいなものです。(細かな不一致はご容赦ください)
つまり、環境構築とは練習や試合をする前の準備として必要な工程で、大抵楽しくないところです。

じゃあ具体的に環境構築って何をするの?という話ですが、簡単に言えば
目的のプログラムを実行できる状態にすること
です。

今回でいえば、チャットボットを実行したり、Voicepeakで読み上げたりするコマンドを実行するために必要な材料を集めることです。
今回の開発では主にZshとPython周りですね。

さてじゃあ、実際に環境構築をやってみましょう、と懇ろに手引きしていきたいところなのですが、記事が長くなり過ぎてしまうので、基本的なところは先人の方々の分かりやすい記事にお任せしたいと思います。
端折っていえば、Xcode経由でCommand Line Toolsというものをインストールした後、python.orgやMacports、HomebrewでPythonをインストールする、という手順です。

Pythonがインストールできたら、いよいよターミナルアプリを開いて環境構築のためのコマンドを打ち込んでいきます。

1. pythonのバージョン確認 (3.10.9以上ならOK)

% python --version
Python 3.10.9

2. pythonの仮想環境を作る (チャットボット実行用の小部屋を作る)

% mkdir -p ~/git ~/tokyo6_bot
% python -m venv ~/tokyo6_bot && source ~/tokyo6_bot/bin/activate

3. チャットボットのコードをダウンロードしてモジュールインストール

% cd ~/git
% git clone git@github.com:jolontech/simple_tokyo6_bot.git ~/git/simple_tokyo6_bot
% cd ~/git/simple_tokyo6_bot/requirements/
% pip install -r requirements.txt

うまくいっていれば、これで環境構築はOKです。
Pythonは環境構築が比較的楽で助かりますね。

3. 実装: 一番楽しいところ

さて、実際に実装を見てみましょう。
と言っても、難しいことはやっていない割に説明しようとすると長くなり過ぎてしまうので、ざっくりこんな感じ、という雰囲気を伝えたいと思います。

今回の仕様は以下です。

  • メッセージを打つと、内容に応じて読み上げメッセージを返してくれる

  • 「おはよう」と挨拶すると、挨拶し返してくれる

  • ポジティブなメッセージを打つと、いいね!とか言ってくれる

  • ネガティブなメッセージを打つと、慰めてくれる

  • 好きな食べ物や嫌いな食べ物を打つと、喜んだり嫌がったりする

  • 「またね」と告げると、お別れの挨拶をしてくれる

  • コンフィグファイルで小春六花、夏色花梨、花隈千冬の3人を切り替えられるようにする

チャットボットとしては本当にシンプルな部類ですね。
ポジティブなメッセージとネガティブのメッセージの判別には、日本語の感情推定を行う既存のモデル (打ったメッセージがポジティブかネガティブかを分類するモデル)を用いているので、ここは自分では作っていません。

最後のコンフィグファイルというのは具体的には以下のようなファイルです。

# VOICEPEAK_PATH: voicepeakコマンドのパス
# SPEED: 読み上げスピード 50~200の範囲 (デフォルト:100)
# PITCH: 読み上げピッチ -300~300の範囲 (デフォルト:0)
[common]
VOICEPEAK_PATH = /Applications/voicepeak.app/Contents/MacOS/voicepeak
SPEED = 100
PITCH = 0

# EMOT1: ハイテンション (hightension) 0~100の範囲 (デフォルト:0) 
# EMOT2: ブチギレ (livid) 0~100の範囲 (デフォルト:0)
# EMOT3: 嘆き (lamenting) 0~100の範囲 (デフォルト:0)
# EMOT4: 蔑み (despising) 0~100の範囲 (デフォルト:0)
# EMOT5: ナレーション (narration) 0~100の範囲 (デフォルト:0)
# NARRATOR: ここは変えないでください
[indivisual]
EMOT1 = hightension=70
EMOT2 = livid=0
EMOT3 =lamenting=0
EMOT4 = despising=0
EMOT5 = narration=0
NARRATOR = Koharu Rikka

難しく見えるかもしれないですが、デスクトップアプリと対応しているパラメータが多く、説明に従って入力すればOKです。
なんならデフォルトのものを使ってもらって全く問題ないです。

具体的な実装については、githubにあるコードを見てもらえればと思います。

ざっくりとした実装としては以下のような流れです。

 1. コンフィグファイルから読み上げるキャラを決定
 2. 感情推定モデルをロード
 3. メッセージを待つ
 4. メッセージがお別れの挨拶だったら、お別れの挨拶を返して終了
 5. それ以外だったら、応答テキストと応答音声 (wavファイル)を生成
 6. 応答テキストを表示し、応答音声を再生
 7. 3.に戻る

今でこそ、生成AIだけでプログラムを書く時代になってきていて (バイブコーディングというらしい)、否定の意図は全くありませんが、こういう骨組みを考えて自分の手でプログラムを書くのがやっぱり楽しいと個人的には思うんですよね。

4. テスト: 実際にしゃべってみる

ダラダラと実装の概要を書いてきましたが、実際にどうやって実行するの?という説明です。
環境構築を無事に終えられているのであれば実行は簡単。
以下のコマンドですぐに動きます。
"ユーザー: "に続く部分にメッセージを入れてReturnを打てば応答が返ってきます。

% cd ~/git/simple_tokyo6_bot/src
% python main.py
Device set to use cpu

 六花がログインしました。

ユーザー: [文章を入力]  # 文章を入力するとbotが返答
...

ユーザー: おやすみ  # 終了する際は"おやすみ"や"バイバイ"、"またね"と入力
六花: またね〜! *˙︶˙*)ノ

花梨先輩や千冬ちゃんともおしゃべりしたいよ、という場合には、以下を実行してみてください。
コンフィグファイルを指定することで花梨先輩や千冬ちゃんをナレーターとして指定してチャットボットを起動できます。

% python main.py --cfg ../confs/karin_template.cfg  # [rikka/karin/chifuyu]_template.cfgのうちいずれかを指定
Device set to use cpu

 花梨がログインしました。

ユーザー: [文章を入力]  # 文章を入力するとbotが返答
...

ユーザー: おやすみ  # 終了する際は"おやすみ"や"バイバイ"、"またね"と入力
花梨: またね! *˙︶˙*)ノ

最後に、少々発展的ですが、読み上げのパラメータを好きにいじって実行したい場合は、コンフィグファイルが置いてあるディレクトリに好きなコンフィグファイルを作った後、以下のように実行できます。
感情パラメータを変えたり、読み上げスピード、ピッチを変えたりはできますが、イントネーションは変えられないので注意です。

% python main.py --cfg ../confs/[your_config_file]  # テンプレートを編集して自由にカスタマイズ
Device set to use cpu

 千冬がログインしました。

ユーザー: [文章を入力]  # 文章を入力するとbotが返答
...

ユーザー: おやすみ  # 終了する際は"おやすみ"や"バイバイ"、"またね"と入力
千冬: また来てくださいね! *˙︶˙*)ノ

実際に読み上げた動画はXの方にポストしているものを参照ください。
やっぱり、イントネーションの調整ができずベタ打ちの読み上げなので、ところどころ訛ってるのがなんとも言えない味を出してますね…!

5. ToDo: 今後やりたいこと

まとめると

  • コマンドラインから動かせるVoicepeakは神

  • Voicepeakコマンドを使って簡単におしゃべりチャットボットを実装できる

  • 小春六花とおしゃべりできて嬉しい

という感じです。
Voicepeakコマンドは自分が買ったナレーターであれば基本的に誰でも対応してくれるので、例えばフリモメンとのおしゃべりもできます。

また、今回は応答の部分はかなりシンプルに実装しましたが、もっと高度な応答にすることも可能です。

ただし、おしゃべりチャットボットのようなツールはキャラクターに直接的に人格を与えることになるので、いろいろな面で実装・公開に注意が必要だと思っています。
例えば、チャットボットの応答にChatGPTを利用して実装した場合、どんな応答が返ってくるかは制御できず、最悪の場合、非道徳な発言をするキャラクターが提供されてしまう可能性があるわけです。
このようなキャラクターイメージの喪失に対する責任は実装したエンジニアが負うべきだと思うので、われわれエンジニアは今後注意が必要なんですよね。

さて、謎にまじめな話をしてしまいましたが、以上でミニ実装の解説を終わりたいと思います。
今回の開発に興味がある方や、面白い開発のアイデアがある方はぜひ序論まで声かけてもらえたら嬉しいです。

それでは、良いお年を。

いいなと思ったら応援しよう!