111 lines
3.2 KiB
C#
111 lines
3.2 KiB
C#
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
|
||
|
||
|
||
|
||
}
|