開発ブログ

BLOG

声で頼める操作を、拍子・音色・タイマーまで広げる

拍子・音色・タイマーなど 39 個の操作を、声で頼めるようにした。判定だけをするモデル Jev に「どの操作か」の項目を 1 つ足すだけで、呼び出しは毎回 1 回のまま済ませた。テンポを変える頼みで再生が始まる、「チューナー止めて」でメトロノームが止まる、といった取り違えの直し方と、203 個の言い方で試した結果を書く。

公開 2026年10月19日

メトロノームは声でも操作できますが、これまで頼めたのはテンポ・再生・停止・トラックの切り替えだけでした。拍子を変えたい、カウントインを足したい、チューナーを出したい、となると楽器を置いて画面を触ることになります。そこで、声で頼める操作を新たに 39 個増やしました。

メトロノームの画面。番号 1 の枠が 3 つに分かれた拍のメーター、番号 2 の枠が画面の下のパネルの「DONE『3拍子にして再生して』→ 拍子 3/4 → 再生」、番号 3 の枠が再生中の STOP のボタンを囲んでいる
「3拍子にして再生して」と頼んだところ
  1. 拍のメーターが 3 拍になった
  2. 聞き取った文字と、実行した操作を順に出す
  3. 拍子を変えてから再生を始めた

頼みを操作に読み替えるのは、判定だけをする安いモデル Jev です。Jev は文章を書かず、文と選択肢つきの問いを渡すと、どの選択肢に当たるかを確率つきで返します。アプリが使うのは、確率が 0.7 以上の答えだけです。なお「スタート」「止めて」のような短く決まった頼みは、Jev を待たずにアプリの中で決めています。

前の記事(声の頼みを Jev で操作に変え、練習中の独り言には反応させない)では、テンポ・再生・トラック・アプリへの頼みかどうか、の 4 つの問いを 1 回の呼び出しでまとめて聞きました。以下、この 1 つ 1 つの問いを「軸」と呼びます。操作ごとに「この操作をするか」の軸を 1 つずつ増やしていくと、軸は 40 を超えます。この記事では、軸をほとんど増やさずに頼める操作を増やした方法と、試して外れたところの直し方を書きます。

「どの操作か」を 1 つの問いにする

まず、これまでの操作も含めた全部の操作を 1 つの問いの選択肢(約 50 択)に並べて、どれか 1 つを選ばせてみました。51 個の言い方で 46 個が正解で、「どの操作か」の分類そのものはよく当たります。ただ、「あと 5 分」のような練習中の独り言を、タイマーの操作(確率 0.95。以下、かっこの数は Jev が返した確率)と取り違えました。また、1 つの問いでは、2 つの操作を一度に頼まれても片方しか選べません。前の記事で軸に分けたのも、このためでした。

そこで、前の 4 つの軸は残し、「それ以外の操作はどれか」を選ぶ軸(action)を 1 つだけ増やしました。独り言を操作として扱わないようにするのは、これまでどおり「アプリへの頼みか」の軸の役目です。

export const VOICE_ACTION_CRITERIA = {
  mute: "Mute or unmute the sound of the metronome.",
  tuner: "Open or close the tuner (to tune an instrument).",
  timeSignature: "Change the time signature (meter), like 3/4, 4/4 or 6/8.",
  sound: "Change the click sound, like wood block, beep or cowbell.",
  countIn: "Change the count-in (bars that are counted before starting).",
  // …ほかに 34 個
  none: "None of the above, or not a request.",
} as const;

「3拍子にして再生して」なら、再生の軸が start、action が timeSignature と返ります。実行は、止める → テンポ → トラック → ほかの操作 → 再生の順にしています。最初の 1 拍から 3 拍子で鳴らすためです。

値の問いは毎回まとめて聞く

拍子なら 3/4 か 6/8 か、音色ならどれか、という値も決める必要があります。Jev は選ぶだけで、文から値を取り出すことはできないため、値の候補を選択肢にした問いを作って選ばせます。「オンにして」「オフにして」「どちらとも言っていない」から選ぶオン・オフの問いも、値の問いの 1 つです。

action の答えを見てから値を聞くと、呼び出しが 2 回になります。値の問いを毎回すべて一緒に聞けば 1 回で済みますが、問いの数が増えます。そこで、問いの数で待ち時間が変わるかを測りました。

問いの数
待ち時間(中央値)
5 問
262ms
15 問
260ms

ほとんど変わらなかったので、値の問いはどの頼みでも毎回まとめて聞くことにしました。今は 4 つの軸と action、値の問い 12 問を合わせて 17 問で、入力は約 3,400 トークン、1 回 $0.00014 ほどです。

拍子の選択肢のキーには「/」を使わず、m6_8 のように書いて、あとで 6/8 に読み替えています。数(BPM・タイマーの分・トラックの番号)は、前の記事と同じく、Jev ではなくアプリのコードで文から抜き出します。「3拍子にして」の 3 をテンポと取り違えないよう、拍子・タイマーなど数を使う操作のときは、文の中の数が 1 つならテンポの軸の答えを使いません。

試して外れたところ

評価用に、言いそうな言い方を 148 個並べて Jev に答えさせると、軸ごとの答えがすべて正しかったのは 96 個でした。外れの多くは、独り言の文で action の軸だけがずれたものです。独り言は「アプリへの頼みか」の軸で除くので、実際には困りません。困ったのは次の外れです。

設定を変える頼みで、再生まで始まる

左右両方のスピーカーから鳴らす頼みの「両方から鳴らして」や、「8 分音符を鳴らして」を、再生の軸が start(0.90・0.93)と答えました。設定を変えたいだけなのに鳴り出すのは困ります。ほかの操作と一緒のときは、文に「再生」「スタート」などの言葉があるときだけ再生するようにしました。

action の答えが境目に届かなかったときも、ほかの操作の確率が 0.5 以上あれば同じ扱いにしています。「左から出して」が、左右の出力を決めきれずに「出して」の再生だけになったためです。

英語の play は「play eighth notes」のように設定の頼みにも出てくるので、再生の言葉として扱うのは「and play」「then play」の形だけです。

「チューナー止めて」で、メトロノームが止まる

「止めて」は、Jev を待たず、言い終えるより前にその場で止めるようにしています。そのため「チューナー止めて」「録音止めて」でも、メトロノームまで止まりました。文にチューナー・タイマー・録音などの名前があれば、止める言葉でもメトロノームは止めず、その機能のオン・オフとして扱います。Jev の再生の軸が stop と答えたときも同じです。

画面の下の帯。番号 1 の枠がパネルの「DONE『チューナー止めて』→ チューナー オフ」、番号 2 の枠が再生中のままの STOP のボタンを囲んでいる
再生中に「チューナー止めて」と頼んだところ
  1. チューナーを閉じる頼みとして実行した
  2. メトロノームは鳴ったまま

「ミュートして」のオン・オフが逆になる

「ミュートして」を、オン・オフの問いが off と答えました。音を消すので「オフ」と読んだようです。問いの文に「ミュートは、音を消すのがオン」と書き加えました。

「オンにして」「オフにして」の操作は、今の状態を見て、すでにそうなっていれば何もしません。オンとオフを切り替える操作をそのまま実行すると、すでにオンのときに「オンにして」と頼んだだけでオフになるためです。

「だんだん速くして」で、テンポが一度だけ上がる

テンポの軸が faster(1.00)と強く答え、action の答えのプログレッシブ(テンポが少しずつ変わるモード)は 0.69 で、境目の 0.7 に届きませんでした。文に「だんだん」「徐々に」「gradually」などがあれば、テンポの軸の答え(速く・遅く)を、テンポを上げていくか下げていくかの向きにして、プログレッシブをオンにします。

操作と none に答えが割れる

「トラックを追加して」は、addTrack が 0.59、none が 0.41 で、境目の 0.7 に届きませんでした。最初は none の説明に「テンポを変える・再生・停止・次や前のトラックも none」と書いていました。この説明に引っぱられたのかと考えて「None of the above, or not a request.」だけに縮めましたが、割れ方はほとんど変わりませんでした。

Jev は、このように 1 つの操作と none に 0.6 と 0.4 で割ることがあります。ほかの操作と迷っているわけではないので、none と割れているだけなら、境目を 0.5 に下げて決めることにしました。ただし、none を除いて 2 番目に高い操作が 0.15 以上あるときは、ほかの操作と迷っているとみて決めません。独り言はすでに「アプリへの頼みか」の軸で除いています。

すると今度は、「再生して」がリピートの切り替え(0.50)と判定され、実行されるようになりました。再生を「繰り返す」と読んだようです。アプリでは「再生して」は Jev を待たずに決めるので、実際には起きず、評価の中でだけ見つかった外れです。それでも、値もオン・オフも言っていない切り替えの操作は、0.5 で決める扱いから外し、これまでどおり 0.7 以上のときだけ実行するようにしています。

203 個の言い方で試した結果

評価用の言い方は 203 個まで増やし(うち 27 個は独り言)、軸ごとではなく、実行する操作(値まで)が頼みと同じかで比べるようにしました。2 回試すと、外れた言い方は 1〜2 個入れ替わりましたが、数はどちらも同じでした。

結果
正解
203 個中 190 個
違う操作をした
0 個
独り言を実行した
27 個中 0 個
待ち時間(中央値)
258ms・276ms

外れた 13 個は、どれも何もしなかったものです。「8分の6にして」は拍子(0.67)とガイドノートの細分(0.33)で割れ、英語の「select track 3」は none に寄りました。迷ったら何もしないので、言い直してもらえば済みます。

頼める操作と言い方の例は、マニュアルの「声で操作する」の章に表で載せました。表の例は、どれも評価で正しく実行できた言い方です。

マニュアルの「頼める操作の一覧」の節。番号 1 の枠が、リズムと音の操作と言い方の例を並べた表を囲んでいる
マニュアルの「頼める操作の一覧」
  1. 操作と言い方の例の表。リズムと音・テンポ・練習の道具・画面・開く操作の 5 つに分けて並べた

声では受け付けない操作

全画面表示・設定のリンクのコピー・ファイルからの設定の読み込みは、声では頼めません。ブラウザは、これらをボタンを押した直後にしか許さないので、声で頼まれたときには動かせません。

初期状態へのリセットとトラックの削除も、取り消せないので声では頼めないようにしています。テンポの変更を元に戻す(undo)は頼めますが、やり直す(redo)は頼めません。「テンポをやり直して」を、Jev が元に戻す頼みと取り違えたためです。

この記事を共有

X でポストはてなブックマーク