2026-03-24 11:39:01 +08:00

111 lines
3.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class GPTSoVITS : TTS
{
#region
[Header("参考音频路径是GPT-SoVITS项目下的相对路径")]
[SerializeField] private string m_ReferWavPath = string.Empty;//参考音频路径
[Header("参考音频的文字内容")]
[SerializeField] private string m_ReferenceText = "";//参考音频文本
[Header("参考音频的语言")]
[SerializeField] private Language m_ReferenceTextLan = Language.;//参考音频的语言
[Header("合成音频的语言")]
[SerializeField] private Language m_TargetTextLan = Language.;//合成音频的语言
#endregion
Coroutine m_Coroutine;
/// <summary>
/// 语音合成,返回合成文本
/// </summary>
/// <param name="_msg"></param>
/// <param name="_callback"></param>
public override void StartSpeak(string _msg, Action<AudioClip> _callback)
{
base.StartSpeak(_msg, _callback);
m_Coroutine = StartCoroutine(GetVoice(_msg, _callback));
}
public override void StopSpeak()
{
base.StopSpeak();
if(m_Coroutine != null)
{
StopCoroutine(m_Coroutine);
}
}
/// <summary>
/// 合成音频
/// </summary>
/// <param name="_msg"></param>
/// <param name="_callback"></param>
/// <returns></returns>
private IEnumerator GetVoice(string _msg, Action<AudioClip> _callback)
{
stopwatch.Restart();
//发送报文
RequestData _requestData = new RequestData
{
refer_wav_path = m_ReferWavPath,
prompt_text = m_ReferenceText,
prompt_language = m_ReferenceTextLan.ToString(),
text = _msg,
text_language = m_TargetTextLan.ToString()
};
string _postJson = JsonUtility.ToJson(_requestData);//报文
using (UnityWebRequest request = new UnityWebRequest(m_PostURL, "POST"))
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(_postJson);
request.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);
request.downloadHandler = new DownloadHandlerAudioClip(m_PostURL, AudioType.WAV);
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();
if (request.responseCode == 200)
{
AudioClip audioClip = ((DownloadHandlerAudioClip)request.downloadHandler).audioClip;
_callback(audioClip);
}
else
{
//Debug.LogError("语音合成失败: " + request.error);
_callback(null);
}
}
}
#region
[Serializable]
public class RequestData
{
public string refer_wav_path = string.Empty;//参考音频路径
public string prompt_text = string.Empty;//参考音频文本
public string prompt_language = string.Empty;//参考音频语言
public string text = string.Empty;//合成文本
public string text_language = string.Empty;//合成语言设置
}
public enum Language
{
,
,
,
,
,
}
#endregion
}