From 5eb52f9c73ca1ceba804a6785d1b9f330d065ab9 Mon Sep 17 00:00:00 2001
From: 游雁 <zhifu.gzf@alibaba-inc.com>
Date: 星期一, 22 五月 2023 13:08:31 +0800
Subject: [PATCH] bugfix

---
 funasr/bin/build_trainer.py |  145 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 145 insertions(+), 0 deletions(-)

diff --git a/funasr/bin/build_trainer.py b/funasr/bin/build_trainer.py
new file mode 100644
index 0000000..94f7262
--- /dev/null
+++ b/funasr/bin/build_trainer.py
@@ -0,0 +1,145 @@
+import os
+
+import yaml
+
+
+def update_dct(fin_configs, root):
+    if root == {}:
+        return {}
+    for root_key, root_value in root.items():
+        if not isinstance(root[root_key], dict):
+            fin_configs[root_key] = root[root_key]
+        else:
+            if root_key in fin_configs.keys():
+                result = update_dct(fin_configs[root_key], root[root_key])
+                fin_configs[root_key] = result
+            else:
+                fin_configs[root_key] = root[root_key]
+    return fin_configs
+
+
+def parse_args(mode):
+    if mode == "asr":
+        from funasr.tasks.asr import ASRTask as ASRTask
+    elif mode == "paraformer":
+        from funasr.tasks.asr import ASRTaskParaformer as ASRTask
+    elif mode == "paraformer_vad_punc":
+        from funasr.tasks.asr import ASRTaskParaformer as ASRTask
+    elif mode == "uniasr":
+        from funasr.tasks.asr import ASRTaskUniASR as ASRTask
+    elif mode == "mfcca":
+        from funasr.tasks.asr import ASRTaskMFCCA as ASRTask
+    elif mode == "tp":
+        from funasr.tasks.asr import ASRTaskAligner as ASRTask
+    else:
+        raise ValueError("Unknown mode: {}".format(mode))
+    parser = ASRTask.get_parser()
+    args = parser.parse_args()
+    return args, ASRTask
+
+
+def build_trainer(modelscope_dict,
+                  data_dir,
+                  output_dir,
+                  train_set="train",
+                  dev_set="validation",
+                  distributed=False,
+                  dataset_type="small",
+                  batch_bins=None,
+                  max_epoch=None,
+                  optim=None,
+                  lr=None,
+                  scheduler=None,
+                  scheduler_conf=None,
+                  specaug=None,
+                  specaug_conf=None,
+                  param_dict=None,
+                  **kwargs):
+    mode = modelscope_dict['mode']
+    args, ASRTask = parse_args(mode=mode)
+    # ddp related
+    if args.local_rank is not None:
+        distributed = True
+    else:
+        distributed = False
+    args.local_rank = args.local_rank if args.local_rank is not None else 0
+    local_rank = args.local_rank
+    if "CUDA_VISIBLE_DEVICES" in os.environ.keys():
+        gpu_list = os.environ['CUDA_VISIBLE_DEVICES'].split(",")
+        os.environ['CUDA_VISIBLE_DEVICES'] = str(gpu_list[args.local_rank])
+    else:
+        os.environ['CUDA_VISIBLE_DEVICES'] = str(args.local_rank)
+
+    config = modelscope_dict['am_model_config']
+    finetune_config = modelscope_dict['finetune_config']
+    init_param = modelscope_dict['init_model']
+    cmvn_file = modelscope_dict['cmvn_file']
+    seg_dict_file = modelscope_dict['seg_dict']
+
+    # overwrite parameters
+    with open(config) as f:
+        configs = yaml.safe_load(f)
+    with open(finetune_config) as f:
+        finetune_configs = yaml.safe_load(f)
+        # set data_types
+        if dataset_type == "large":
+            finetune_configs["dataset_conf"]["data_types"] = "sound,text"
+    finetune_configs = update_dct(configs, finetune_configs)
+    for key, value in finetune_configs.items():
+        if hasattr(args, key):
+            setattr(args, key, value)
+
+    # prepare data
+    args.dataset_type = dataset_type
+    if args.dataset_type == "small":
+        args.train_data_path_and_name_and_type = [["{}/{}/wav.scp".format(data_dir, train_set), "speech", "sound"],
+                                                  ["{}/{}/text".format(data_dir, train_set), "text", "text"]]
+        args.valid_data_path_and_name_and_type = [["{}/{}/wav.scp".format(data_dir, dev_set), "speech", "sound"],
+                                                  ["{}/{}/text".format(data_dir, dev_set), "text", "text"]]
+    elif args.dataset_type == "large":
+        args.train_data_file = None
+        args.valid_data_file = None
+    else:
+        raise ValueError(f"Not supported dataset_type={args.dataset_type}")
+    args.init_param = [init_param]
+    args.cmvn_file = cmvn_file
+    if os.path.exists(seg_dict_file):
+        args.seg_dict_file = seg_dict_file
+    else:
+        args.seg_dict_file = None
+    args.data_dir = data_dir
+    args.train_set = train_set
+    args.dev_set = dev_set
+    args.output_dir = output_dir
+    args.gpu_id = args.local_rank
+    args.config = finetune_config
+    if optim is not None:
+        args.optim = optim
+    if lr is not None:
+        args.optim_conf["lr"] = lr
+    if scheduler is not None:
+        args.scheduler = scheduler
+    if scheduler_conf is not None:
+        args.scheduler_conf = scheduler_conf
+    if specaug is not None:
+        args.specaug = specaug
+    if specaug_conf is not None:
+        args.specaug_conf = specaug_conf
+    if max_epoch is not None:
+        args.max_epoch = max_epoch
+    if batch_bins is not None:
+        if args.dataset_type == "small":
+            args.batch_bins = batch_bins
+        elif args.dataset_type == "large":
+            args.dataset_conf["batch_conf"]["batch_size"] = batch_bins
+        else:
+            raise ValueError(f"Not supported dataset_type={args.dataset_type}")
+    if args.normalize in ["null", "none", "None"]:
+        args.normalize = None
+    if args.patience in ["null", "none", "None"]:
+        args.patience = None
+    args.local_rank = local_rank
+    args.distributed = distributed
+    ASRTask.finetune_args = args
+
+    return ASRTask

--
Gitblit v1.9.1