(編集中) OpenClaw で遊ぼう(2): デスクトップマスコット化をさらに進める
前回 の記事で作成したアプリ doll を拡張してさらにいい感じにしていこう。
いまは「リクエストが飛んできたら対応する感情の立ち絵に切り替える」だけの機能を持っている。基本的な設計は変えずに機能を追加していく。
リポジトリは こちら 。自分用なので、いろいろ適当なのはご容赦を。
呼吸っぽい常時アニメーションと立ち絵切り替え時のアニメーションを追加


React のアニメーションライブラリ Motion を使って実装。細かいが、あると思った以上に華やかになる。
応答時に音声出力する
国産の音声合成ソフト Voisona Talk は REST API が提供されていて、テキストを送信すると起動中の Voisona から音声を再生することができる。
なんと記事の執筆当日に ナースロボ_タイプT という、ちょうど理想的なダウナー系でかわいい声のライブラリが発売されたので、こちらを購入して使うことにする。
OpenClaw が応答文と感情を doll に送る -> doll が立ち絵の切り替えと Voisona への音声再生リクエストを行う、という仕組みで実装する。
OpenClaw が doll に送るテキストは応答文と完全一致ではなく、英語をカタカナにしたり一部を要約することでより自然に発音されるようにしている。
(あとで動画)
無事に喋った。かわいい。
スキンごとに立ち絵やボイスを設定可能にする
将来的には、複数のスキン(キャラクター)を自由に設定、切り替えできるようにしたい。そこで skin.toml で「キャラクターがどの音声ライブラリを使うか」「キャラクターがどんな感情(立ち絵)を持っているか」「ある感情のとき、どんな声色にするか」を定義し、それを doll が読み込む仕組みにした。
display_name = "たま"
thinking_phrases = ["ちょっと待っててね", "えーと", "うーん", "考え中だよ"]
[voice]
voice_name = "nurse-robot-type-t_ja_JP"
# Base voice parameters (all optional, VoiSona Talk defaults used when omitted):
speed = 0.9 # 0.2–5 (speech rate; 2 = half duration)
volume = 0.0 # -8–8 (amplitude in dB)
pitch = 100.0 # -600–600 (pitch shift in cents)
intonation = 1.0 # 0–2 (pitch contour variation scale)
alp = -0.4 # -1–1 (age-like voice quality)
huskiness = 1.0 # -20–20 (huskiness control)
# NurseRobot_TypeT styles: [Normal, Happy, Angry, Sad, Smol]
[emotions.happy]
description = "嬉しい・ポジティブな応答"
style_weights = [0.0, 1.0, 0.0, 0.0, 0.0]
[emotions.sad]
description = "悲しい・残念な応答"
style_weights = [0.0, 0.0, 0.0, 1.0, 0.0]
[emotions.angry]
description = "怒り・警告・不満"
style_weights = [0.0, 0.0, 1.0, 0.0, 0.0]
[emotions.surprised]
description = "驚き・予想外の発見"
style_weights = [0.5, 0.5, 0.0, 0.0, 0.0]
[emotions.neutral]
description = "普通・事実の説明・淡々とした応答"
style_weights = [1.0, 0.0, 0.0, 0.0, 0.0]
[emotions.thinking]
description = "思考中・処理中"
style_weights = [1.0, 0.0, 0.0, 0.0, 0.0]
OpenClaw はあらかじめそのスキンで使える感情の一覧を把握したうえでリクエストを送信するため、「照れ系のバリエーションが豊富なツンデレキャラ」や「基本笑わない無感情キャラ」も実現できる(はず)。
思考中の立ち絵とボイスを再生
指示から応答までにはある程度時間がかかるため、その間立ち絵がまったく動かなかったり何も喋らないと少し寂しい。
OpenClaw の Hook を用いて、思考開始タイミング(正確には、送信した指示がすべて解釈されたタイミング)で doll へリクエストを飛ばす。
思考中はそれっぽい立ち絵とともに「ちょっと待ってね」「うーん」といったボイスが5秒おきにランダム再生されるようにしてみた。これでもう寂しくない!
(あとで動画)
チャット UI を追加

doll だけでチャットが完結するようにした。作業スペースの端に常駐させておけば、いつでも質問や作業指示ができる。
まとめ
(あとで動画)
こんな感じで応答してくれるようになった。単に萌え〜というだけのアプリではなく、音声で応答してくれるのが思った以上に便利。 Wisprflow のようなツールを使って音声同士で会話しても楽しい。