音声認識ソフトUTMOSv2をPCに入れてみる

 ***最新更新 2026年9月15日 22時00分***

FreeDVの評価で使用されたWhisperの次にUTMOSv2をPCに入れてみることにします。

UTMOS(UTokyo-SaruLab MOS prediction system)については以下のブログを参照ください。
https://jk1gpc.blogspot.com/2026/09/freedv_0435876116.html

Windowsに入れるかLinuxに入れるかですが、先にWindowsを試してみます。
--------   Windows よりも Linuxの方が良さそうです GPUはなくともOK-------

以下Pythonがインストールされていることを前提に進めます。
参考: https://jk1gpc.blogspot.com/2026/09/wisper-large-v3.html

1.専用フォルダーと仮想環境を作る。
Windowsターミナル MSマークを右クリック ターミナルを起動します。
以下の太字の部分をコピペ (コピーしてターミナルプロンプトにカーソルを置き右クリックします)

cd C:\
mkdir UTMOSv2
            *Windowsエクスプローラで作成しても可能
mkdir UTMOSv2\result  *同上

C:/UTMOSv2
python -m venv venv
venv\Scripts\activate

(venv) PS C:\UTMOSv2>  がでればOKです。

2. pipを更新する。

python -m pip install --upgrade pip setuptools wheel

3. UTMOSv2をインストールする。

pip install git+https://github.com/sarulab-speech/UTMOSv2.git

*Pipでは手順が複雑なので今回はgithubよりダウンロードします。
以下Pythonの仮想環境(venv)でも良いしなくても構いません。

cd C:\UTMOSv2

Invoke-WebRequest -Uri "https://github.com/sarulab-speech/UTMOSv2/archive/refs/heads/main.zip" -OutFile "UTMOSv2-main.zip"

Expand-Archive -Path "UTMOSv2-main.zip" -DestinationPath "source"

以下で見つかればOKです。
dir C:\UTMOSv2\source\UTMOSv2-main\inference.py

以下を入力します

cd C:\UTMOSv2\source\UTMOSv2-main
C:\UTMOSv2\venv\Scripts\Activate.ps1

必要なライブラリをインストールします。

python -m pip install -e ".[optional]"

*一旦Power Shellを閉じた場合には以下のように入れます。

cd C:\UTMOSv2\source\UTMOSv2-main
C:\UTMOSv2\venv\Scripts\Activate.ps1

4.  テストします。UTMOSは文字起こしは出来ません。

Whisperで使用したファイルをC:\UTMOSv2\audioに入れます。
結果(推定MOS値)はcvsファイルに出力されます。

重みづけファイルを入力します。
Get-Content .\utmosv2\utils\_download.py | Select-Object -Index (30..55)
*これが妥当かどうか要検証です

------ここでエラー発生です。-------------

Linuxの方が良いようですが、Windowsで続けます。
python -c "from utmosv2.utils._download import _UTMOSV2_CHACHE; print(_UTMOSV2_CHACHE)"

$utmosCache = python -c "from utmosv2.utils._download import _UTMOSV2_CHACHE; print(_UTMOSV2_CHACHE)"

$modelDir = Join-Path $utmosCache "models\fusion_stage3"

New-Item -ItemType Directory -Force -Path $modelDir

Invoke-WebRequest -Uri "https://huggingface.co/sarulab-speech/UTMOSv2/resolve/main/fold0_s42_best_model.pth" -OutFile (Join-Path $modelDir "fold0_s42_best_model.pth")

Get-ChildItem $modelDir

でfold0_s42_best_model.pthが表示されれば成功です。

notepad .\utmosv2\utils\_task_dependents\initializers.pyで initializers.pyを編集します。*WindowsでやってもOK

model.load_state_dict(torch.load(weight_path)) を探します。106行目にありました。

model.load_state_dict(torch.load(weight_path, map_location=device)) に変更して上書きします。

Select-String -Path .\utmosv2\utils\_task_dependents\initializers.py -Pattern "load_state_dict"  でmodel.load_state_dict(torch.load(weight_path, map_location=device)) となっていればOKです。

Windowsの場合これでもエラーです。

原因はWindowsのmultiprocessingです。UTMOSv2の既定値は--num_workers 4ですが、Windowsでは音声読み込み処理を複数プロセス化できず、cannot pickle 'module' objectになっています。

--num_workers 0  をオプションに追加します。

----------------------------------------------------
評価用の3つのファイルをC:\UTMOSv2\sourceに入れて以下を実行します。

*SSB
python inference.py --input_path "C:\UTMOSv2\source\3729-6852-0033_ssb_6db.wav" --out_path "C:\UTMOSv2\result\3729-6852-0033_ssb.csv" --fold 0 --num_workers 0

*RADE
python inference.py --input_path "C:\UTMOSv2\source\3729-6852-0033_rade_6dB.wav" --out_path "C:\UTMOSv2\result\3729-6852-0033_rade_6dB.csv" --fold 0 --num_workers 0

*オリジナル
python inference.py --input_path "C:\UTMOSv2\source\3729-6852-0033_clean.wav" --out_path "C:\UTMOSv2\result\3729-6852-0033_clean.csv" --fold 0 --num_workers 0

注意: UNEXPECTEDが表示されますが問題ありません。

-----------結果     ----------

結果 推定MOS値はCSVファイルに出力されます。

SSB:  1.82381772994995
RADE:  2.18330430984497
オリジナル: 3.65122485160827

---------------------------------

UTMOSv2をFreeDVの評価に使う時の注意点(Chat-GPTによる)

UTMOSv2は主に合成音声の自然性評価用に開発されたMOS予測モデルです。そのため、FreeDVのRADE、SSB、フェージング、無線雑音を含む音声に対する数値は、ITU-T P.800による実際の聴取MOSと一致するとは限りません。

FreeDVの比較に使う場合は、

  • 全音声を同じ音量にそろえる
  • 同じ文章・同じ話者を使う
  • WAVの先頭と末尾の無音条件をそろえる
  • 原音・RADE・SSBを同条件で評価する
  • MOSの絶対値より相対的な差を見る

という使い方が適切です。

** このUTMOSv2をFreeDV評価に使う事についてChat-GPTに聞いてみました。**

FreeDVに使った場合に分かること

UTMOSv2は、音声を入力すると、およそ1~5の予測MOSを出します。

  • 声が自然に聞こえるか
  • 音声に不自然な歪みがないか
  • 合成音声・ボコーダー音声として違和感がないか
  • スペクトル上に品質低下の特徴がないか

このため、RADE・Codec2・FARGANのようなニューラル音声処理による「声の自然さ」を比較する実験には一定の価値があります。

UTMOSv2だけでは分からないこと

評価対象UTMOSv2で評価できるか
声の自然さ比較的向いている
音声の歪み・不快感ある程度可能
言葉が正しく伝わったか評価できない
コールサインや数字の聞き取り評価できない
フェージングへの強さ未検証
無線雑音への強さ学習範囲外の可能性が高い
通信可能限界のSNRUTMOSv2だけでは決められない
日本人が感じる実際の音質必ず一致するとは限らない

例えば、RADE音声が人間には明瞭でも、ニューラル・ボコーダー特有の音にUTMOSv2が低い点を付ける可能性があります。反対に、声が滑らかでも単語が別の言葉に化けていれば、MOSは高いのに通信内容は間違っていることもあります。

VoiceMOS Challenge自身も、学習データと評価対象が異なる「ドメイン不一致」では、MOS予測モデルの一般化性能が低下することを指摘しています。VoiceMOS Challenge 2022

FreeDVでおすすめの評価構成

次の3種類を併用するのが適切です。

指標測る内容役割
UTMOSv2音声の自然さ・品質自動的な補助MOS
Whisper+CER発話内容の正確さ了解度・通信性能
P.800/P.808方式の聴取試験人間が感じる総合品質最終的な判断

つまり、

UTMOSv2 = どれくらい自然できれいか
CER     = どれくらい正しく伝わったか
聴取試験 = 人間には実際どう聞こえるか

と考えると分かりやすいです。

実験方法の提案

同じ原音から、次の音声を作ります。

  1. 原音
  2. RADE1
  3. RADE2
  4. FreeDV 700Dなど
  5. SSB
  6. 必要ならCodec2・FARGAN単体

さらに各方式について、例えば次の条件を用意します。

SNR:+10、+6、+3、0、-3 dB
チャネル:AWGN、MPP、実際のHF受信音

各条件で、

  • 10~20文章以上
  • 複数の男性・女性話者
  • 日本語の同一文章
  • 同じ録音レベル
  • 同じ前後無音時間
  • UTMOSv2を複数回実行して平均
  • Whisper large-v3でCER測定

とします。

結果は次のようにまとめると有効です。

方式SNRUTMOSv2CER  人間MOS
原音4.3 2%4.5
RADE  26 dB  3.7 8%3.9
RADE16 dB3.3 12%3.5
SSB6 dB2.8 25%2.9

この場合、UTMOSv2と人間MOSが同じ傾向になるかを確認できます。もし相関が高ければ、その実験条件の範囲ではUTMOSv2をFreeDV評価に利用できる可能性があります。

特に重要な注意点

UTMOSv2が出す数値を、正式な「ITU-T P.800 MOS」と表記してはいけません。
記載する場合は、

UTMOSv2による予測MOS(客観推定値)

または、

UTMOSv2 predicted MOS

とするのが適切です。

私ならFreeDVの評価では、UTMOSv2を単独の順位付けには使わず、**「UTMOSv2予測MOS+Whisperの日本語CER+少人数の聴取MOS」**の3本立てにします。とくにRADEとSSBの比較では、「きれいさ」と「情報が正しく伝わること」は別の性能だからです。


コメント

このブログの人気の投稿

WSJT-X Improved v2.8.0がリリースされました!

WWAコンテストって?