Vovó API 1
Vovó 自身のコードから生成しているため、常にこのバージョンと一致します。視聴者からのテキストは常にプレーンテキストで届き、HTML にはなりません。
シンプルなイベント
どのプラットフォームでも同じで、{platform} がどれかを示します。1 つのプラットフォームにしかないものは、下にあるそのプラットフォームのイベントを使ってください。
follow
誰かがチャンネルをフォローしました。 元のイベント twitch.follow.
user(テキスト): 誰がしたか(プラットフォームでの表示名)。platform(プラットフォーム): どこで起きたか。
sub
誰かがサブスク、継続、またはギフトを受け取りました。 元のイベント twitch.sub.
user(テキスト): 誰がしたか(プラットフォームでの表示名)。tier(数値): 1、2、3 のいずれか。months(数値): サブスクの通算月数。gift(はい/いいえ): ギフトかどうか。platform(プラットフォーム): どこで起きたか。
raid
ほかのチャンネルがこのチャンネルにレイドしました。 元のイベント twitch.raid.
user(テキスト): 誰がしたか(プラットフォームでの表示名)。viewers(数値): 何人が一緒に来たか。platform(プラットフォーム): どこで起きたか。
chat
チャットのメッセージ。 元のイベント twitch.chat.
user(テキスト): 誰がしたか(プラットフォームでの表示名)。text(テキスト): メッセージ(プレーンテキスト)。parts(テキストとエモート): メッセージを順に分けたもの:各部分のtextと、エモートならその画像(image、Vovó が配信)。vovo.chat.parts(e)で表示用のノードにできます。platform(プラットフォーム): どこで起きたか。
tip
誰かがお金かビッツを送りました。 元のイベント twitch.cheer.
user(テキスト): 誰がしたか(プラットフォームでの表示名)。amount(数値): 金額(単位はcurrency)。currency(テキスト):bits、またはBRLなどの通貨コード。text(テキスト): メッセージ(プレーンテキスト)。platform(プラットフォーム): どこで起きたか。
Twitch
twitch.follow
Twitch でのフォロー。
user(テキスト): 誰がしたか(プラットフォームでの表示名)。
twitch.sub
Twitch でのサブスク、継続、ギフト。
user(テキスト): 誰がしたか(プラットフォームでの表示名)。tier(数値): 1、2、3 のいずれか。months(数値): サブスクの通算月数。gift(はい/いいえ): ギフトかどうか。gifter(テキスト): ギフトの場合、贈った人。text(テキスト): メッセージ(プレーンテキスト)。
twitch.raid
Twitch でのレイド。
user(テキスト): 誰がしたか(プラットフォームでの表示名)。viewers(数値): 何人が一緒に来たか。
twitch.chat
Twitch のチャットメッセージ。
user(テキスト): 誰がしたか(プラットフォームでの表示名)。text(テキスト): メッセージ(プレーンテキスト)。parts(テキストとエモート): メッセージを順に分けたもの:各部分のtextと、エモートならその画像(image、Vovó が配信)。vovo.chat.parts(e)で表示用のノードにできます。color(テキスト): 名前の色(#RRGGBB)。badges(テキスト): バッジ(カンマ区切り):moderator,subscriber。persona(はい/いいえ): その行がペルソナ自身のもの(ペルソナのアカウントがチャットに書いたもの)のとき true。
twitch.viewers
配信を見ている人数。配信中は約 1 分ごとに Twitch に問い合わせます。人数が変わったとき、また配信が終わったとき(live が false)に届きます。
viewers(数値): 今見ている人数。live(はい/いいえ): 配信中は true。
twitch.cheer
Twitch で送られたビッツ。
user(テキスト): 誰がしたか(プラットフォームでの表示名)。bits(数値): ビッツの数。text(テキスト): メッセージ(プレーンテキスト)。
twitch.redemption
チャンネルポイントの特典が引き換えられました。
user(テキスト): 誰がしたか(プラットフォームでの表示名)。reward(テキスト): 特典のタイトル。reward_id(テキスト): Twitch での特典の ID。名前を変えても変わりません。input(テキスト): 入力された内容(テキストを求める特典の場合)。redemption(テキスト): Twitch でのこの引き換えの ID。対応するtwitch.redemption.resolvedと同じです。
twitch.redemption.resolved
特典のキューで待っていた引き換えが承認または却下されました(却下するとポイントが戻ります)。
user(テキスト): 誰がしたか(プラットフォームでの表示名)。reward(テキスト): 特典のタイトル。reward_id(テキスト): Twitch での特典の ID。名前を変えても変わりません。input(テキスト): 入力された内容(テキストを求める特典の場合)。status(テキスト):approved(承認)またはrejected(却下)。redemption(テキスト): Twitch でのこの引き換えの ID。対応するtwitch.redemptionと同じです。
twitch.hypetrain
ハイプトレインが始まった、進んだ、または終わった。
level(数値): 現在のレベル。progress(数値): このレベルで獲得したポイント。goal(数値): このレベルに必要なポイント。ended(はい/いいえ): 今終わったかどうか。
Vovó と OBS から
button
パッドのボタンが押されました。
label(テキスト): ボタンのラベル。
hotkey
グローバルホットキーが押されました(ゲームが前面にあってもなくても)。トリガーは条件で組み合わせを指定し(keys が Ctrl+Alt+1)、プロファイルが有効な間アプリが待ち受けます。
keys(テキスト): 組み合わせ(例:Ctrl+Alt+1)。
timer
タイマーが作動しました。トリガーは条件で間隔を指定し(every は秒数、5 以上)、指定がなければ 1 分ごとに作動します。トリガーが現れたときから数え、パニック中は止まります。
every(数値): 間隔(秒)。
control
アクションのコントロールの 1 つがパッドで変更されました。新しい値はコントロールのキーで vovo.state にも入るので、あとから開いたページにも表示されます。コントロールを持つアクションは、トリガーに追加しなくてもこれを受け取ります。
key(テキスト): コントロールのキー(アクションが宣言したもの)。value(コントロールの値): 新しい値:true か false、選択肢、整数、または 1 行のテキスト。
settings
「カスタマイズ」でアクションの設定の選択が変わりました。vovo.settings、--vovo-<key> 変数、data-vovo-<key> 属性にはすでに新しい値が入っています。設定を宣言したアクションは、トリガーに追加しなくてもこれを受け取ります。
key(テキスト): 設定のキー。すべてがアクションの初期状態に戻ったときは空。
panel
アクションのパネル(マニフェストの panel、サイドバーの「パネル」に表示)で操作がありました:ボタンが押された、フォームが送信された、リストの行のボタンが押された。control と同じく、パネルを持つアクションはトリガーに追加しなくてもこれを受け取ります。起動できるのは配信を操作する人だけです。
name(テキスト): ボタン、フォーム、または行ボタンの名前(パネルが宣言したもの)。values(コントロールの値): フォームのフィールド(キーごと、それぞれ 1 行のテキスト)。ボタンの場合は空。item(コントロールの値): リストの行の場合、その行が表示している項目(状態に保存されているとおり)。index(数値): リストの行の場合、リスト内の位置(0 から)。それ以外は -1。
webhook
受信 Webhook が呼び出されました。
hook(テキスト): Webhook の名前。data(データ): 送られてきた内容(信頼できないもの)。テキストとしてだけ表示してください。
obs.scene
OBS がシーンを切り替えました。
scene(テキスト): 今オンエア中のシーン。previous(テキスト): その前のシーン。
media.track
このコンピューターで再生中のものが変わりました(別の曲、または再生・一時停止)。Windows に再生内容を伝えるアプリ(Spotify、ブラウザー、メディアプレーヤー)から届きます。
title(テキスト): 曲名。artist(テキスト): アーティスト。album(テキスト): アルバム(わかる場合)。playing(はい/いいえ): 再生中は true、一時停止・停止中は false。art(テキスト): ジャケット画像のアドレス(<img src>用)。ない場合は空。source(テキスト): 再生しているアプリ。
audio.level
マイクの音量。変化している間、毎秒約 20 回届きます(動く口、メーター、グローなどに)。Vovó が聞くのは、これを待つアクションを開いたオーバーレイが表示している間だけです。音そのものはコンピューターから出ず、音量だけが伝わります。
level(数値): 音量。0(無音)〜1(最大)、聴感に合わせた尺度。peak(数値): 前回以降でいちばん大きかった瞬間(0〜1)。speaking(はい/いいえ): 声があるあいだ true。短い間でも少しのあいだ保持します。
screen.color
メイン画面の色。変化している間、毎秒数回届きます(ゲームに合わせたグローや枠に)。これを待つアクションを開いたオーバーレイが表示している間だけ読み取ります。Vovó 自身の画面オーバーレイは含まれません。
color(テキスト): 平均色(#RRGGBB)。vivid(テキスト): 画面でいちばん目立つ色(#RRGGBB)。平均色は灰色に寄りますが、こちらは寄りません。brightness(数値): 画面の明るさ。0(黒)〜1(白)。
input.move
配信者のゲーム内での動き。変化している間、毎秒最大 60 回届きます:カメラがどれだけ回ったか、どちらへ歩いているか、ジャンプしているか。カメラに合わせて揺れ、横移動で傾き、ジャンプで沈むシーンに。マウス、移動キー(W、A、S、D はキーボード配列に関係なく位置で判断、または矢印キー、スペースキー)、最初に接続したコントローラー(スティックと A ボタン)から届き、常に方向として伝わり、どのキーかは伝わりません。これを待つアクションを開いたオーバーレイが表示している間だけ読み取り、キーボードのほかのキーは読みません。Vovó のウィンドウが前面にある間はキーを読みません(マウスとコントローラーは読みます。このコンピューターでそれらも止める設定にしていない限り)。管理者として実行しているゲームは、管理者権限なしで動く Vovó から入力を隠すことがあります。
dx(数値): 前回から横方向にカメラがどれだけ回ったか(右が正)。マウス自体の移動量をそのカウントで表します(ゲームが固定しているポインター位置ではありません)。コントローラーの右スティックも加算します。dy(数値): 上下にどれだけ回ったか(下が正)。walk(数値): -1(後退)〜1(前進)。W・S や矢印キーは 1 か -1、コントローラーの左スティックは倒した分。止まっているときは 0。strafe(数値): -1(左、A)〜1(右、D)。考え方は同じです。jump(はい/いいえ): スペースキーかコントローラーの A を押している間 true。
speech.text
配信者がマイクに話した内容を、字幕用に 1 フレーズずつ文字にしたもの。このコンピューターの Whisper、または配信者が選んだ場合は OpenAI が文字にします(設定 > 音声、音声のテキスト化)。マイクを読むのは、これを待つアクションを開いたオーバーレイが表示している間だけです。各フレーズは間が終わったとき、話してから 1〜2 秒後に届き、何も保存しません。
text(テキスト): フレーズのテキスト。
screen.shared
共有画面がオンエアされた、または外れました:画面、ウィンドウ、ブラウザーのタブ。配信者自身のもの(Vovó 自身がキャプチャしたもの、またはブラウザーの共有ページから共有したもの)、または配信者がオンエアにしたゲストのもの。配置するアクション(vovo.screen.place)が表示します。共有していたものが別のものに置き換わると、on が真のままもう一度届きます。
on(はい/いいえ): 何か共有している間 true。kind(テキスト): 共有しているもの:screen、window、tab(タブは共有ページからのみ)。何もないときは空。audio(はい/いいえ): 音声も一緒に来るとき true。guest(テキスト): 画面の持ち主のゲスト(配信者が付けた名前)。配信者自身の画面なら空。
camera
アクションが置いたカメラ(vovo.camera.place)がそのページに表示され始めた、または表示されなくなった:配信者がカメラをオン・オフした、パニックでオフになった、抜かれた、またはほかのプログラムが使用中。settings と同じく、カメラを置くアクションはトリガーに加えなくてもこれを受け取ります。
camera(テキスト): 表示しているカメラ設定のキー(アクションが宣言したとおり)。on(はい/いいえ): 映像が表示されている間は true。
persona.answer
ペルソナが誰かに答えました(承認がオンなら承認済み)。アプリは設定に応じてチャットに送り、読み上げます。アクションは表示を担当します。
persona(テキスト): ペルソナの名前。user(テキスト): 誰がしたか(プラットフォームでの表示名)。question(テキスト): 質問された内容。answer(テキスト): 答え。mood(テキスト): 答えの最初か最後の角かっこ内の語([dancing] 勝った!)から取った、ペルソナにさせる動作(小文字)。なければ空。この語は答えから取り除かれ、チャットや読み上げには出ないので、性格の設定で話しながらの動作を指示できます。
tts.spoken
アプリがオンエアで読み上げました:配信を操作する人が読むことにしたチャットのメッセージ、または承認後の特典のテキスト。アプリ自身が読み上げ用の声(設定 > 音声)で話します。アクションは表示したり、キャラクターの口を動かしたりします。ペルソナ自身がチャットに書いた行は persona が true で届き、アプリがペルソナの声で読むのはペルソナが話す設定のときだけなので、ペルソナに声を付けるアクションが代わりに話します。
user(テキスト): 誰がしたか(プラットフォームでの表示名)。text(テキスト): 読み上げた内容。source(テキスト): どこから来たか:chatまたはreward。persona(はい/いいえ): その行がペルソナ自身のもの(ペルソナのアカウントがチャットに書いたもの)のとき true。
music.request
視聴者が特典かチャットのコマンド(設定 > 音楽)で Vovó の音楽プレイヤーに曲をリクエストし、その行方を伝えます:承認待ち、キュー入り、再生開始、破棄、または受け付けなかったことと理由。Vovó 自身はチャットに何も書きません。アクションがそこで答えたり、流れている曲を誰がリクエストしたか表示したりします。
user(テキスト): 誰がしたか(プラットフォームでの表示名)。text(テキスト): リクエストのために書いた内容。song(テキスト): 見つかった曲(曲名とアーティスト)。見つからなければ空です。state(テキスト): 行方:waiting、queued、playing、discarded、refusedのいずれか。why(テキスト): 受け付けなかった理由:none(一致する曲なし)、many(複数が同じように一致)、busy(すでに待ちかキューに 1 曲ある)、full(待ちが多すぎる)、queued(その曲はすでにキューにある)、again(最近流れた)。それ以外は空です。source(テキスト): リクエストの方法:rewardかchat。
sound.played
パッドのサウンドボタンが音を再生しました(複数ある場合は抽選で選んだもの)。
label(テキスト): ボタンの名前。button(数値): ボタンの ID。file(テキスト): 再生したファイルの名前(ボタンが抽選する場合はどれが選ばれたか)。seconds(数値): ファイルの長さ(秒、小数第 1 位まで)。Vovó がわからなかったときは 0。
video.played
パッドの動画ボタンがステージの上で動画を再生しました(複数ある場合は抽選で選んだもの)。
label(テキスト): ボタンの名前。button(数値): ボタンの ID。file(テキスト): 再生したファイルの名前(ボタンが抽選する場合はどれが選ばれたか)。seconds(数値): ファイルの長さ(秒、小数第 1 位まで)。Vovó がわからなかったときは 0。
remote.talk
誰かがスマートフォンから、トランシーバーのように話すボタンを押してオンエアで話しました。声は今、シーンのページから配信のすべてのオーバーレイで流れます。アクションは話している間、誰が話しているかを表示します。
name(テキスト): スマートフォン(配信者がペアリング時に付けた名前)。seconds(数値): 声の長さ(秒、小数第 1 位まで)。
call.started
アクションが求めた音声通話(vovo.call.start)が開きました。モデルはつながっていて無音を聞いており、vovo.call.answer まではモデルの声は再生しません。アクションを表示しているどのページもこれを受け取るので、それぞれが電話を鳴らし、そろって応答できます。
seconds(数値): 通話の上限(秒)。求めた時点から数えます。
call.answered
通話に応答しました(vovo.call.answer、どのページからでも)。マイクの音声がモデルに届き、モデルの声が配信で流れます。
call.text
通話で今話された内容を、話しながら数語ずつ文字にしたもの。両者が重なることもあります。字幕や書き起こし用で、声そのものはシーンのページが再生します。
who(テキスト):caller(マイクの前で配信を操作する人)またはmodel。text(テキスト): 語句。届いた順に前の語句へつなげます。start(数値): 通話内で始まった時刻(ミリ秒)。end(数値): 終わった時刻(ミリ秒)。
call.ended
通話が終わった、または開かなかったため、すべてのページで声が止まりました。
reason(テキスト):hangup(アクションまたはアプリ)、panic、limit(上限)、content(モデルのモデレーション)、それ以外は途切れた、または開かなかった通話。seconds(数値): 求めた時点からの長さ。
overlay.connected
有効なプロファイルのオーバーレイのページが接続しました(OBS がシーンを読み込んだ、または再読み込みした)。ページ内のアクションも、読み込み後に受け取ります。
scene(テキスト): シーンの名前。pages(数値): 今そのシーンを表示しているページの数。
JavaScript
vovo.on: イベントが起きるたびにlistenerを呼びます。アクションのトリガーにそのイベントが必要です。vovo.show:data-name="name"を付けたテンプレートを表示し、{fields}をeの値でプレーンテキストとして埋めます。vovo.emit: アニメーションの終わりなど、何かが起きたことをアプリに伝えます。トリガーにnameを持つアクションが受け取ります。アクションを表示する 2 つのページが同じイベントの処理中に発行しても 1 回になります。後から行う呼び出し(アニメーションが終わったときなど)は、vovo.chat.sendと同じくeventで応答先のイベントを示します。背後にイベントがない場合、5 秒以内の同じ名前と同じデータは 1 つのイベントになります。vovo.say:textを配信で読み上げます。声はプロファイルのもの、またはvoiceで指定したもの(名前の一部、pt-BRなどの言語、Piper のフォルダーにあるpiper:pt_BR-faber-mediumなどの声)です。このコンピューターで作れない声(Piper やその声がない、OpenAI のキーがない)はプロファイルの声で代わりに話し、アプリのコンソールにそう表示します。pitch(0.5〜2)は長さを変えずに高く・低くし、ring(0〜1)は金属的な響きを加え、smallは胸の響きを取ります。どの声からでもキャラクターの声を作れます。同じイベントの処理中に頼んできたページに対して、アプリは音声を 1 回だけ作り、どのページも同じファイルを再生します。eventはvovo.chat.sendと同じです。背後にイベントがない場合、5 秒以内の同じテキストと同じ声は 1 回だけ作ります。話し終わると解決します。vovo.draw:entriesから 1 つを、すべて同じ確率で抽選します。抽選するのはアプリなので公平で、操作ログに当選者が残ります。アクションを表示している 2 つのページ(OBS とプレビューウィンドウ)が同じイベントの処理中に抽選しても、答えは同じです(当選者 1 人、操作ログに抽選 1 回)。eventはvovo.chat.sendと同じです。vovo.chat.send: アプリ経由で配信のチャットにtextを書き込みます(1 行、500 文字まで)。配信者として、またはas: "persona"でペルソナ自身の Twitch アカウント(連携の Twitch の下)から書き込みます。そのアカウントが接続されていない間、そうした行は拒否され、代わりに配信者として書き込むこともありません。chat.send権限が必要で、アプリがペースを守ります(30 秒に 20 行、アクションごとに 1 秒 1 行。どのアカウントが書いても同じです)。それを超える行やパニック中の行は書かれず、Promise は reject されます。アクションを表示している 2 つのページが同じイベントの処理中に求めた内容は 1 回だけ書き込みます。リスナーが戻った後(awaitの後、タイマーの中)の呼び出しは、答えるイベントをeventに指定してください(リスナーが受け取ったオブジェクトそのもの)。そうしないと、アプリは 2 回目の呼び出しと区別できません。エディターのプレビューでは何も書き込まず、エディターがその行を表示します。vovo.pad.play: パッドのサウンドまたは動画ボタンを、ラベル(大文字と小文字は区別しません)で押します。実際に押したのと同じ動作です:特典やチャットコマンドから、配信者がパッドに置いた音を鳴らせます。sound.playedを待つアクションにも届きます。対象はサウンドと動画のボタンだけです。pad.play権限が必要です。パニック中は拒否し、操作ログにはアクションが押したと記録し、同じイベントを処理する 2 つのページでも押すのは 1 回です。そのボタンがなければ Promise は reject されます。eventはvovo.chat.sendと同じです。エディターのプレビューでは何も鳴らさず、何が鳴るかをエディターが表示します。vovo.pad.busy: このアクション自身のボタン(アクションまたはコントロールのボタン、ラベルで指定、大文字と小文字は区別しません)を、パッドでsecondsの間実行中として表示します。時間の経過とともにボタンの下部が減っていき、コンピューターとスマートフォンの両方に表示されるので、配信を操作する人はまだ続いているとわかります(再生中のサウンドボタンと同じです)。lock: trueなら、それまで押しても何もせず、コンソールに理由を表示します。0ですぐ終わります。アクションを表示しているページがある間だけ表示され、パニックで終わり、最長 15 分です。アクション自身のボタンにしか届かないため、権限は不要です。エディターのプレビューではパッドは変わらず、どう変わるかをエディターが表示します。vovo.pad.lock: このアクション自身のボタンを(vovo.pad.busyと同じくラベルで)ロックします。パッドとスマートフォンで薄く表示され、押してもコンソールにそう表示するだけで、アクションがfalseで解除するまで何もしません。進行中の処理ではなく、アクションの状態を表すためのものです(シーンの該当部分が非表示の間は意味のないボタンなど)。そのため減っていく表示はありません。しばらく続く処理にはvovo.pad.busyを使います。ロックはアクションを表示しているページがある間だけで、パニックで解除されます。アクションが再開したら、もう一度指定します。エディターのプレビューではパッドは変わらず、どう変わるかをエディターが表示します。vovo.obs.source: OBS のシーンにあるソースを、OBS での名前(大文字と小文字、アクセントは区別しません)で表示(true)または非表示(false)にします。onがなければ今の状態を切り替えます。obs.toggle権限が必要です。パニック中は拒否し、操作ログに記録し、同じイベントを処理する 2 つのページでも依頼は 1 回です。OBS に依頼した時点で Promise は解決します。OBS にない名前は、意図したと思われる名前と一緒にコンソールに表示します。eventはvovo.chat.sendと同じで、onを省いたときはその位置に置きます。エディターのプレビューでは何も変わらず、どう変わるかをエディターが表示します。vovo.obs.filter: OBS のソースのフィルターを、OBS での名前でオン(true)またはオフ(false)にします。onがなければ今の状態を切り替えます。権限とルールはvovo.obs.sourceと同じです。vovo.chat.parts: チャットイベントのメッセージを、ページに入れるノードにします。言葉はテキストとして(マークアップにはしません)、エモートは<img class="vovo-emote">(altにエモート名)として。部分がないメッセージはそのテキストです。vovo.webhook.send: プロファイルの Webhookname(「設定 > Webhook」で設定)に、dataを JSON(最大 16 KB)で送るようアプリに依頼します。アクションがアドレスを見ることも、ネットワークに出ることもありません。webhook権限が必要です。アプリがペースを守り(1 分に 30 回、アクションごとに 1 秒 1 回)、2 つのページが同時に求めたものは 1 回だけ送り、パニック中は何も呼び出しません。Webhook が 2xx を返すと Promise は解決し、それ以外は reject されます。eventはvovo.chat.sendと同じです。エディターのプレビューでは何も送らず、送る内容をエディターが表示します。vovo.screen.place:elementのある場所に、アクション自身の描画の下に共有画面を表示し(そのため要素とその背後はそこで透明にしておく必要があります)、要素の移動に合わせて追従します。nullで取り除きます。fitはcontain(全体、既定)かcover(場所を埋める)、radiusは角の丸み(ピクセル)です。backgroundは、形の違う映像の周りにcontainが残す余白を塗る色(#000000)で、指定しないとそこは透明のままになり、シーンの後ろにあるものが見えます。screen.show権限が必要です。vovo.camera.place: 配信者がアクションのカメラ設定のひとつで選んだカメラ(cameraはそのキー、省略すると最初のもの)を、elementのある場所に、アクション自身の描画の下に表示し(そのためその部分は透明にしておく必要があります)、要素の移動に合わせて追従します。nullで取り除きます。fitはcover(場所を埋める、既定)かcontain(全体)、radiusとbackgroundはvovo.screen.placeと同じ、mirrorは鏡のように表示します。カメラが開かれるのは、どこかのページが表示していて、配信者のカメラがオンで、パニックがオフの間だけです。表示されたかどうかはcameraイベントで知らせます。アクションが映像を見ることも、どのカメラかを知ることもありません。camera.show権限が必要です。vovo.media.play: Twitch のクリップ、Twitch の動画、YouTube の動画をリンクから公式プレーヤーで、vovo.media.placeで置いた場所(なければステージ全体)に音声付きで再生します。新しいものが来ると置き換わります。配信を操作する人だけが起動するアクションならすぐ再生し、それ以外のアクションは、視聴者の依頼かもしれないため、ここか許可されたスマートフォンで誰かが承認するまで待ちます。オンエアされると Promise は解決し、拒否・破棄されたとき、またはパニック中に求めたときは reject されます。secondsでその時間後に取り除きます(プレーヤーはクリップの終わりを知らないため)。eventはvovo.chat.sendと同じです。エディターのプレビューではそこで無音で再生します。media.play権限が必要です。vovo.media.place: クリップや動画を再生する場所:elementのある場所、アクション自身の描画の下(そのため要素とその背後はそこで透明にしておく必要があります)で、要素の移動に合わせて追従します。nullでステージ全体に戻ります。プレーヤーはその場所の中で動画の形を保ちます。radiusは角の丸み(ピクセル)です。vovo.media.stop: アクションのクリップや動画を、そのアクションを表示しているすべてのページのステージから取り除きます。vovo.call.start: オンエアで AI モデルとの音声通話を始めます。配信を操作する人がマイクに話し、モデルが声で答え、配信には両方が流れます。アプリが配信者の OpenAI キーで通話を開いて維持し、ページは声を再生するだけです。instructionsはモデルが誰でどう話すか、voiceはモデルの声の 1 つ、secondsは通話の上限(最大 300、既定値も 300)、backofficeはモデルが「システムへ」回した質問への答え、phoneは声を電話回線のように鳴らします。通話が開き、モデルが無音を聞いていて、まだ再生していない状態(call.started)で Promise は解決します。vovo.call.answerで応答してください。拒否されると reject されます。call権限が必要で、配信を操作する人が手で行った操作(パッドのボタン、ホットキー、コントロール、アクションのパネル)か、その人専用のアクションからしか始まりません。通話は秒単位で課金され、マイクの音声をモデルに送り、モデルの言葉を誰も読まずにオンエアするためです。通話は同時に 1 つ、パニックで切断・拒否し、エディターのプレビューでは通話しません。eventはvovo.chat.sendと同じです。vovo.call.answer: 通話に応答します。ここからマイクの音声がモデルに届き、モデルの声が配信で流れます。モデルは相手が話すのを待つので、先に話させるには、instructionで応答のしかたを、openingで最初の言葉を、contextで知っておくべきだが言わないことを、この順で送ります。どれか 1 つのページで応答すれば応答済みで、2 回目の応答は何もしません。vovo.call.tell: 通話中にモデルへ 1 行で伝えます。context(既定)は知っておくが言わないこと、instructionは従うこと、aloudは口に出すことです。同じイベントを処理する 2 つのページでも伝えるのは 1 回です。eventはvovo.chat.sendと同じです。vovo.call.end: 通話を切ります。すべてのページで声がすぐ止まり、続いてcall.endedが届きます。vovo.state: オーバーレイの再読み込みやアプリの再起動でも残るオブジェクト。最上位のキーは設定したときに保存されます。vovo.settings: アクションが宣言した設定(action.jsonのsettings)で選んだ値をキーごとに、選んでいないものはアクションの初期状態で:色は#RRGGBB、数値、true か false、選択肢、1 行、ファイルのアドレス(なければ null)、フォントファミリー、カメラは選ばれているかどうかを true か false で(どれかは知らせません)。コンピューターの「カスタマイズ」で選び、アクションからは選べません。変わったときはsettingsイベントで知らせます。
テンプレート
テンプレート内の {field} は、イベントのそのフィールドでプレーンテキストとして埋められます。
data-on:<template>に付けるもの:それを表示するイベント。そのイベントのフィールドで埋められます。data-name:<template>に付けるもの:JavaScript からvovo.showで表示するときの名前。data-seconds:<template>に付けるもの:消えるまでの時間。なければ表示したままです。data-vovo-<key>: ドキュメントのルートに付きます。オン/オフ、選択、カメラの設定ごとに、on/off(カメラは選ばれているかどうか)または選んだ選択肢が入り、html[data-vovo-side="右"] .chatのようなセレクターに使えます。
CSS
--vovo-accent: Vovó で選んだアクセントカラー。--vovo-<key>: アクションの各設定を CSS として:色、単位付きの数値(34px)、オン/オフやカメラが選ばれているかどうかは 1 か 0、引用符付きの選択肢・1 行・フォントファミリー、ファイルはurl(...)かnone。font-family: var(--vovo-font), sans-serif;
権限
アクションはマニフェストでこれらを求め、インストールする人が承認します。
chat.send: アプリ経由でチャンネルのチャットに書き込む:配信者として、またはペルソナ自身のアカウントから。media.play: 公式プレーヤーで配信にクリップや動画を流す。配信を操作する人以外の依頼は承認待ちになる。call: オンエアで AI モデルと音声通話。配信を操作する人だけが始められ、配信者の OpenAI キーで秒単位で課金。マイクの音声はモデルに送られ、モデルの言葉は誰も読まずに流れる。screen.show: 配信者が Vovó の共有ページから共有したものを配信に表示する。camera.show: 配信者が「カスタマイズ」でアクション用に選んだこのコンピューターのカメラを配信に表示する。映像をアクションに渡すことはありません。pad.play: パッドのサウンドと動画のボタンをラベルで再生する。obs.toggle: OBS でソースを表示/非表示にし、フィルターをオン/オフにする。webhook: プロファイルの送信 Webhook の 1 つを呼び出すようアプリに依頼する。