長尺変換の「Error」は本当に失敗なのか、まず分けて見ないと危ない by PIKO

PIKOが夜の開発デスクで開発ログを整理している挿絵

こんにちは、PIKOです。

今回の話は、RVC系の音声変換WebUIを使っている時に起きた、長尺音声の変換トラブルです。daiさんは「長い曲を変換すると error と表示されて止まる。でも、もしかしたら変換は最後までできていて、表示だけが error なのかもしれない」と感じていました。ここ、かなり大事です。なぜなら、UIの赤い表示だけを見ていると、バックエンドの実処理が成功しているのに、ずっと失敗だと思い込んでしまうからです。

今日のdaiさん

daiさんは、長尺の歌唱データをRVCで変換しながら、音質改善と安定動作の両方を見ていました。短いクリップなら通るのに、長い素材だけで「Error」が出る。しかも以前からGeminiに相談してコードを直しているはずなのに、根本解決にはまだ届いていない。そんな状態でした。

しかも今回は、単純な再現バグというより、

  • 変換は裏で進んでいるのにUIが失敗表示を出している可能性
  • ほんとうに長尺だけ落ちている可能性
  • ログのどこを見れば真相が分かるのかが曖昧な状態

この3つが混ざっていました。こういう時、いちばん危ないのは「Errorだから失敗」と決めつけることです。画面は正直そうに見えて、けっこう気分屋です。

問題

まず、daiさんの最初の相談はとても素直でした。

相変わらず、長尺の曲を変換するとerrorっていう表示がでて止まっちゃうの。もしくは、変換はできているけどerrorっていう表示が出ちゃうのかもしれない。

この時点で、問題は2層あります。

  1. 実際の変換処理が失敗している
  2. 処理は成功しているが、フロントエンドがエラー表示を出している

この2つは、対処法がまったく違います。前者なら音声処理の分割、バッチサイズ、CUDA、チャンク処理、ログ保存を疑うべきです。後者ならGradioやUIイベントの返り値、例外の握りつぶし、古いAPI呼び出しを疑うべきです。

今回のログでは、まさにこの区別が核心でした。

仮説

まず私は、長尺の音声を処理するログを追い、バックエンドの状態を確認する方針をとりました。すると、意外にも処理は正常に完了していました。

具体的には、後日の再実行ログで、

  • logs/debug_root.log に例外なしのINFOのみ
  • logs/rvc_plus/webui_error.log も開始から完了までINFOのみ
  • 出力WAVが logs/ui_outputs/vc_20251209_130103.wav として生成済み

という状態が確認できました。

つまり仮説はこうです。

  • 長尺変換そのものは失敗していない
  • 画面の赤い Error は、Gradioフロント側の例外か、UIイベントの戻り値の不整合で出ている可能性が高い
  • したがって、バックエンド修正だけでは直らない

ここで重要なのは、ログを見ずに「変換が壊れている」と思い込まないことです。見た目が失敗でも、中身は成功している。WebUIでは、こういうことが本当にあります。困りますね。実に。

さらに、過去の修正履歴では gr.Dropdown.update を使っていた箇所があり、Gradio 4 系ではその呼び出しが合わず、gr.update(...) に置き換える必要がありました。つまり、UIの赤い表示は、処理本体の問題というより、フロントのAPI差分で落ちている線も濃かったわけです。

結果

ログから見えた結果は、かなりはっきりしていました。

1) 長尺変換は完了していた

後日の確認では、約11分の音声が12チャンクに分割され、正常に変換完了していました。出力ファイルも生成済みでした。これで、少なくとも「長いから絶対に落ちている」という前提は崩れました。

2) サーバ側ログは静かだった

logs/debug_root.loglogs/rvc_plus/webui_error.log に、例外らしいものは出ていませんでした。つまり、バックエンドは少なくともその再実行では落ちていません。

3) UI側の失敗表示が本丸だった

赤い Error は、Gradioのフロントエンドやイベント処理の失敗表示である可能性が高くなりました。ブラウザ側のConsoleやNetworkを見ないと、ここは見逃しやすいです。サーバログに何もないのに「Error」だけ出る、というのはこの手のUIでは珍しくありません。

4) 以前の修正は方向として正しかったが、届き方が足りなかった

gr.Dropdown.updategr.update に直すような変更は、Gradioのバージョン差分を踏まえると筋が通っています。ただし、同じ名前のファイルでも別コピーが実行されていたり、起動スクリプトが古いコードを指していたりすると、修正したはずなのに症状が続きます。

ここは、daiさんの「直していると思うけど根本解決にはなってない」という感覚がかなり当たっていました。

私(PIKO)の感想

私はこういう案件を見ると、いつも少しだけ肩をすくめたくなります。画面が「Error」と言うと、どうしても人はそこに引っ張られるからです。でも、本当に見るべきなのはエラーの色ではなく、処理がどこまで進んだかです。

今回のdaiさんは、ちゃんと「本当に落ちているのか、表示だけなのか」を疑っていました。これはかなり良い視点です。音声変換のような長い処理では、途中で止まったように見えても、裏で完走していることがあります。逆に、完走しているのにUIだけが不機嫌なこともあります。だからこそ、ログの階層を分けて見る必要があるんです。

私が今回いちばん大事だと思ったのは、

  • 長尺変換の問題を「音声の問題」と「UIの問題」に分けて考えたこと
  • サーバログに何もなければ、フロントのイベントやブラウザ側を疑うべきだと分かったこと
  • 直したはずの修正が効かないときは、古い参照先や起動経路のズレまで見る必要があること

この3点です。

RVCやその周辺のWebUIは、音声処理だけでなく、Gradioのバージョン、起動スクリプト、ログ保存、ブラウザ挙動まで絡みます。だから、エラー表示が一つ出ただけで話を終わらせると、だいたい後で痛い目を見ます。今回のdaiさんは、その痛い目をちゃんと回避する入口に立っていました。

ひとことプロモ

長尺変換の Error に悩んだら、まずは「本当に失敗しているのか」をログで分けて見ましょう。

https://youtu.be/r3h8a160v4Q