スキップしてメイン コンテンツに移動

スマホの通知を四国めたんに読み上げて貰いました(ボイボTTSって凄い!)


 私のGalaxy S24 Ultraは、VoiceVoxの力を借りて色んな通知音を四国めたんの音声にしています。VoiceVoxで生成した音声ファイルをアプリやアプリのカテゴリ別に通知音として設定しているだけなんですが、スマホを出さなくても何の通知なのかが分かるので凄く便利です。

Bluetoothヘッドフォン接続時には、LINEの通知内容も読み上げるようにしています。今はGalaxy Watch 6 Classicも使っているので、時計見れば何の通知なのかも内容も判っちゃうんですが、朝の満員電車じゃ腕を上げるのさえ難しいんですよ。

あんなに混んでる電車でバカみたいな事に一生懸命スマホ使ってる人が居るのには呆れ果てますね。 

そんなことはど~でもよくて、通知内容を読ませるのにMacroDroidを使っていますが、当然ながら読み上げる音声は内蔵のTTSなんです。そうですね、Googleアシスタントみたいな声です。特に不満はなかったんですが、通知音声みたいに四国めたんにできたら嬉しいなぁと思い続けていました。

 でね、


何かを調べていた時に、たまたまGeminiさんが教えてくれたアプリがありました。

このアプリは、スマホ版VoiceVoxですね!

えっ!こんな素晴らしいものを作ってくれた人が居るんですか!

アプリを起動すると、音声生成画面になります。右上からキャラクターを選択できます。

私は四国めたんのあまあまが一番のお気に入りです。

 


しかも、VoiceVoxと同じように話し方を設定できるんですよ!

 


イントネーションも設定できるし、


長さもできます。


その他の内容は利用規約や表示濃度ですね。

 


更に、この画面で生成した音声は、テキスト入力エリアの下にあるアイコンで、保存(左)やブックマーク(右)もできるんですよ!!!

ブックマークにはイントネーションなども含まれているようなので、VoiceVoxのプロジェクトと同じ感じですね。

 


私は使っていませんが、他にもソングプロジェクトやアラーム機能までついています。



設定からは、ユーザ辞書や画面に表示するキャラのイラスト設定もできます。


ユーザ辞書は正規表現も使えます。

私は、時刻表記の「hh:mm」を「hh時mm分」と読んでもらうための辞書を正規表現で設定しています。アルファベット文字が弱いみたいなので、今後辞書が増えていくんでしょうね。


ユーザ辞書の編集画面ではテストまであって、結果がすぐに判る親切設計です。

辞書にはイントネーションなどは設定できませんが、正直言って日本語って文脈でイントネーションが変わり過ぎる言語なので、辞書で対応するのは無理ですね。


辞書の設定画面以外に、置換のテスト画面もあります。

辞書に複数登録している場合などに便利ですね。使用された辞書項目まで表示されるんですよ!至れり尽くせりですね。


キャラの画像はイラスト設定から可能です。

 


キャラクター別&感情別に設定できます。凄い!


立ち絵(音声生成画面の後ろに表示されますね)と顔(ブックマークに表示されるようです)のファイルを選択できます。


立ち絵と顔を設定するとこうなります。


設定するファイルは、スマホの中に入れておく必要があります。私は、いつも通り無断で拝借しました・・・。 


設定のVoiceVoxファイルからは、ダウンロード済みの音声ファイルが確認できます。一つのファイルに複数のキャラクターが入っているんですね。一つのキャラクターでも感情別の全てが入っているわけでも無いんですね。 


正に熱望していたアプリなんですよ!本当に感謝感激です!

でも、


サブスクが少々高いんですよ!

Clipstudioのアップデートプランが、100円/月(1200円/年)だと考えると、もっと安くしてもらえないかなぁって思ってます。買い切りで2500円くらいならなぁ。


あ、そうそう、今回の話はボイボTTSを使って、スマホのテキスト読み上げ音声を四国めたんにする話です。

これは、ボイボTTSのおかげなんですが、至って簡単です。

スマホ設定のユーザ補助から


TalkBackを選択


設定を選択


音声のテキスト読み上げを選択


優先エンジンを、ボイボTTSにするだけでした。

 キャラクターの変更はボイボTTS側で行うことになります。



これだけで、スマホの音声読み上げが四国めたんになりました!

あ、そうそう、なんでこんなことしたかったかと言うと、スマホの通知を四国めたんに読み上げて貰いたかったんです。

今もMacroDroidで通知の読み上げをしていますが、この音声が四国めたんになったわけです。

 Yahoo!乗換案内の運行状況通知や、LINEの内容(Bluetoothヘッドフォン使用時だけですが)を読み上げて貰ってます。

で、最近になってGalaxyに最初から入っている天気予報アプリを復活させたんですが、このアプリが定期的に現在地のお天気情報を通知してくれるんです。しかも通知が簡潔なので気に入ってます。

アプリ画面は現在の天候が背景になっていたりしますが、 


通知がシンプルなんです。


この天気予報の 通知を読んでもらうマクロも使っているんですが、読み上げの際に物凄く気になる点があるんです!

一つ目は、"°"です。"度"ですね。Googleさんは読んでくれていたんですが、四国めたんさんは読んでくれませんでした。でも、これはボイボTTSの辞書に登録するだけで解決しました。本気で素晴らしいアプリですね!!


もう一つは、最高と最低の気温表示と、今後の予報(上の通知だと「夜間に雨が降ると予想されます」の部分)が連続して読み上げられて聞きづらいんです。

なので、最低気温を読んだ後に、少し間を空けてから今後の予報を読んでもらうようにマクロを変えました。

 


幸いにも天気予報の通知は 行数が固定なので、配列は使わずに、変数で分けることにしました。

マクロの文字列処理が、1行目と2行目を別の変数に入れる部分です。

で、一番下から2行が、1行目と2行目を読み上げてます。

 通知が出力されると、変数にはこんな内容が格納されます。

 


実際に通知が出力された場合の動画はコチラ

天気予報を更新した後にアプリを終了させているのは、フォアグラウンド時には読み上げないマクロにしてあるからです。 


2026.07.20

スマホのシステムTTSを ボイボTTSに置き換えて、四国めたんライフを満喫していますが、時々ボイボTTSがフリーズする事象が発生しました。

一時的なフリーズを起こしているようで、

MacroDroidのテキストを読み上げるアクション

で、発声されないことが時々ありました。 


ボイボTTSがスリープになっている(らしい状態)の対策

Geminiさんに相談したところ、しばらくスマホを使用していない時にボイボTTSがスリープ(メモリからも追い出された状態)になっていて、ボイボTTSが呼び戻されてから音声生成をしている間に、次の

テキストを読み上げるアクション

が呼び出されたりすることで、どちらかの発声が行われないのではないか?と言うことで、ボイボTTSをきちんと目覚めさせてから

テキストを読み上げるアクション

を実行する方法を考えました。
一番の方法は、実際に読み上げて貰いたいテキストを読み上げるアクションの前に、もう一つ無音になるような テキストを読み上げるアクションを実行し、そのアクションが完了するまで待機にするのが良さそうではないかとなり、無音を読ませる方法を考えました。

試したテキストと結果は以下です。
①NULL
 そもそも、テキストを読み上げるアクションのテキスト欄に何も入力しないと、アクションが登録できませんでした。

②半角(全角)スペース
 " "または" "のスペースだけのテキストで試したところ、ボイボTTSがフリーズを起こし、アクションが終了しませんでした。 

③音にならない記号
 ②と同じ結果でした。

④絵文字
 最初は②③と同じ結果で諦めかけたんですが、テキストを読み上げるアクションに、絵文字をスキップするオプションがあったので試してみました。
 なんと、問題なく無音でアクションも終了しました。 
 でも、もしかすると、絵文字しかテキスト欄に入れていないのに、絵文字をスキップさせたら、そもそもボイボTTSが呼び出されていないのでは?と思い、一度ボイボTTSを強制終了させてからアクションを実行したら、きちんとボイボTTSが稼動状態になりました。


これで、かなり発声されない事象が無くなったんですが、テキストが長い場合や、読み上げられない文字などが含まれる(通知を読ませるので内容はアプリ任せなんです)場合にも、発声されなかったり、酷い時にはマクロが終わらなくなることがあったので、もう一度Geminiさんに相談したところ、アプリの一時的なフリーズなどが発生しないようにすることは難しいが、フリーズが発生した場合にタイムアウトさせる方法はあるよってことで、 試してみました

 ボイボTTSのフリーズなどでマクロが終わらない対策

Geminiさんに相談したところ、テキストを読み上げるアクションでボイボTTSがフリーズすることがあるなら、テキストを読み上げるアクションを含むマクロを実行する際に、先頭(またはテキストを読み上げるアクションの前)に、nn秒待機後に呼び出し元のマクロを殺すアクションブロックを呼び出しておいて、マクロの最後(またはテキストを読み上げるアクションの後)で、アクションブロックを殺せば良いよと。

で、実際に作ろうとしたら、MacroDroidの仕様などで単純にはいきませんでしたが、何とか目的を達成できるアクションブロックができました。


① nn秒待機後に呼び出し元のマクロを殺すアクションブロック

 最初は「実行中のインスタンスを終了」が使えそうだと思ったんですが、これはアクションブロックそのものを終わらせるだけでした。

 で、呼び出し元のマクロ名を入力にして、マクロを終了させるようなアクションが無いか探したんですがありませんでした。

 そこで、「マクロの無効化」(これでマクロのインスタンスは終了)後に「マクロの有効化」をすることで、呼び出されたアクションブロックから呼び出し元のマクロを殺せるようになりました。

 さらに②に記載しているように、変数の値で条件判定し、呼び出し元のマクロを殺す(マクロがフリーズ)か殺さない(マクロが正常終了)かを分岐させることにしました。


②  ①のアクションブロックを殺すアクションブロック

 最初は、呼び出し元のマクロから「アクションブロックを終了」できないか探したんですが、そんなアクションがありませんでした。

 で、どうしたかと言うと、①のアクションブロックで呼び出し元のマクロを殺すロジックを、変数の値で条件判定させることにしました。 

 変数を設定するだけなので、呼び出し元のマクロから直接グローバル変数を設定すればいいのですが、変数を設定アクションよりも、「自殺解除」みたいな名前のアクションブロックにした方が、①とのペアが分かりやすいと思いアクションブロックにしました。


で、①で待機する時間ですが、これも①のアクションブロックの入力変数にすることで、

・マクロの最初に自殺予約を実行し、マクロの最後に自殺予約解除(長めの待機時間)

・テキストを読み上げるアクションを、自殺予約と自殺予約解除で挟む(短い待機時間)

の両方で使っても、待機時間が短すぎたり長すぎたりしないようにしました。


ボイボTTSの発生が次のメディア再生に追い越される対策

これは、対策と言うよりは妥協になりますが、

マクロの中で、

① 音声ファイルで見出しのような内容を再生

②テキストを読み上げるで通知の内容を発声

③音声ファイルで終了を再生

という流れのマクロをいくつか使っているんですが、 実行した際に、①③②の順序で音が出たり、①③だけ音が出たりすることがあったんです。

①③だけになるのは、ボイボTTSのフリーズ対策で解消されたんですが、

①③②は、②の音声生成をボイボTTSが処理している最中に、③の音声ファイル再生が実行されるのが原因でした。

というのも、ボイボTTSで音声生成をする処理が、スマホ標準のTTSよりも遅いんですね。なので、通知の内容を配列に格納して、ループで内容を読ませる場合に、「完了まで待機」のオプションをオンにすると、

音声生成→音声再生開始→音声再生完了→(次の)音声生成→音声再生開始→音声再生完了

の流れになって、間が開くんですよ。

なので、完了まで待機のオプションをオフにして、他の読み上げ中は終わるのを待つをオンにすることで、

音声生成→音声再生開始→音声再生完了

     音声生成         →音声再生開始→音声再生完了

の間が少なくなるようにしていました。

でも、今回色々と試すことで、この方法を使うと、ボイボTTSのフリーズにも繋がりやすいと分かりました。

上の流れを見ると分かりますが、音声再生開始は、前の完了を待ちますが、音声生成(MacroDroidがテキストを読み上げるアクションを実行)は連続して行われます。で、上の流れでも2つめの音声生成から音声再生開始に隙間があるんですが、MacroDroidとしては音声生成(ボイボTTSが処理を受け付け)すると、次のアクションを実行するので、音声生成がどんどんボイボTTSのバッファ(キュー?)に溜まってオーバーフローを起こすようでした。

で、完了まで待機をオンにすると、そもそもボイボTTSの音声再生開始(もしかすると音声再生完了)まで次のアクションを実行しないようで、ボイボTTSのバッファ(キュー?)の対流を減らせるようでした。

なので、今回は、読み上げ時に間が開くのを我慢し、安全策を取ることにして、完了まで待機オプションをオンにしました。

ただ、通知の内容を配列に取り込む際に、内容のテキストを分割して、一つのテキストを読み上げるアクションに引き渡すテキストの文字数を削減するようにはしています。


コメント