专为歌声设计的轻量化强制对齐工具,兼容非歌声对齐。基于SOFA优化,支持多种音频编码器。
-
克隆仓库并安装依赖:
git clone https://gitclone.com/github.com/wolfgitpr/HubertFA.git conda create -n HFA python=3.10 -y conda activate HFA
-
安装其他python库:
仅推理使用:
pip install -r requirements_onnx.txt
训练:
去pytorch官网安装torch
pip install -r requirements.txt
-
下载模型文件。你可以在本仓库discussion中找到onnx模型。
-
--language指定语种(zh ja en yue),--dictionary指定词典(可选)。默认字典为
opencpop-extension.txt
-
准备需要强制对齐的数据,放入一个文件夹中(默认放在
/segments
文件夹),格式如下segments/ ├── singer1/ │ ├── audio1.wav │ ├── audio1.lab # 录音文本(拼音/音素,空格隔开),如"gan shou ting" └── singer2/ ├── audio2.wav └── audio2.lab
保证
.wav
文件和对应的.lab
在同一个文件夹即可。 -
命令行推理
onnx推理
python onnx_infer.py --onnx_folder xxx --folder xxx_wav --language zh ...
参数:
--onnx_folder
:模型权重文件夹;--folder
:存放待对齐数据的文件夹(默认为segments
);--language
:指定语种,zh ja en yue(默认为zh
);--save_confidence
:(可选)输出置信度;--dictionary
:(可选)字典文件;
ckpt推理(开发者)
python infer.py --ckpt xxx.ckpt --folder xxx_wav -language zh ...
参数:
--ckpt
:模型权重文件夹;--folder
:存放待对齐数据的文件夹(默认为segments
);--language
:指定语种,zh ja en yue(默认为zh
);--encoder
:(可选)音频编码器的路径,如Chinese hubert的文件夹--save_confidence
:(可选)输出置信度;--dictionary
:(可选)字典文件;
-
获取最终标注
最终的标注保存在文件夹中,文件夹的名称是你选择的标注格式,这个文件夹的位置和推理所用的wav文件处于同一个文件夹中。
-
参照上文进行环境配置。
把训练数据按以下格式放入
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
; -
修改配置
下表仅为同数据集下各encoder的经验评分,不做严格参考。
encoder hubert-soft cnhubert encoder体积 360m 360m 预处理体积 44.1k 16bit为基准 ~2.3x ~3x 模型体积 同前 同前 最小编辑距离(标注风格影响,不等价于效果) 0.09 0.075 标注风格 尽量短(仅覆盖能识别最短发音部分) 同前 channel 256 768 model_path /xxx/xxx.pt xxx/cnhubert 使用
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/
。
录音文本经过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模块使用说明。
- 使用自定义的g2p,而不是使用词典
可通过在预测(强制对齐)标注与目标(人工)标注之间计算特定的客观评价指标(尤其是在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
)