专为歌声设计的轻量化强制对齐工具,兼容非歌声对齐。基于SOFA优化,支持多种音频编码器。
mel
编码的ONNX版本,Hubert相关模型可能存在兼容性问题。
下表仅为同数据集下经验评分,不做严格参考。
encoder | mel | hubert-soft | cnhubert |
---|---|---|---|
encoder体积 | 0 | 360m | 360m |
预处理体积 44.1k 16bit为基准 | ~1.5x | ~2.3x | ~3x |
模型体积 | 默认参数13m | 同前 | 同前 |
最小编辑距离(标注风格影响,不等价于效果) | 0.012 | 0.09 | 0.075 |
标注风格 | 尽量长(包括发音末尾超短混响) | 尽量短(仅覆盖能识别最短发音部分) | 同前 |
channel | 128(同n_mels) | 256 | 768 |
model_path | 无 | /xxx/xxx.pt | xxx/cnhubert |
- 克隆仓库并安装依赖:
git clone https://github.com/your-repo/HubertFA.git conda create -n HFA python=3.10 -y conda activate HFA
- 去pytorch官网安装torch
- 安装其他python库
pip install -r requirements.txt
-
下载模型文件。你可以在本仓库discussion中找到onnx模型。
-
--language指定语种(zh ja en yue),--dictionary指定词典。默认字典为
opencpop-extension.txt
-
准备需要强制对齐的数据,放入一个文件夹中(默认放在
/segments
文件夹),格式如下segments/ ├── singer1/ │ ├── audio1.wav │ ├── audio1.lab # 录音文本(拼音/音素,空格隔开) └── singer2/ ├── audio2.wav └── audio2.lab
保证
.wav
文件和对应的.lab
在同一个文件夹即可。录音文本经过
g2p
模块转化为音素序列后,输入模型进行对齐。例如,默认情况下使用
DictionaryG2P
模块和opencpop-extension
词典时,加入录音文本的内容是:gan shou ting zai wo fa duan de zhi jian
,g2p
模块根据词典转化为音素序列g an sh ou t ing z ai w o f a d uan d e zh ir j ian
。其他g2p
模块的使用方法,参见g2p模块使用说明。 -
命令行推理
使用
python infer.py
进行推理。需要指定的参数:
--ckpt
:(必须指定)模型权重路径;--folder
:存放待对齐数据的文件夹(默认为segments
);--in_format
: 录音文本的文件后缀名(默认为lab
);--save_confidence
:输出置信度。--language
:指定语种,zh ja en yue(默认为zh
)。--dictionary
:字典文件(默认为dictionary/opencpop-extension.txt
);
python infer.py -c checkpoint_path -s segments_path -d dictionary_path ...
-
获取最终标注
最终的标注保存在文件夹中,文件夹的名称是你选择的标注格式,这个文件夹的位置和推理所用的wav文件处于同一个文件夹中。
- 使用自定义的g2p,而不是使用词典
-
参照上文进行环境配置。
把训练数据按以下格式放入
data
文件夹(也可按个人习惯):data/ ├── full_label/ # 完整标注 │ └── singer/ │ ├── wavs/.wav │ └── transcriptions.csv # 需含
ph_seq
和ph_dur
列 ├── weak_label/ # 弱标注(无时长) │ └── singer/ │ ├── wavs/.wav │ └── transcriptions.csv # 需含ph_seq
列 └── no_label/ # 无标注,仅wav关于
transcriptions.csv
的格式,参见:qiuqiao/SOFA#5其中:
transcriptions.csv
只需要和wavs
文件夹的相对位置正确即可;weak_label
中的transcriptions.csv
无需拥有ph_dur
这一个column
; -
修改配置(参考文件内注释)。
使用
make_data_config.py
自动扫描数据文件夹生成配置文件:python make_data_config.py \ --data_folder data/full_label \ # 数据集根目录 --language zh \ # 指定语言标识(zh/ja/en等) --output configs/datasets_zh.yaml # 指定输出文件名(可选)
-
按需修改
binarize_config.yaml
,然后执行python binarize.py --config/-c configs/binarize_config.yaml
; -
训练
python train.py --config/-c configs/train_config.yaml
-
训练可视化:
tensorboard --logdir=ckpt/
。
可通过在预测(强制对齐)标注与目标(人工)标注之间计算特定的客观评价指标(尤其是在k折交叉验证中)来评估模型性能。
以下指标受标注风格影响,并不是越低越好(相同数据集、encoder时,较低值可以考虑使用)。
- BoundaryEditRatio: 边界编辑比率,从预测的边界到目标边界的总移动距离。
- BoundaryEditRatioWeighted: 边界编辑加权距离,包括音素未对齐数量*0.1。
- VlabelerEditRatio10-20ms: 边界错误率,在给定的容差值下,位置错误的边界数占据目标边界总数的比例。
若要在特定的数据集上验证你的模型,请先运行推理以得到所有的预测标注。随后,你需要将预测标注与目标标注放置在不同的文件夹中,相对应的标注文件需要保持相同文件名、相同相对路径,并包含相同的音素序列(空白音素除外)。此脚本当前仅支持TextGrid格式。
运行以下命令:
python evaluate.py <PRED_DIR> <TARGET_DIR> -r
其中 PRED_DIR
是包含所有预测标注的目录,TARGET_DIR
是包含所有目标标注的目录。
可选项:
-r
,--recursive
: 递归对比子文件夹中的文件--ignore
: 忽略部分音素记号(默认值:AP,SP,<AP>,<SP>,,pau,cl
)