前にVoiSona Talkでの音声通知の記事を書いてから1ヶ月くらい実際に使ってみた。だいたい満足しているが、改善点をあえて挙げるならこの辺。
- 読み上げは聞こえたけど、早口だったりイントネーションが変だったりで「今なんて言った?」となる
- 完了なのか確認待ちなのか、声だけだと判別しきれないときがある
ChatGPTに相談したら、読み上げ用のテキストはこう書くと良いというコツをたくさん伝授してもらった。実際に組み込んでみたらかなり良くなった気がするので、やったことをまとめておく。
アクセントは指定できない
そもそもVoiSona TalkのAPIにはアクセント位置やモーラ単位の高低を指定する手段がない。速度・抑揚・ピッチみたいな全体にかかるパラメータは触れるけど、「この語だけ平板に読ませる」みたいなことはできない。
なので人間らしい読み上げにしたければ渡すテキストの書き方でやるしかない。 なるほどね。
読点「、」で間を作る
いちばん効いたのがこれかな。読点はそのまま短いポーズになるので、聞かせたい語の直前とか、文節の切れ目に打っていく。
before: infra。テスト失敗。テラフォームのプランで差分が想定外でした
after : infra。テスト失敗。テラフォームのプランで、想定外の差分が出ています
声で聞いてみるとたしかに、読点があると一回間が入って聞き取りやすくなる。読点ゼロの長文は息継ぎなしの早口になるので、そのまま聞き逃しにつながっていた。
ルールはこのくらいにしておいた。
- 20文字を超える文には最低1つ読点を入れる
- ただし打ちすぎるとブツ切れになるので1文に1〜2個まで
テキストで読む文章なら読点がなくても意味は取れるので、これはテキストのコミュニケーションとはまた違うテクニックだなと感心した。
体言止めをやめて、助詞でほどく
要約を短くしようとすると、つい名詞をつなげた書き方になる。文字で読むぶんには問題ないけど、読み上げると機械的な棒読みになって全然頭に入ってこない。
before: 認証処理リファクタ完了、テスト成功
after : 認証まわりのリファクタが終わり、テストも成功しました
文字数は増えるけど、聞くぶんには後者のほうが断然わかりやすい。省略してた助詞を戻して「です・ます」の話し言葉にするだけでもかなり変わる。1文は短く、要約全体で1〜2文までという感じにしている。
待ち系は疑問文で終える
承認待ちや追加指示待ちのときに平叙文で終わると、どうにも「報告」に聞こえてしまう。文末を疑問文にすると問いかけの抑揚がつくので、聞き流しにくくなった気がする。
before: infra。確認待ち。テラフォームのプラン内容の確認が必要です。
after : infra。確認待ち。テラフォームのプランを、このまま適用してよいですか?
before: Claude Code。追加指示待ち。仕様が曖昧なため確認が必要です。
after : Claude Code。追加指示待ち。仕様が曖昧です。どの案で進めますか?
Hook側が出す固定メッセージも同じ方針で書き換えた。
before: {project}。{tool}の承認待ち。
after : {project}。{tool}の、承認待ちです。
before: {project}。入力待ち。{question}
after : {project}。{question}。どうしますか?
before: {project}。通知です。
after : {project}。お知らせです。
「通知です」→「お知らせです」は完全に好みだけど、耳で聞くと後者のほうがしっくりくる。
カタカナ表記で読みを寄せる
英単語をカタカナで書かせるのは前回もやっていた(commit がそのままだと「シーオーエムアイティー」になる)。今回はもう一歩進めて、カタカナの書き方でアクセントと音の長さも寄せるようにした。
- 長音を明示する:
server→ サーバー - 詰まる音は促音で:
Redash→ リダッシュ - 平板に読ませたい語はひらがなも可:
todoist→ とぅーどぅーいすと
よく出てくる語は毎回カタカナで書かせるより、設定ファイルの置換辞書に登録しちゃったほうが早い。とはいえ辞書にない語は素通りするので、書く時点でもカタカナにしておく二段構えという感じ。
感情スタイルをイベント別に切り直した
前回は bashful(はにかみ)とか sad(しょんぼり)みたいな感情の名前でスタイルを持たせてた。これはこれで良かったんだけど、感情から選ぶと完了と確認待ちをどう分けるかが微妙になってくる。
なので、感情ではなく通知イベントごとのプロファイルとして定義し直した。
done(完了 / 成功): 少し速め・明るめ・抑揚やや強めerror(失敗 / エラー / 停止): 少し遅め・低め・悲しさは薄く混ぜるconfirm(確認 / 承認): ゆっくり・抑揚控えめask(指示待ち / 入力待ち): 問いかけ感・文末を上げるwaiting(待機中): 落ち着き・低め・音量控えめ
中身は単一の感情じゃなくて、複数の感情のブレンド(weights)にしてる。たとえば error は普通寄り7割に悲しさ3割。全振りにするとくどいんだけど、ちょっと混ぜるくらいだと「うまくいかなかったんだな」がちょうど伝わって良い。
スタイルの選択はこれまでどおり、要約の頭に入れた状態語(完了 / 失敗 / 確認…)から自動で決まるようにしてある。Claudeには状態語を正しく入れることだけ意識させて、テンションは考えさせない。
所感
読み上げるためのテキストは、読ませるための文章とはまるで作法が違うというのが今回一番の学びだった。
引き続きVoiSonaとの共同作業を楽しんでいこうと思う。