GenshinTextToSpeech: Unity 音频合成插件
GenshinTextToSpeech: Unity 音频合成插件
GenshinTextToSpeech 是一个 Unity 插件,它利用 Genshin API 提供的文本转语音功能,让你能够轻松地将文本转换为语音。
特性
- 支持多种 Genshin 角色的语音合成
- 支持多种音频格式,例如 'wav'
- 支持自定义音频长度、噪声和声调
- 可调节音频质量
使用方法
- 将 GenshinTextToSpeech 脚本添加到你的游戏对象。
- 配置 GenshinSettings 脚本,设置 API 域名。
- 在 GenshinTextToSpeech 脚本中设置角色、音频格式和其它参数。
- 使用
Speak()方法进行语音合成。
代码示例
using System;
using System.Collections;
using System.Xml.Linq;
using UnityEngine;
using UnityEngine.Networking;
public class GenshinTextToSpeech : TTS
{
#region 参数定义
/// <summary>
/// Genshin配置项
/// </summary>
[SerializeField] private GenshinSettings m_GenshinSettings;
/// <summary>
/// 朗读的角色
/// </summary>
[Header("朗读声音设置")]
public string speaker = "胡桃";
/// <summary>
/// 音频格式
/// </summary>
[Header("音频格式设置")]
public string format = "wav";
/// <summary>
/// 音频长度
/// </summary>
[Header("音频长度设置")]
public float length = 1f;
/// <summary>
/// 噪声
/// </summary>
[Header("噪声设置")]
public float noise = 0.5f;
/// <summary>
/// 噪声权重
/// </summary>
[Header("噪声权重设置")]
public float noisew = 0.9f;
/// <summary>
/// 声调比例
/// </summary>
[Header("声调比例设置")]
public float sdp_ratio = 0.2f;
#endregion
private void Awake()
{
m_GenshinSettings = this.GetComponent<GenshinSettings>();
m_PostURL = string.Format("https://{0}/api", m_GenshinSettings.apiDomain);
}
/// <summary>
/// 语音合成
/// </summary>
/// <param name="_msg"></param>
/// <param name="_callback"></param>
public override void Speak(string _msg, Action<AudioClip> _callback)
{
StartCoroutine(GetVoice(_msg, _callback));
}
/// <summary>
/// 语音合成,返回合成文本
/// </summary>
/// <param name="_msg"></param>
/// <param name="_callback"></param>
public override void Speak(string _msg, Action<AudioClip, string> _callback)
{
StartCoroutine(GetVoice(_msg, _callback));
}
/// <summary>
/// restful api语音合成
/// </summary>
/// <param name="_msg"></param>
/// <param name="_callback"></param>
/// <returns></returns>
private IEnumerator GetVoice(string _msg, Action<AudioClip> _callback)
{
stopwatch.Restart();
//发送报文
string textToSpeechRequestBody = GenerateTextToSpeech(speaker, _msg, format, length, noise, noisew, sdp_ratio);
using (UnityWebRequest speechRequest = new UnityWebRequest(m_PostURL, "POST"))
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(textToSpeechRequestBody);
speechRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);
speechRequest.downloadHandler = (DownloadHandler)new DownloadHandlerAudioClip(speechRequest.uri, AudioType.WAV);
yield return speechRequest.SendWebRequest();
if (speechRequest.responseCode == 200)
{
AudioClip audioClip = DownloadHandlerAudioClip.GetContent(speechRequest);
_callback(audioClip);
}
else
{
Debug.LogError("语音合成失败: " + speechRequest.error);
}
}
stopwatch.Stop();
Debug.Log("Genshin语音合成耗时:" + stopwatch.Elapsed.TotalSeconds);
}
/// <summary>
/// restful api语音合成,返回合成文本
/// </summary>
/// <param name="_msg"></param>
/// <param name="_callback"></param>
/// <returns></returns>
private IEnumerator GetVoice(string _msg, Action<AudioClip, string> _callback)
{
stopwatch.Restart();
//发送报文
string textToSpeechRequestBody = GenerateTextToSpeech(speaker, _msg, format, length, noise, noisew, sdp_ratio);
using (UnityWebRequest speechRequest = new UnityWebRequest(m_PostURL, "POST"))
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(textToSpeechRequestBody);
speechRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);
speechRequest.downloadHandler = (DownloadHandler)new DownloadHandlerAudioClip(speechRequest.uri, AudioType.WAV);
yield return speechRequest.SendWebRequest();
if (speechRequest.responseCode == 200)
{
AudioClip audioClip = DownloadHandlerAudioClip.GetContent(speechRequest);
_callback(audioClip, _msg);
}
else
{
Debug.LogError("语音合成失败: " + speechRequest.error);
}
}
stopwatch.Stop();
Debug.Log("Genshin语音合成耗时:" + stopwatch.Elapsed.TotalSeconds);
}
/// <summary>
/// 报文格式转换
/// </summary>
/// <param name="speaker"></param>
/// <param name="msg"></param>
/// <param name="format"></param>
/// <param name="length"></param>
/// <param name="noise"></param>
/// <param name="noisew"></param>
/// <param name="sdp_ratio"></param>
/// <returns></returns>
public string GenerateTextToSpeech(string speaker, string msg, string format, float length, float noise, float noisew, float sdp_ratio)
{
string urlParams = string.Format("?speaker={0}&msg={1}&format={2}&length={3}&noise={4}&noisew={5}&sdp_ratio={6}", speaker, msg, format, length, noise, noisew, sdp_ratio);
string url = m_PostURL + urlParams;
return url;
}
}
// GenshinSettings.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "GenshinSettings", menuName = "ScriptableObjects/GenshinSettings")]
public class GenshinSettings : ScriptableObject
{
public string apiDomain;
}
### 错误解决
"NullReferenceException: Object reference not set to an instance of an object GenshinTextToSpeech.Awake ()" 错误意味着在 `GenshinTextToSpeech.Awake()` 方法中,尝试访问一个未实例化的对象。
要解决这个问题,请检查以下内容:
* 确保在场景中存在一个拥有 `GenshinSettings` 脚本的游戏对象。
* 确保在 `GenshinSettings` 脚本中,你正确地定义了 `apiDomain` 变量,并在场景中的 `GenshinSettings` 脚本对象上分配了一个值。
如果问题仍然存在,请提供更多代码和错误信息,以便进行更详细的分析和解决。
### 注意事项
* 此插件需要 Genshin API 的访问权限。
* 确保 API 域名正确无误。
* 请根据需要调整参数,以获得最佳的语音合成效果。
### 联系方式
如果你遇到任何问题,请随时联系我们。
### 版权声明
此插件仅供学习和研究使用,不得用于任何商业用途。
原文地址: http://www.cveoy.top/t/topic/jN3e 著作权归作者所有。请勿转载和采集!