Labo › 検証ノート

音声合成

Irodori-TTS v4.1 の読み間違いを kana-whisper で自動検査する — 時刻の読み上げ 72 本で、標準版と MF 版を比べた

0 / 36標準版の読み間違い別の読みは 6 本
3 本MF 版の読み間違い約 3 倍速い(1 秒の音声を 0.19 秒)
0.16 秒1 本の書き起こしVRAM は最大 1.6GB
CONTENTS目次(9)
  1. 使ったもの
  2. 読ませた文と、正解の読み
  3. 手順 1: kana-whisper で書き起こす(ffmpeg なしで動かす)
  4. 手順 2: 正解と突き合わせる(長音をそろえる)
  5. 結果: 標準版は誤り 0、MF 版は誤り 3
  6. 書き起こしで見えた、読み以外のこと
  7. 測っていないこと
  8. まとめ
  9. 出典

この記事の結論

  • 音声合成の読み間違いは、kana-whisper(音声をカタカナで書き起こすモデル)で機械的に見つけられる。72 本の書き起こしは 1 本 0.16 秒で、PyTorch が確保した VRAM(GPU のメモリ)は最大 1.6GB だった。
  • Irodori-TTS v4.1-Small は、時刻の読み上げ 36 本で誤りが 0 本だった(「しちじ」を「ななじ」と読むような別の読みは 6 本)。
  • 生成の段数を 4 に縮めた MF 版は約 3 倍速い(1 秒の音声を 0.19 秒で作る)が、誤りが 3 本出た。「4時」を「むじき」、「7時」を「ひちじ」、「8分」を「はちぷん」と読んだ。

音声合成(TTS)で困るのは、読み間違いが聞かないと見つからないことです。とくに時刻や数字は、「4時(よじ)」「7時(しちじ)」「9時(くじ)」「1分(いっぷん)」「8分(はっぷん)」のように、数字の読みが前後で変わります。作る本数が増えると、全部を耳で確かめるのは大変です。

そこで、日本語の音声合成 Irodori-TTS v4.1 で時刻の読み上げを作り、kana-whisper で書き起こして、正解の読みと機械的に突き合わせました。数字は 2026年9月29日時点のものです。

使ったもの

項目内容
音声合成Irodori-TTS v4.1-Small(MIT ライセンス)と、それを MeanFlow という手法で少ない段数に縮めた v4.1-Small-MF。段数は既定の 40(標準版)と 4(MF 版)
声の作り方参考の音声は使わず、声の特徴を文章で指定(「落ち着いた二十代後半の女性。やさしく近い距離感で…」など 3 人分)。乱数の種は固定
読みの検査sbintuitions/kana-whisper(MIT ライセンス)。Whisper large-v3-turbo をもとに、日本語の音声をカタカナで書き起こすように作られたモデル。漢字の読みの正確さを測るベンチマーク(Joyo Kanji Yomi Benchmark)の部品として公開されている
機材GeForce RTX 5060 Ti 16GB・Windows 11
ソフトPython 3.10・PyTorch 2.10(CUDA 12.8)・transformers 5.12。Irodori-TTS は GitHub の一式を D ドライブに置き、uv で環境を作った(Windows 全体には何も入れていない)

読ませた文と、正解の読み

数字の読みが変わりやすい時刻を 12 文、3 人の声で読ませました(1 つの版で 36 本、2 つの版で 72 本)。正解の読みはカタカナで書き、辞書によって分かれる読みは「別の読み」として別に持ちます。

読ませた文正解の読み別の読み(誤りにしない)
午前0時です。ゴゼンレイジゴゼンゼロジ
午前4時です。ゴゼンヨジ—
午前7時です。ゴゼンシチジゴゼンナナジ
午前9時です。ゴゼンクジ—
1時1分です。イチジイップン—
6時6分です。ロクジロップン—
8時8分です。ハチジハップンハチジハチフン
10時10分です。ジュージジュップンジュージジップン
午後4時44分です。ゴゴヨジヨンジューヨンプンゴゴヨジヨンジューヨンフン
朝の4時です。もうすぐ夜が明けますよアサノヨジ—
朝の7時です。朝ごはん、食べましたか?アサノシチジアサノナナジ
9時になりました。今日もよろしくお願いしますねクジ—

後ろに文が続く 3 つは、時刻の部分だけを見る。

手順 1: kana-whisper で書き起こす(ffmpeg なしで動かす)

kana-whisper の説明では、transformers の pipeline に音声ファイルを渡す使い方が紹介されています。ただしこの使い方は、音声ファイルを読むのに ffmpeg などの別の道具を必要とし、ffmpeg を入れていない Windows では動きませんでした。そこで、wav は soundfile で読み、16kHz に直してから Whisper を直接呼びました。

import soundfile as sf, torch
from transformers import WhisperForConditionalGeneration, WhisperProcessor

MID = "sbintuitions/kana-whisper"
proc = WhisperProcessor.from_pretrained(MID)
model = WhisperForConditionalGeneration.from_pretrained(MID, torch_dtype=torch.float16).to("cuda").eval()

def load16k(path):
    x, sr = sf.read(path, dtype="float32")
    if x.ndim > 1:
        x = x.mean(axis=1)                       # ステレオは 1 本にまとめる
    if sr != 16000:                              # Whisper は 16kHz で受け取る
        t = torch.from_numpy(x)[None, None, :]
        n = int(round(len(x) * 16000 / sr))
        x = torch.nn.functional.interpolate(t, size=n, mode="linear", align_corners=False)[0, 0].numpy()
    return x

feats = proc(load16k("p04.wav"), sampling_rate=16000, return_tensors="pt").input_features
ids = model.generate(feats.to("cuda", torch.float16), language="ja", task="transcribe", max_new_tokens=200)
print(proc.batch_decode(ids, skip_special_tokens=True)[0])   # 例: ゴゼンヨジデス

モデルの読み込みに 4.7 秒、書き起こしは 1 本 0.16 秒(中央値)でした。PyTorch が確保した VRAM は最大 1,598MiB です。

手順 2: 正解と突き合わせる(長音をそろえる)

書き起こしをそのまま正解と比べると、正しく読めているものまで食い違います。kana-whisper は発音どおりに長音で書くからです。「れいじ」は「レージ」、「じゅう」は「ジュー」になります。正解と書き起こしの両方を、同じ規則で長音に直してから比べます。

import re

def norm(s):
    s = re.sub(r"[\s、。,.・!?!?「」…\-]", "", s)
    s = re.sub(r"([エケセテネヘメレゲゼデベペ])イ", r"\1ー", s)          # レイ → レー
    s = re.sub(r"([オコソトノホモヨロゴゾドボポョ])ウ", r"\1ー", s)      # ヨウ → ヨー
    s = re.sub(r"([ウクスツヌフムユルグズブプュ])ウ", r"\1ー", s)        # ジュウ → ジュー
    return s

def judge(expect, alt, heard):
    h = norm(heard)
    if norm(expect) in h:
        return "正"
    if alt and norm(alt) in h:
        return "別の読み"
    return "誤"

「正」「別の読み」「誤」の 3 つに分けるのが勘所です。「7時」を「ななじ」と読むのは、日常では普通に使われる読み方で、誤りと一緒に数えると、本当の誤りが埋もれます。

結果: 標準版は誤り 0、MF 版は誤り 3

版正別の読み誤1 本の生成1 秒の音声あたり
v4.1-Small(40 段)30601.64 秒0.60 秒
v4.1-Small-MF(4 段)29430.53 秒0.19 秒

各 36 本。生成の時間は中央値で、モデルの取得と読み込みを含む最初の 1 本を除く。音声の長さは 1 本 2.9 秒前後。2 つの版を同時に読み込んでも、PyTorch が確保した VRAM は最大 8,110MiB。2026年9月29日に測定。

MF 版の誤り 3 本は、次のとおりです。

読ませた文声書き起こし
午前4時です。1 人目ゴゼンムジキデス
朝の7時です。朝ごはん…1 人目アサノヒチジデス、アサゴハンタベマシタカ
8時8分です。3 人目ハチジ、ハチプンデス

「ひちじ」は「しちじ」の音が崩れたもので、「はちぷん」「むじき」は読みとして成り立っていません。別の読みは、両方の版で「8分=はちふん」「44分=よんじゅうよんふん」「7時=ななじ」でした。

MF 版は約 3 倍速い代わりに、読みが崩れることがあります。Irodori-TTS の説明でも、MF 版(4 段)の読みの正確さは、標準版(40 段)よりわずかに低いと報告されています(常用漢字の読みのベンチマーク〔Parakeet 版〕の正答率で 93.42% 対 92.76%)。速さが要る場面で MF 版を使うなら、こうした自動の検査を通して、誤りが出た文だけを作り直す、という使い方が現実的です。

書き起こしで見えた、読み以外のこと

kana-whisper は、読みだけでなく、文の前後に付いた声や言い直しも書き起こしました。1 文だけの 9 文(3 人分で 27 本)のうち、標準版で 8 本、MF 版で 7 本に、次のような余分な部分がありました。

  • 語尾のあとの声: 「ゴゼンシチジデス、エエー」「ハチジハチフンデス、ウン」
  • 言い直し・繰り返し: 「ゴゼンクジデス、ゴゼンクジデス」「ジュージ、ジュージジュップンデス」

余分な部分が出たのは、3 人のうち 1 人目と 3 人目の声だけでした。ただし、これが本当に音に入っているのか、Whisper が無音の部分に文字をあてた(書き起こしの側の誤り)のかは、人が聞いて確かめていません。書き起こしが正解より長いときは、その本数だけ耳で確かめる、という絞り込みには使えます。

測っていないこと

  • kana-whisper の判定が、人の耳の判定とどれだけ一致するか(見落とし・言い過ぎの割合)
  • 音の自然さや声の好み。今回の検査は読みだけを見ている
  • 時刻以外の文(人名・専門用語・文脈で読みが変わる漢字など)
  • ほかの音声合成や、GPU を使わない場合の速さ

まとめ

  • kana-whisper で書き起こして正解と突き合わせれば、読み間違いを機械的に拾える。1 本 0.16 秒・VRAM 最大 1.6GB(RTX 5060 Ti)
  • Windows では pipeline ではなく、soundfile で読んで Whisper を直接呼ぶと ffmpeg なしで動く
  • 突き合わせの前に長音をそろえ、「正」「別の読み」「誤」の 3 つに分ける
  • Irodori-TTS v4.1-Small は時刻 36 本で誤り 0。MF 版は約 3 倍速いが誤り 3 本(2026年9月29日時点)

出典

← 検証ノートの一覧へ

この記事は、手元の機材で行った測定をもとにした一般的な技術情報の提供を目的としており、特定の製品・ソフトウェアの購入や利用を推奨・勧誘するものではありません。数値は 2026年9月29日時点の測定で、モデルの版・設定・機材・読ませる文によって変わることがあります。