kantts个性化自动化训练

官网的都是手动训练,我做了一个自动化训练,执行一下,然后全部就能训练完。

说明:

audio是存放原始音频的位置,auto_train_main是核心自动化代码。

auto_train_main代码:

# -*- coding: utf-8 -*-
import string
import random
import requests
import pymysql
import sys
import os
import shutil
import subprocessimport paramiko
#-1代表错误,0代表警告提示,1代表执行成功
from run import slicer_fn
from run_auto_label import training_model
from basemodel_weitiao import weitiaodef con_mysql():conn = pymysql.connect(host="xxx",user="xxx",password="xxx",port=xx,db="xx",charset="utf8")return conn# 查询,是否有正在执行的任务
def get_task(conn, user_id, audio_url):cursor = conn.cursor()# 是否有空的机器可以训练,以后改队列sql = "SELECT * FROM kantts_auto_train_task where status=1"cursor.execute(sql)results = cursor.fetchall()  # 获取所有查询结果if len(results) != 0:print("warn:【0.获取task警告】:目前机器正在被人训练...请稍后在来")error_msg = "warn:【0.获取task警告】:目前机器正在被人训练...请稍后在来"return {"code": 0, "error_msg": error_msg}# 这个用户是否已经训练完成sql = "SELECT * FROM kantts_auto_train_task where user_id=%s"cursor.execute(sql, [user_id])results = cursor.fetchall()  # 获取所有查询结果if len(results) != 0:task_info = results[0]code =task_info[3]if code == 2:error_msg = "warn:【0.获取task警告】:用户已经训练过模型了"return {"code": 0, "error_msg": error_msg}#更新数据库,继续开始return update_task(conn,user_id,audio_url,1,"")# 没有数据,则插入任务sql = "INSERT INTO " \"kantts_auto_train_task(user_id,audio_url,status) " \"VALUES(%s,%s,%s)"cursor.execute(sql, [user_id, audio_url, 1])conn.commit()return {"code": 1, "error_msg": ""}def update_task(conn , user_id , audio_url ,status ,error_msg):cursor = conn.cursor()sql = "update kantts_auto_train_task set " \"user_id = %s ,audio_url = %s, status =%s , error_msg=%s where user_id = %s"cursor.execute(sql, [user_id, audio_url, status, error_msg, user_id])conn.commit()return {"code": 1, "error_msg": ""}#警告不更新状态,只更新提示
def update_task_warn(conn , user_id   ,error_msg):cursor = conn.cursor()sql = "update kantts_auto_train_task set " \"user_id = %s , error_msg=%s where user_id = %s"cursor.execute(sql, [user_id, error_msg, user_id])conn.commit()return {"code": 1, "error_msg": ""}
# 获取训练的音频数据
#删除目录所有内容
def deletePathFile(path):for filename in os.listdir(path):file_path = os.path.join(path, filename)try:if os.path.isfile(file_path) or os.path.islink(file_path):os.unlink(file_path)elif os.path.isdir(file_path):shutil.rmtree(file_path)except Exception as e:print('Failed to delete %s. Reason: %s' % (file_path, e))print('Successfully deleted all content from directory %s' % path)def downloadAudio(audio_url):if audio_url.endswith(".wav"):audio_name = 'audio/source_audio.wav'response = requests.get(audio_url, stream=True)with open(audio_name, 'wb') as f:for chunk in response.iter_content(chunk_size=1024):if chunk:f.write(chunk)return {"code": 1, "error_msg": ""}else:error_msg="error:【1.获取音频错误】:音频必须为wav"print(error_msg)return {"code": -1, "error_msg": error_msg}def random_string(length):letters = string.ascii_letters + string.digitsreturn ''.join(random.choice(letters) for _ in range(length))def checkRs(conn,task,user_id,audio_url):if task["code"] == -1:# 写入数据库,然后停止update_task(conn,user_id,audio_url,-1,task["error_msg"])sys.exit()if task["code"] == 0:# 写入数据库,然后停止update_task_warn(conn,user_id,task["error_msg"])sys.exit()
#音频切片
def create_split_mkdir(user_id):# 判断目录是否存在,不存在则创建test_path = '/kan_tts/tmp/test_wavs/' + user_idif os.path.exists(test_path):# 删除目录及其内容shutil.rmtree(test_path)os.mkdir(test_path)else:os.mkdir(test_path)return test_path
#同步模型到合成的机器
def scp_file_path(local_path,remote_path):remote_path = "mqq@192.168.51.39:"+remote_pathp = subprocess.Popen(["scp","-r", local_path, remote_path])sts = os.waitpid(p.pid, 0)
if __name__ == '__main__':user_id = "xxx"audio_url = "https://xxx.wav"conn = con_mysql()print("接收到的参数是{\"user_id\":%s,\"audio_url\":%s}" % (user_id,audio_url))#检测机器是否被占用task = get_task(conn, user_id, audio_url)checkRs(conn,task,user_id,audio_url)print("开始执行任务.."+user_id)#删除目录中的其他音频deletePathFile("audio")#获取音频print("====1.开始获取音频")task = downloadAudio(audio_url)checkRs(conn, task, user_id, audio_url)print("====1.音频处理完成")#切分音频print("====2.开始切分音频")test_path = create_split_mkdir(user_id)try:#指定待切分的目录slicer_fn("audio",test_path)except Exception as e:task["code"]=-1task["error_msg"]="error:【2.音频切分错误】,请检查你的音频提交音否正常"print("error:【2.音频切分错误】,请检查你的音频提交音否正常")checkRs(conn, task, user_id, audio_url)print(e)sys.exit(0)print("====2.完成切分音频")print("====3.开始进行标注")try:training_model(user_id)except Exception as e:task["code"]=-1task["error_msg"]="error:【3.数据标注错误】,请检查你的切分音频路径"print("error:【3.数据标注错误】,请检查你的切分音频路径")checkRs(conn, task, user_id, audio_url)print(e)sys.exit(0)print("====3.标注完成")print("====4.开始微调训练4000步,预计30分钟")try:dataset_id = "/kan_tts/tmp/output_dir/"+user_idpretrain_work_dir = "/kan_tts/tmp/pretrain_work_dir/"+user_idweitiao(dataset_id, pretrain_work_dir)except Exception as e:task["code"]=-1task["error_msg"]="error:【4.微调训练错误】,请检查是否音频质量"print("error:【4.微调训练错误】,请检查是否音频质量")checkRs(conn, task, user_id, audio_url)print(e)sys.exit(0)print("====4,完成微调")print("====5,开始往机器同步")try:local_path = "/kan_tts/tmp/pretrain_work_dir/"+user_idremote_path = "/pzk/ttsGuaZai/tmp/pretrain_work_dir"task = scp_file_path(local_path,remote_path)# if task["code"] == -1:#     print(task["error_msg"])#     checkRs(conn, task, user_id, audio_url)#     sys.exit(0)except Exception as e:task["code"] = -1task["error_msg"] = "error:【5.同步到合成机器错误】,请检查远程目录以及本地目录的predict_dir是否存在此用户模型"print("error:【5.同步到合成机器错误】,请检查远程目录以及本地目录的predict_dir是否存在此用户模型")print("检查是否开启ssh免密https://blog.csdn.net/u010044182/article/details/128664248")checkRs(conn, task, user_id, audio_url)print(e)sys.exit(0)# print("====5,同步结束")print("====6,配置数据库-至正式服")#配置音频数据库#配置当前的正式服的训练信息print("====6,配置数据库完成")

其他的代码就是model_scope官网的代码,切分代码请看我历史博客,里面有。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/298776.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

又一款 AI 工具火爆全网!DomoAI 实测体验如何(二)

上一篇介绍了 DomoAI 的两种生成视频的方式: 1、根据上传的视频生成多种风格的视频 2、根据上传的图片生成视频 下图就是通过 DomoAI 生成的一组视频。 DomoAI测试视频 对制作过程感兴趣的可以看上一篇: 程序员X小鹿:【AI 视频】又一款 AI…

众和策略:突然,科创板在审最大IPO终止

2月22日晚,传来科创板在审最大IPO蜂巢动力中止的音讯。 蜂巢动力主营新动力轿车动力电池及储能电池系统的研制、出产和出售。陈说期内(2019年至2021年,及2022年上半年)公司业绩继续大额赔本,归母净获利分别为-3.26亿元…

干货分享 | TSMaster报文发送的信号生成器操作说明

信号生成器功能是TSMaster分析中的报文发送模块。信号生成器用于发送和配置每个 CAN/LIN信号的值变化行为(简而言之,这是一个可以控制和调整CAN/LIN信号值的功能)。而我们可选择的信号生成器类型有8种,今天重点和大家分享一下关于TSMaster信号生成器的8种…

【数据结构】——期末复习题题库(1)

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

基于SpringBoot实现的高仿网盘

一、系统架构 前端:html | bootstrap | js | css 后端:SpringBoot | mybatis 环境:JDK1.8 | Mysql | Maven 二、代码及数据库 三、功能介绍 01. 登录 02. 主页 03. 新建文件夹 04. 上传文件 05. 分享文件 06. 提取分享文件 07. 分享文…

智慧交通应用钡铼技术无线工业边缘路由网关R10A

智慧交通应用中,无线工业边缘路由网关扮演着至关重要的角色。在这方面,钡铼技术无线工业边缘路由网关R10A被广泛应用于交通管理系统中,它具备一路RS485、一路WAN、一路LAN、4G和WiFi等功能。本文将详细介绍R10A的参数以及在智慧交通领域的应用…

系列八(实战)、发送 接收延迟消息(Java操作RocketMQ)

一、发送 & 接收延迟消息 1.1、概述 延迟消息是指发送者发送完消息后,不希望消息被立即投送给订阅者,等一段时间之后再投递给订阅者,例如生活中我们常见的例子,京东商城购物、12306买火车票...,下完订单后就可以发…

搭建本地的pip镜像源

1. 创建文件夹:./pypi_mirror_test 2. 创建并进入conda虚拟环境,安装pip2pi包 pip install pip2pi 3. 下载pypi的packages 可以参考其他博客,或者我之前的博客. 偷懒,仅仅测试用的话: 1)在文件夹下创…

系列十一(实战)、发送 接收带标签的消息(Java操作RocketMQ)

一、发送 & 接收带标签的消息 1.1、概述 消息的种类纷繁复杂,不同的业务场景需要不同的消息,基于此RocketMQ提供了消息过滤功能,通过Tag或者Key进行区分,本章介绍Tag,我们再往一个Topic里面发送消息的时候&#x…

【浏览器】同源策略和跨域

1. 什么是跨域 在说跨域之前,先说说同源策略,什么是同源策略呢?同源策略是浏览器的一种安全机制,减少跨站点脚本攻击(XSS,Cross Site Scripting)、跨站点请求伪造(CSRF,Cross Site Request Forgery)攻击等,因为非同源的请求会被浏览器拦截掉。 同源就是协议、域名(…

doris基本操作,04-表结构的变更

整体思路 因为doris完全兼容mysql协议,因此操作上基本与mysql没有太大区别, 之需要注意与doris相关的关键字即可,如:预聚合,key等 当前表结构 create table table1 {siteid int default 10,citycode smallint,usern…

【Unity地形】使用地形工具创建场景环境-Terrain

如上图Unity的地形工具可以让我们实现创建复杂、丰富的3D室外环境。 我们创建地形很简单,在层级面板中右键-3Dobject-Terrain 就可以创建一个默认的地形模型!这个模型是Unity内置的。 接下来的地形编辑功能全部集中在这个地形的组件上 主要功能如下&…