白菜工厂1145号员工
Automated commit from batch script
a17d0bc
import os, sys
now_dir = os.getcwd()
sys.path.append(now_dir)
sys.path.append(os.path.join(now_dir, "GPT_SoVITS"))
import os, re, logging, json
logging.getLogger("markdown_it").setLevel(logging.ERROR)
logging.getLogger("urllib3").setLevel(logging.ERROR)
logging.getLogger("httpcore").setLevel(logging.ERROR)
logging.getLogger("httpx").setLevel(logging.ERROR)
logging.getLogger("asyncio").setLevel(logging.ERROR)
logging.getLogger("charset_normalizer").setLevel(logging.ERROR)
logging.getLogger("torchaudio._extension").setLevel(logging.ERROR)
import pdb
import torch
if "_CUDA_VISIBLE_DEVICES" in os.environ:
os.environ["CUDA_VISIBLE_DEVICES"] = os.environ["_CUDA_VISIBLE_DEVICES"]
is_half = eval(os.environ.get("is_half", "True"))
from TTS_infer_pack.TTS import TTS, TTS_Config
os.environ['PYTORCH_ENABLE_MPS_FALLBACK'] = '1' # 确保直接启动推理UI时也能够设置。
if torch.cuda.is_available():
device = "cuda"
else:
device = "cpu"
is_half = False
# 取得模型文件夹路径
config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "config.json")
if os.path.exists(config_path):
with open(config_path, 'r', encoding='utf-8') as f:
_config = json.load(f)
if _config.get("device", "auto") != "auto":
device = _config["device"]
if device == "cpu":
is_half = False
if _config.get("half_precision", "auto") != "auto":
is_half = _config["half_precision"].lower() == "true"
locale_language = str(_config.get("locale", "auto"))
locale_language = None if locale_language.lower() == "auto" else locale_language
print(f"device: {device}, is_half: {is_half}")
from tools.i18n.i18n import I18nAuto
i18n = I18nAuto(locale_language,os.path.join(os.path.dirname(os.path.dirname(__file__)), "i18n/locale"))
dict_language = {
"中文": "all_zh",#全部按中文识别
"英文": "en",#全部按英文识别#######不变
"日文": "all_ja",#全部按日文识别
"中英混合": "zh",#按中英混合识别####不变
"日英混合": "ja",#按日英混合识别####不变
"多语种混合": "auto",#多语种启动切分识别语种
"auto": "auto",
"zh": "zh",
"en": "en",
"ja": "ja",
"all_zh": "all_zh",
"all_ja": "all_ja",
}
tts_config = TTS_Config("")
tts_config.device = device
tts_config.is_half = is_half
tts_pipline = TTS(tts_config)
gpt_path = tts_config.t2s_weights_path
sovits_path = tts_config.vits_weights_path
def inference(text, text_lang,
ref_audio_path, prompt_text,
prompt_lang, top_k,
top_p, temperature,
text_split_method, batch_size,
speed_factor, ref_text_free,
split_bucket,
return_fragment,
seed
):
try:
text_lang = dict_language[text_lang.lower()]
prompt_lang = dict_language[prompt_lang.lower()]
except:
text_lang = "auto"
prompt_lang = "auto"
inputs={
"text": text,
"text_lang": text_lang,
"ref_audio_path": ref_audio_path,
"prompt_text": prompt_text if not ref_text_free else "",
"prompt_lang": prompt_lang,
"top_k": top_k,
"top_p": top_p,
"temperature": temperature,
"text_split_method": text_split_method,
"batch_size":int(batch_size),
"speed_factor":float(speed_factor),
"split_bucket":split_bucket,
"return_fragment":return_fragment,
"seed":seed
}
return tts_pipline.run(inputs)
# from https://github.com/RVC-Boss/GPT-SoVITS/pull/448
import tempfile, io, wave
from pydub import AudioSegment
# from https://huggingface.co/spaces/coqui/voice-chat-with-mistral/blob/main/app.py
def wave_header_chunk(frame_input=b"", channels=1, sample_width=2, sample_rate=32000):
# This will create a wave header then append the frame input
# It should be first on a streaming wav file
# Other frames better should not have it (else you will hear some artifacts each chunk start)
wav_buf = io.BytesIO()
with wave.open(wav_buf, "wb") as vfout:
vfout.setnchannels(channels)
vfout.setsampwidth(sample_width)
vfout.setframerate(sample_rate)
vfout.writeframes(frame_input)
wav_buf.seek(0)
return wav_buf.read()
def get_streaming_tts_wav(params):
chunks = inference(**params)
byte_stream = True
if byte_stream:
yield wave_header_chunk()
for sr, chunk in chunks:
if chunk is not None:
chunk = chunk.tobytes()
yield chunk
else:
print("None chunk")
pass
else:
pass
# Send chunk files
# i = 0
# format = "wav"
# for chunk in chunks:
# i += 1
# file = f"{tempfile.gettempdir()}/{i}.{format}"
# segment = AudioSegment(chunk, frame_rate=32000, sample_width=2, channels=1)
# segment.export(file, format=format)
# yield file