5分钟上手!F5-TTS语音合成质量评估全流程:从MOS测试到UTMOS自动评分

【免费下载链接】F5-TTS Official code for "F5-TTS: A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching" 【免费下载链接】F5-TTS 项目地址: https://gitcode.com/gh_mirrors/f5/F5-TTS

你是否还在为语音合成(Text-to-Speech, TTS)的质量评估烦恼?手动听评耗时耗力,结果主观性强?F5-TTS项目提供了一套完整的语音质量评估解决方案,从主观评分到客观指标,让你轻松掌握合成语音的真实质量。本文将带你一步步实现语音合成质量的主观评估(MOS测试)和客观评分(UTMOS),读完你将能够:

  • 理解MOS评分原理及F5-TTS的评估框架
  • 使用F5-TTS提供的工具进行UTMOS自动评分
  • 设计并实施专业的语音质量主观测试
  • 分析评估结果并优化合成模型

MOS评分:语音质量评估的黄金标准

MOS(Mean Opinion Score,平均意见得分)是评估语音质量最常用的主观方法,通过让听众对语音样本的自然度、清晰度等指标进行1-5分评分,取平均值作为最终结果。F5-TTS项目在src/f5_tts/eval/目录下提供了完整的评估工具链,支持从数据准备到结果分析的全流程。

MOS评分标准定义

分数 质量等级 听众评价
5分 Excellent(优秀) 语音非常清晰、自然,无任何可察觉的失真
4分 Good(良好) 语音清晰自然,有轻微失真但不影响理解
3分 Fair(一般) 语音可理解,有明显失真但不严重影响交流
2分 Poor(较差) 语音失真较严重,部分影响理解
1分 Bad(糟糕) 语音质量极差,难以理解

UTMOS自动评分:F5-TTS的客观评估工具

UTMOS(Universal Speech Quality Model)是一种基于深度学习的客观语音质量评估指标,能够自动预测MOS分数,减少主观评估的成本和偏差。F5-TTS提供了eval_utmos.py工具,实现了UTMOS评分的自动化计算。

UTMOS评分实现原理

UTMOS评分工具的核心代码位于eval_utmos.py,其工作流程如下:

  1. 加载预训练的UTMOS模型(使用torch.hub.load从GitHub加载)
  2. 遍历指定目录下的所有音频文件
  3. 对每个音频文件提取特征并计算UTMOS分数
  4. 将结果保存到JSONL文件,并计算平均分数

运行UTMOS评分工具

使用以下命令对合成语音文件进行UTMOS评分:

python src/f5_tts/eval/eval_utmos.py --audio_dir /path/to/your/audio/files --ext wav

工具会在音频目录下生成_utmos_results.jsonl文件,包含每个音频的UTMOS分数,最后一行是平均分数。示例输出:

{"wav": "basic_ref_en", "utmos": 4.2356}
{"wav": "basic_ref_zh", "utmos": 4.1289}

UTMOS: 4.1823

UTMOS工具核心代码解析

eval_utmos.py的核心函数如下:

def main():
    parser = argparse.ArgumentParser(description="UTMOS Evaluation")
    parser.add_argument("--audio_dir", type=str, required=True, help="Audio file path.")
    parser.add_argument("--ext", type=str, default="wav", help="Audio extension.")
    args = parser.parse_args()

    device = "cuda" if torch.cuda.is_available() else "xpu" if torch.xpu.is_available() else "cpu"

    predictor = torch.hub.load("tarepan/SpeechMOS:v1.2.0", "utmos22_strong", trust_repo=True)
    predictor = predictor.to(device)

    audio_paths = list(Path(args.audio_dir).rglob(f"*.{args.ext}"))
    utmos_score = 0

    utmos_result_path = Path(args.audio_dir) / "_utmos_results.jsonl"
    with open(utmos_result_path, "w", encoding="utf-8") as f:
        for audio_path in tqdm(audio_paths, desc="Processing"):
            wav, sr = librosa.load(audio_path, sr=None, mono=True)
            wav_tensor = torch.from_numpy(wav).to(device).unsqueeze(0)
            score = predictor(wav_tensor, sr)
            line = {}
            line["wav"], line["utmos"] = str(audio_path.stem), score.item()
            utmos_score += score.item()
            f.write(json.dumps(line, ensure_ascii=False) + "\n")
        avg_score = utmos_score / len(audio_paths) if len(audio_paths) > 0 else 0
        f.write(f"\nUTMOS: {avg_score:.4f}\n")

    print(f"UTMOS: {avg_score:.4f}")
    print(f"UTMOS results saved to {utmos_result_path}")

F5-TTS的评估数据集准备

为了确保评估结果的可靠性,需要准备高质量的评估数据集。F5-TTS在src/f5_tts/eval/目录下提供了多个数据集的处理工具,支持LibriSpeech、Seed-TTS测试集等。

数据集元信息解析工具

utils_eval.py提供了多个函数用于解析不同数据集的元信息:

  • get_seedtts_testset_metainfo: 解析Seed-TTS测试集元信息
  • get_librispeech_test_clean_metainfo: 解析LibriSpeech测试集元信息
  • get_inference_prompt: 生成推理所需的提示信息

以Seed-TTS测试集为例,元信息解析代码如下:

def get_seedtts_testset_metainfo(metalst):
    f = open(metalst)
    lines = f.readlines()
    f.close()
    metainfo = []
    for line in lines:
        if len(line.strip().split("|")) == 5:
            utt, prompt_text, prompt_wav, gt_text, gt_wav = line.strip().split("|")
        elif len(line.strip().split("|")) == 4:
            utt, prompt_text, prompt_wav, gt_text = line.strip().split("|")
            gt_wav = os.path.join(os.path.dirname(metalst), "wavs", utt + ".wav")
        if not os.path.isabs(prompt_wav):
            prompt_wav = os.path.join(os.path.dirname(metalst), prompt_wav)
        metainfo.append((utt, prompt_text, prompt_wav, gt_text, gt_wav))
    return metainfo

评估数据集目录结构

F5-TTS推荐的评估数据集目录结构如下:

data/
├── Emilia_ZH_EN_pinyin/
│   └── vocab.txt
└── librispeech_pc_test_clean_cross_sentence.lst

其中librispeech_pc_test_clean_cross_sentence.lst是LibriSpeech测试集的元信息文件,包含参考音频和文本的对应关系。

主观MOS测试设计与实施步骤

虽然UTMOS等客观指标很方便,但主观MOS测试仍然是评估语音质量的金标准。以下是使用F5-TTS进行专业MOS测试的完整流程:

1. 准备测试样本

使用F5-TTS的推理工具生成测试样本,推荐使用src/f5_tts/infer/infer_cli.pysrc/f5_tts/infer/infer_gradio.py生成不同参数配置下的合成语音。

示例配置文件可参考infer/examples/basic/basic.toml,包含中英文参考音频:

2. 设计测试方案

为确保评估结果的可靠性,测试方案应遵循以下原则:

  • 样本数量:每个测试条件至少包含20个不同内容的语音样本
  • 随机化:样本播放顺序应随机,避免顺序效应
  • 双盲测试:评估者不应知道样本的来源和合成条件
  • 参考样本:应包含已知质量的参考样本作为锚点

3. 实施MOS测试

使用专业的听力测试软件或在线平台(如Amazon Mechanical Turk)展示测试样本,让评估者根据评分标准进行打分。F5-TTS提供的utils_eval.py工具可帮助准备测试列表和后续结果分析。

4. 结果分析与报告

收集评分数据后,使用统计方法分析结果:

  • 计算每个样本的平均MOS分数和95%置信区间
  • 进行方差分析(ANOVA),检验不同合成条件的显著性差异
  • 计算评估者之间的一致性系数(ICC),检验评估可靠性

F5-TTS的评估工具链支持多种客观指标计算,如WER(词错误率)和相似度评分,这些指标可与MOS分数一起作为综合评估依据:

# WER评估实现(来自[utils_eval.py](https://link.gitcode.com/i/be76c2a875c958ddc9f1ee3304a62fee))
def run_asr_wer(args):
    rank, lang, test_set, ckpt_dir = args
    # ... 加载ASR模型 ...
    for gen_wav, prompt_wav, truth in tqdm(test_set):
        # ... 语音识别与WER计算 ...
        measures = compute_measures(truth, hypo)
        wer = measures["wer"]
        wer_results.append({
            "wav": Path(gen_wav).stem,
            "truth": raw_truth,
            "hypo": raw_hypo,
            "wer": wer,
        })
    return wer_results

F5-TTS评估工具链完整工作流

将上述步骤整合,F5-TTS评估工具链的完整工作流如下:

mermaid

评估工具链文件结构

F5-TTS的评估工具链主要包含在src/f5_tts/eval/目录下,核心文件如下:

文件名 功能描述
eval_utmos.py UTMOS自动评分工具
utils_eval.py 评估辅助函数,包括数据集解析、WER计算等
eval_librispeech_test_clean.py LibriSpeech测试集评估工具
eval_seedtts_testset.py Seed-TTS测试集评估工具
ecapa_tdnn.py ECAPA-TDNN模型,用于说话人相似度评估

总结与最佳实践

F5-TTS提供了全面的语音合成质量评估解决方案,结合主观MOS测试和客观UTMOS评分,帮助开发者全面了解合成语音的质量。以下是使用F5-TTS评估工具的最佳实践:

  1. 结合主观与客观评估:UTMOS等客观指标用于快速筛选和迭代,MOS主观测试用于最终验证
  2. 使用标准测试集:利用librispeech_pc_test_clean_cross_sentence.lst等标准测试集,确保评估结果的可比性
  3. 系统评估不同参数:使用不同配置文件(如F5TTS_Base.yamlF5TTS_Small.yaml)生成样本,评估模型大小对质量的影响
  4. 关注听众体验:除了技术指标,还应评估合成语音在实际应用场景中的表现,如故事叙述(infer/examples/multi/story.toml)等复杂场景

通过本文介绍的评估方法和工具,你可以系统地评估和优化F5-TTS模型的合成质量,为用户提供更自然、更流畅的语音体验。

附录:评估工具常用命令参考

# 安装依赖
pip install -r requirements.txt

# 运行UTMOS评分
python src/f5_tts/eval/eval_utmos.py --audio_dir ./generated_wavs --ext wav

# 运行LibriSpeech测试集评估
python src/f5_tts/eval/eval_librispeech_test_clean.py --metalst data/librispeech_pc_test_clean_cross_sentence.lst --gen_wav_dir ./generated_wavs

# 运行Seed-TTS测试集评估
python src/f5_tts/eval/eval_seedtts_testset.py --metalst data/seed_tts_testset.lst --gen_wav_dir ./generated_wavs

评估结果文件说明:

  • _utmos_results.jsonl: UTMOS评分结果
  • wer_results.json: WER评估结果
  • sim_results.json: 相似度评估结果

【免费下载链接】F5-TTS Official code for "F5-TTS: A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching" 【免费下载链接】F5-TTS 项目地址: https://gitcode.com/gh_mirrors/f5/F5-TTS

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐