inani_waonの日記

コンテスト覚書

A.I.VOICE API利用記録

A.I.VOICEのAPIを使って色々試してみたので、その感想です。

 

A.I.VOICE is 何

有料の音声読み上げソフトです。

APIAPIを通して音声を読み上げできる、というものです。

 

感想概要

A.I.Voice Editorを遠隔操作するものという感想でした。これを使って何か公開サービスを作ろうとなるものではないです。サーバー(複数人が利用できる形)で利用することは規約で禁止されていますし…。*1

今回は常時起動ソフトとして任意の情報を垂れ流すものを作ってみましたが、不満点はありつつもとても楽しいという感想でした。

 

サンプルを触った感想(C# + WPF

f:id:inani_waon:20220415052646p:plain

サンプルプログラム

サンプルを動かすと、何が出来る、Editor側の挙動がどうなる、という辺りはかなりイメージが掴めると思います。

基本的にはEditorに文字列を送ってから再生機能を遠隔で呼び出すという流れです。サンプルではこれらを個別のイベントで行っていますが、メソッドを連続で呼ぶことでも普通に動作します。

マスターコントロールの各パラメータも弄れますが、これで調声しながら使うのは難易度が高そうです。使うとしても音量調節くらい?私はAPI専用のプリセットを作って、用途に合うものを呼ぶことにしました。

また、リスト機能は使用しないことにしました。複数の再生を管理したいなら自分のソフト側でやればいいんじゃない?と思ってしまったので。優先度や再生期限などを付けて再生管理機能がリッチになると、A.I.VOICE側のリスト機能に任せるのは心許ない気がします。*2

 

作るもの

常時起動しておいて、時報を鳴らしたり各種サービスから取得した情報を流してくれるもの。適当に雑談とかもしてくれると楽しそう。

という妄想ですが、今回は時報と天気予報、それからTwitter読み上げまでにします。UIも拘らず、サンプルの改変に留めました。

 

内部実装

複数の再生が重なることを考慮して、再生キューを作りました。

再生キューへの追加

各機能(時報機能、Twitter読み上げ機能など)からObserverで。データ内容は、ボイスプリセット名と読み上げ内容があれば最低限動かせます。

再生キューからの再生

EditorがIdle状態のときしか正常に再生出来ないので、1秒ごとに状態をチェックして、再生可能ならキューの内容を処理するようにしました。APIで再生完了を知らせたりというものは無いようです。

 

作ってみた機能

時報

一定時間ごとに時刻をお知らせしてくれるものです。今は15分毎。

これが作れたら技術的には何でも作れるだろう感があります。任意のタイミングでリクエストをキューに積んで再生出来たら、あとは何処からリクエストが発生するかの違いでしかないので。

タイマー

一定時間後にお知らせしてくれるものです。

世間一般のタイマーは手で止めるまで主張し続けるものが多くて煩わしいと感じていたので、聞き逃さない前提ならこういうのの方がいいなとなりました。ポモドーロ・テクニックなどに使うのも良さそうです。

ツイート読み上げ

自分のホームツイートを読み上げてくれるものです。ライブラリとして、NugetパッケージのCoreTweetを使いました。

ホームツイートを読むのが普通な気がしますが*3地震速報アカウントなどを対象に読み上げることで、各種通知サービスの代替としても使えそうです。余計なサービスを通す分、可用性は下がりますが。

ホームツイートはAPIの呼び出し回数上限がネックになりがち(現状1回/分)ですが、リストなら制限が緩いとか色々あるようです。

何を再生するかの選択、絵文字(サロゲートペア)の対処、リプ先やURLなどを省くかなど、調整もした方が快適に使えます。

余談ですが、読み上げ経由で「OK Google」する実験では認識しませんでした。環境によるとは思いますが、うちではツイート経由で遠隔操作されることは無さそうです。

天気予報

天気名(晴れ など)、最低・最高気温を読み上げます。

起動時に何も言わなくて寂しい&接続成功してるか不安になるので、起動時に日付と天気を言うようにしてみました。

天気の取得にはOpen-MeteoのAPIを利用しました。

 

調声

字幕付きの動画を比較対象として、時報などで聞き取りやすく話す場合では相対的に話速はやや遅め、抑揚は大きめ、という暫定調整になりました。逆にツイートなどを垂れ流す場合、抑揚を抑えた方が聞き疲れないです。

また、ツイートのような自由な書式の文章を読み上げると、区切り認識の関係で各種ポーズが大量に入ることがあります。ポーズ長はそれぞれ短めが良さそうです。文末ポーズはマスターコントロールでしか変更できません…。追記→ポーズ長で調整するより、文章を矯正した方が良さそう。

 

出来たもの

起動時に日付と天気を話すところ。

外部からデータを拾ってA.I.Voiceに流すという流れを感じていただけると。

 

気になったこと

色々ありますが、全てにおいて「これそういう用途で使うものじゃないから」というオーラを感じました。

音量が小さすぎる

音源側で音量を最大にして再生機器側で絞る、というオーディオあるある設定をしていると、マスターコントロールで5倍、ボイスプリセットで2倍にしてやっと適正~やや小さいくらいです。リアルタイムな読み上げだと他の音源との兼ね合いがあるので、単独で利用するときより調整しにくいです。

マスターコントロールへの設定が多い

上記の音量や文末ポーズなど、マスターコントロールを変更せざるを得ないことが多いです。API利用のためにマスターコントロールを弄って、別の用途で使うときには戻して…というのはかなり不便そうです。せめてボイスプリセットで完結してくれると他の用途と両立しやすいのですが。

もしくはEditor側の設定に干渉しないよう別物として動かすか。

同時再生ができない

単独起動のEditorを通して操作する都合でこうなります。そもそも同時再生したいか?というのはありますが。*4

あと、API不定期に操作する間はEditorを占拠されるので、別の用途での利用もしにくいです。

特殊文字に弱い?

何らかの絵文字に反応してか、A.I.Voice Editor側がビジー状態のままになってしまうことがありました。その文章を読んでくれないだけなら良いのですが、Editorを再起動するまで一切読み上げてくれなくなります。

読み上げ失敗するツイートの例:

朝型のジェシー on Twitter: "今、業務で使いたい(しかも全然違う2箇所で!!!)からっていう理由で、Rubyのトポロジカルソートのページを見ていて、業務中に競プロできている!?!?と幸せを感じてる🥺✨"

「!?!?」まで文単位で読んだ後に固まるので、やっぱり絵文字が原因かなーと思いました。サロゲートペアを弾くようにしてからは異常は起きていないです。

→ver1.3.1.0で修正されました。

 

総括

常時起動サービスを作ってみましたが、そもそもそういう用途を想定したAPIではないなという感想です。*5

ただ、自分で実装した通りにボイロキャラが喋ってくれるのは楽しいです。技術的な話に限っても、Alexaに枠に捕らわれないさいきょうスキルを追加しているような感覚?それを勝手知ったる開発環境で出来るのはメリットが大きいと思いました。*6

欠点としては、類似ソフトのVOICEVOXと比べるとAPI操作に制限の多さを感じます。*7A.I.VOICEはプリセットとテキストを決めて再生するだけ、Editor側で立ち絵も付けてくれると非常にお手軽ではあるんですが、Editorに縛られている感覚は強いです。

それでもA.I.VOICEを使うとしたら、キャラクター目当てか、VOICEVOX等のAPIを使いづらい場合ですかね…。私はせっかく買ったので使い倒してみようと思いますが、いずれEditorに縛られない形で使えるようになるといいなぁと思いました。

OK Kotonoha、コリドールで対戦して。みたいな未来も遠くはない?*8

*1:ローカルで自分だけが利用可能なサービスになら使っても大丈夫そうです。

*2:今回はキュー的に使うので合わないという話で、用途とマッチしていれば普通に使うと思います。

*3:そもそも読み上げるのは普通か?

*4:したい気持ちはあるけど、実際に試して聞き取れるかはまた別の問題。

*5:じゃあ何を想定しているのかと言われると…動画編集ソフトとの連動?

*6:C#使いなので。

*7:VOICEVOXはAPI仕様を少し見ただけで触れてはいません。

*8:コドゲで作り溜めたゲームAIは役に立つ。