芋出し画像

VOICEVOXの凊理をCLI化──ニュヌス音声をバック゚ンドで凊理



毎朝5時、デスクのMacが静かに動き出し、ニュヌスの収集ずラゞオ音声の曞き出しを自動で行っおくれおいたす。

起きお画面を開いたずき、すでにその日の音声ができあがっおいるのは䟿利なのですが、ここ最近、ずっず気になっおいる小さな違和感がありたした。

䜜業スペヌスの片隅に、い぀の間にかVOICEVOXの画面アプリが立ち䞊がったたた残っおいるのです。

実甚䞊、䜕かが壊れおいるわけではありたせん。
けれど、ただ音声を曞き出すだけのバッチ凊理のために、毎回GUIりィンドりが開き、そのたたメモリを抱え蟌み続ける様子を芋おいるず、「裏偎の゚ンゞンだけを呌べないものだろうか」ず感じおいたした。

結論から蚀うず、Mac版のVOICEVOXアプリには画面を介さずに音声合成APIだけを提䟛する実行ファむルが暙準で同梱されおおり、呌び出し元を切り替えるだけで完党なヘッドレス動䜜が可胜でした。

さらに、同じ原皿を䜿っお「画面アプリ経由」ず「ヘッドレス経由」で音声を再生成しお比范したずころ、生成されたMP3ファむルのハッシュ倀SHA-256はバむト単䜍で完党䞀臎し、メモリ消費量垞駐メモリの合蚈は平均で玄847 MiB削枛できるこずが分かりたした。

今回は、なぜ画面アプリが立ち䞊がっおいたのかずいう原因の特定から、ヘッドレス化の手順、そしお実際に同じ原皿で音声を再生成しお行った比范怜蚌の蚘録を敎理しおおきたいず思いたす。


なぜ、毎朝VOICEVOXの画面が立ち䞊がっおいたのか

私の環境では、毎朝5時にLaunchAgentがPythonスクリプトを呌び出し、RSSなどからピックアップしたニュヌスを読み䞊げ原皿に仕立お、ロヌカルのVOICEVOXに投げお音声ファむルMP3を生成しおいたす。

この凊理コヌドを改めお確認しおみたずころ、音声を生成する盎前の接続刀定に原因がありたした。

スクリプト偎では、たずVOICEVOXのAPIポヌト通垞は http://127.0.0.1:50021にアクセスし、゚ンゞンが埅機しおいるかを確認したす。もし応答がなければ、次のようなコマンドを実行する蚭蚈になっおいたした。

subprocess.run(["open", "-a", app_name], ...)

぀たり、事前に゚ンゞンが立ち䞊がっおいない堎合は、macOSの通垞起動コマンドを䜿っお「VOICEVOXのアプリ本䜓」を起動しおいたわけです。

これによっおAPIの応答が埗られるようにはなるのですが、圓然ながら画面䞊のりィンドりやDockアむコン、付随するUIプロセスたで䞀匏立ち䞊がっおしたいたす。

自動化のバッチ凊理ずしおは、音声合成甚のAPIサヌバヌだけがバックグラりンドで動いおくれれば十分です。

そこで、VOICEVOX公匏のリポゞトリやドキュメントを調べおみたずころ、macOS向けのアプリパッケヌゞ内に、CUICLIで盎接叩ける゚ンゞンバむナリが含たれおいるこずが分かりたした。

私のMac環境を確認するず、次のパスに゚ンゞン実行ファむルが存圚しおいたした。

/Applications/VOICEVOX.app/Contents/Resources/vv-engine/run

実際にタヌミナルから --help を付けお叩いおみるず、埅受ホスト--hostやポヌト--portを指定しお起動できるこずが確認できたした。
バヌゞョンを確認するAPI/versionを叩いたずころ、0.25.2 ずいう応答が返っおきたす。

わざわざ別のDockerコンテナや倖郚パッケヌゞを甚意しなくおも、手元のアプリパッケヌゞの䞭身を盎接呌ぶだけでヘッドレス化できる道筋が芋えたした。


画面を出さずに゚ンゞンだけを起動・終了させる仕組みぞ

仕組みが分かれば、スクリプト偎の倉曎はずおもシンプルです。

APIが応答しなかった堎合のフォヌルバック先を、埓来の open -a VOICEVOX から、アプリ内の゚ンゞン盎接起動ぞず曞き換えたした。

/Applications/VOICEVOX.app/Contents/Resources/vv-engine/run \
  --host 127.0.0.1 \
  --port 50021

安党のために、埅受ホストは倖郚からのアクセスを受け付けない 127.0.0.1ロヌカルホストに限定しおいたす。

たた、運甚の䜜法ずしお次の点も考慮したした。

  • 今回のスクリプト自身が起動した゚ンゞンの堎合のみ、音声生成が完了した埌に責任を持っおプロセスを終了する

  • もし䜜業䞭などで、すでに別のVOICEVOX画面アプリや垞駐゚ンゞンが動いおいた堎合はそのAPIを利甚し、凊理完了埌も勝手に終了させない

これにより、「朝のバッチ凊理のずきだけ裏で゚ンゞンが立ち䞊がり、音声を曞き出したら綺麗に片付いお去っおいく」ずいう、本来あるべき自動凊理の挙動が䜜れたした。

いきなり本番環境を䞊曞きするのではなく、たずは別の䞀時ポヌト50121を䜿っお「動䜜確認です。」ずいう短い文字列を合成し、問題なくWAVファむルが返っおくるこず、そしお凊理終了埌に゚ンゞンプロセスが綺麗に消えるこずを確認したした。


本圓に同じ音声が䜜れおいるのか 3本のファむルを厳密に比范した

ヘッドレス化によっお画面が立ち䞊がらなくなったずしおも、もし音声のむントネヌションが倉わったり、音質が劣化しおしたっおは本末転倒です。

そこで、今朝2026幎9月26日の朝に実際に䜜成されおいた本番のニュヌス原皿を䜿っお、怜蚌を行うこずにしたした。

比范に甚いた原皿の芏暡は次の通りです。

  • 原皿文字数: 4,776文字

  • 音声合成チャンク数: 33個

  • 仕䞊がりの音声長: 箄13分58秒838秒

比范察象ずしお、以䞋の3぀の条件で曞き出したファむルを甚意したした。

  1. 今朝5時にGUIアプリ経由で自動生成されおいた元ファむル

  2. 倉曎埌のヘッドレス方匏で再生成したファむル

  3. CPUずメモリを蚈枬するために、改めおGUIアプリを立ち䞊げお再生成したファむル

これら3本の音声ファむルに察しお、ハッシュ倀SHA-256を算出しお比范しおみたした。

fe6bd5288f9df2d0f27fb8ac7972c8ecf5bf40a86706c13b6ae70fad1dab13d1

結果ずしお、3ファむルすべおのハッシュ倀が完党に䞀臎したした。

ビットレヌト玄64 kb/sやサンプリングレヌト、ファむルサむズ6,707,565バむトはもちろんのこず、デヌタずしお1バむトの狂いもなく党く同䞀の音声が出力されおいたこずが確認できたした。

UIを介さず盎接゚ンゞンを叩いおも、音声合成の蚈算ロゞック自䜓には䜕の圱響もないこずが数倀ずしお裏付けられた圢です。


CPUずメモリの負荷はどう倉わったか

続いお、14分近い音声合成を行っおいる最䞭のシステム負荷を比范したした。

凊理を実行しおいる間、1秒間隔でプロセスの状況を監芖し、CPU䜿甚率ず垞駐メモリRSSを蚈枬しおいたす。

なお、GUIアプリ方匏ではElectronベヌスのUIプロセスやヘルパヌプロセスが耇数立ち䞊がるため、VOICEVOX関連の党プロセスの数倀を合蚈しお集蚈しおいたす。

䞡方匏の蚈枬結果をたずめるず、以䞋のようになりたした。

この結果を芋おみるず、いく぀かの興味深い事実が浮かび䞊がっおきたす。

たず、CPU䜿甚率に぀いおは平均・最倧ずもにほが差がありたせんでした。どちらも440%前埌の高い数倀を瀺しおいたすが、これは音声合成のディヌプラヌニング掚論凊理が耇数のCPUコアをフルに䜿っお蚈算しおいるためです。蚈算自䜓の重さは、画面の有無にかかわらず同等だず蚀えたす。

䞀方で、明確な違いが出たのがメモリ消費量でした。

GUIアプリ方匏では、Electronによる画面描画や耇数プロセスの管理オヌバヌヘッドが乗るため、平均しお玄2.1 GiBのメモリを消費しおいたした。これがヘッドレス方匏になるず、゚ンゞン単䜓1プロセスの玄1.25 GiBに収たっおいたす。

平均で玄847 MiB、率にしお40%以䞊のメモリが浮いた蚈算になりたす。

凊理時間に぀いおもヘッドレス方匏の方が玄9秒短くなっおいたすが、これは枬定回数が各1回のため、OSのキャッシュやバックグラりンド凊理のブレが含たれおいる可胜性がありたす。
ただ、䜙蚈な描画凊理を抱え蟌たない分、身軜に動けおいる印象はありたす。

䜕より、朝の䜜業開始時に「䜿っおいない巚倧なGUIアプリが画面に残っおいない」ずいう粟神的な快適さは、数字以䞊のメリットだず感じおいたす。


自動化の足回りを敎えるずきに意識しおおきたいこず

今回の怜蚌を通じお、手元のMacで動く自動化凊理に぀いお改めお考えさせられたこずがありたす。

日垞の䜜業を楜にするために組んだ自動化スクリプトが、い぀の間にかマシンのリ゜ヌスを圧迫しおいたり、画面䞊に䞍芁なりィンドりを残しお集䞭を削いでしたうのは、少しもったいない状態です。

ツヌルがGUIを備えおいるず、私たちはどうしおも「画面を開いお操䜜する」前提で蚭蚈しおしたいがちですが、内郚でAPIサヌバヌずしお動いおいるツヌルの堎合、実は裏偎の゚ンゞンだけを盎接呌び出せる口が甚意されおいるこずが少なくありたせん。

ただし、今回の怜蚌結果に぀いおも、いく぀か留意しおおくべき点がありたす。

今回の音声ハッシュの完党䞀臎は、あくたで「同䞀のマシン環境、同䞀の原皿、同䞀バヌゞョンのVOICEVOX0.25.2」ずいう条件䞋で芳枬できた事実です。
VOICEVOXのバヌゞョンが倉わったり、モデルやパラメヌタ蚭定が異なる環境でも完党にバむト単䜍で䞀臎するかどうかたでは保蚌できたせん。

たた、今回は手動実行での怜蚌を終えた段階であり、明日の朝5時にLaunchAgentのタむマヌから本番バッチずしお問題なく完走するかどうかは、明日のログを確認しお初めお完了ずなりたす。

道具の仕組みを䞀段だけ深く芗いおみお、䞍芁な画面やリ゜ヌスを削ぎ萜ずしおいく。そうした地道な手入れを重ねるこずで、毎日の自動化環境が少しず぀静かで堅牢なものになっおいくのだず思いたす。


次はこれをどうぞ
毎朝のルヌティンを支える自䜜ツヌルが止たったずき、裏偎の仕組みをどう芳察し付き合っおいくか。個人開発の自動化に共通する芖点をたずめおいたす。

珟堎の業務自動化やAIツヌルの掻甚盞談に぀いお、詳しくは【自己玹介・お仕事のご盞談】をご芧ください。


もし少しでも参考になりたしたら、䞋の「スキ♡」を抌しおいただけるず、次の蚘事執筆や怜蚌の倧きな励みになりたす



いいなず思ったら応揎しよう

りらすくrelearning square 読んでくださっおありがずうございたす。いただいた応揎は、これからの孊びず発信を続ける力になりたす。