VOICEVOX や Style-Bert-VITS2 が起動しない

ローカルのWindows上で音声合成したいと思ってVOICEVOXやStyle-Bert-VITS2を試してたのですが、なんかあるとき起動しなくなりました。

VOICEVOXの場合は「エンジン起動に時間がかかっています。」の状態から進まなくなります。

Style-Bert-VITS2の場合はしばらく時間がたった後、エラーをはいて終了します。

.\Server.bat

C:>chcp 65001  1>NUL
Running server_fastapi.py
03-20 14:57:48 | DEBUG  | __init__.py:92 | try starting pyopenjtalk worker server
03-20 14:57:48 | DEBUG  | __init__.py:130 | pyopenjtalk worker server started
Error: Failed to update dictionary.
Traceback (most recent call last):
  File "C:\style_bert_vits2\nlp\japanese\user_dict\__init__.py", line 150, in update_dict
    pyopenjtalk.unset_user_dict()
  File "C:\style_bert_vits2\nlp\japanese\pyopenjtalk_worker\__init__.py", line 66, in unset_user_dict
    WORKER_CLIENT.dispatch_pyopenjtalk("unset_user_dict")
  File "C:\style_bert_vits2\nlp\japanese\pyopenjtalk_worker\worker_client.py", line 41, in dispatch_pyopenjtalk
    response = receive_data(self.sock)
               ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\style_bert_vits2\nlp\japanese\pyopenjtalk_worker\worker_common.py", line 42, in receive_data
    header = __receive_until(sock, HEADER_SIZE)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\style_bert_vits2\nlp\japanese\pyopenjtalk_worker\worker_common.py", line 33, in __receive_until
    part = sock.recv(size - len(data))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
TimeoutError: timed out
Traceback (most recent call last):
  File "C:\server_fastapi.py", line 52, in <module>
    update_dict()
  File "C:\style_bert_vits2\nlp\japanese\user_dict\__init__.py", line 159, in update_dict
    raise e
  File "C:\style_bert_vits2\nlp\japanese\user_dict\__init__.py", line 150, in update_dict
    pyopenjtalk.unset_user_dict()
  File "C:\style_bert_vits2\nlp\japanese\pyopenjtalk_worker\__init__.py", line 66, in unset_user_dict
    WORKER_CLIENT.dispatch_pyopenjtalk("unset_user_dict")
  File "C:\style_bert_vits2\nlp\japanese\pyopenjtalk_worker\worker_client.py", line 41, in dispatch_pyopenjtalk
    response = receive_data(self.sock)
               ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\style_bert_vits2\nlp\japanese\pyopenjtalk_worker\worker_common.py", line 42, in receive_data
    header = __receive_until(sock, HEADER_SIZE)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\style_bert_vits2\nlp\japanese\pyopenjtalk_worker\worker_common.py", line 33, in __receive_until
    part = sock.recv(size - len(data))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
TimeoutError: timed out
03-20 14:58:48 | DEBUG  | __init__.py:147 | pyopenjtalk worker server terminated
03-20 14:59:48 | ERROR  | __init__.py:157 | timed out
Press any key to continue . . .

結論から言うとOSのTCP輻輳制御プロバイダーがBottleneck Bandwidth and RTT (BBR2)になってると起動しないようです。

ダメなケース

netsh int tcp show supplemental

既定の TCP グローバル テンプレートは internet です

TCP 補足パラメーター
----------------------------------------------
最小 RTO (ミリ秒)                  : 300
初期輻輳ウィンドウ (MSS)     : 10
輻輳制御プロバイダー         : bbr2
輻輳ウィンドウの再起動の有効化    : disabled
遅延 ACK のタイムアウト (ミリ秒)          : 40
遅延 ACK 間隔               : 2
RACK の有効化                         : enabled
Tail Loss Probe の有効化              : enabled

そういえばBBR2試してみるか~って変えたんですよね。こんなところに影響があるとは思わなかった。発話エンジンのサーバーを起動するときのSocket周りでエラーになってそうだな?と思って気付けたんですけど原因よくわからない。

というわけでさくっと設定を戻すことに。(Template=~のところはshow supplementalで見れるテンプレートに合わせてください)

netsh int tcp set supplemental Template=Internet CongestionProvider=cubic
OK

netsh int tcp show supplemental

既定の TCP グローバル テンプレートは internet です

TCP 補足パラメーター
----------------------------------------------
最小 RTO (ミリ秒) : 300
初期輻輳ウィンドウ (MSS) : 10
輻輳制御プロバイダー : cubic
輻輳ウィンドウの再起動の有効化 : disabled
遅延 ACK のタイムアウト (ミリ秒) : 40
遅延 ACK 間隔 : 2
RACK の有効化 : enabled
Tail Loss Probe の有効化 : enabled

スッと起動するようになりました。
おわり。

コメントを残す