XFAudioComp 脚本中包含连接讯飞相关方法(其中讯飞使用Websocket  我使用的  BestHttp插件,插件在我资源里可以找到)

using BestHTTP.WebSocket;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;public class XFAudioComp
{/// <summary>/// 语音合成WebSocket/// </summary>private WebSocket m_AudioCompWebWocket;public WebSocket AudioCompWebWocket{get{return m_AudioCompWebWocket;}private set { }}public Action<string> DelOnMessage;public Action DelOnSucceed;private string m_WebSendMsg;/// <summary>/// 语音总长度/// </summary>private int m_AudioLength = 0;private Queue<float> m_QueAudioPlay;private StringBuilder m_AllMessage;public XFAudioComp(){m_QueAudioPlay = new Queue<float>();m_WebSendMsg = string.Empty;DelOnMessage = null;m_AllMessage = new StringBuilder();DelOnSucceed = null;}/// <summary>/// 连接讯飞语音合成/// </summary>public void ConnectXFAudioComp(Uri url){m_AudioCompWebWocket = new WebSocket(url);m_AudioCompWebWocket.OnOpen += OnOpen;m_AudioCompWebWocket.OnMessage += OnMessage;m_AudioCompWebWocket.OnError += OnError;m_AudioCompWebWocket.OnClosed += OnClosed;m_AudioCompWebWocket.Open();}/// <summary>/// 获取合成内容/// </summary>/// <param name="compAudioContent">需要合成的内容</param>/// <param name="vcn">发音人</param>/// <param name="aue">音频编码</param>/// <param name="speed">发音速度</param>/// <param name="volume">发音音量</param>/// <param name="tte">文本编码格式</param>/// <param name="status">数据状态固定为2</param>/// <returns></returns>public void GetAudioCompContent(string compAudioContent, string vcn, string aue, int speed, int volume, string tte, int status){XFMessage xFMessage = new XFMessage();xFMessage.common = new XFConmon();xFMessage.common.app_id = CommonAddress.s_XFAPPID;xFMessage.business = new XFBusiness();xFMessage.business.vcn = vcn;xFMessage.business.aue = aue;xFMessage.business.speed = speed;xFMessage.business.volume = volume;xFMessage.business.tte = tte;xFMessage.data = new XFData();xFMessage.data.status = status;xFMessage.data.text = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(compAudioContent));string str = LitJson.JsonMapper.ToJson(xFMessage);m_WebSendMsg =  str;}public void CloseWebSocket(){if(m_AudioCompWebWocket!=null){m_AudioCompWebWocket.Close();}}private void OnClosed(WebSocket webSocket, ushort code, string message){Debug.Log(webSocket.State);Debug.Log(m_AudioCompWebWocket.State);webSocket.OnOpen = null;webSocket.OnMessage=null;webSocket.OnError=null;webSocket.OnClosed =null;webSocket.Close();Debug.Log("关闭了 :"+ message);}private void OnError(WebSocket webSocket, string reason){Debug.Log("错误了: "+ reason);}private void OnMessage(WebSocket webSocket, string message){XFReturnData xFReturnData = LitJson.JsonMapper.ToObject<XFReturnData>(message);if (DelOnMessage != null){DelOnMessage(xFReturnData.data.audio);}if (xFReturnData.data.status.Equals(2)){if(DelOnSucceed!=null){DelOnSucceed();}//这里处理请求完毕数据m_AudioCompWebWocket.Close();}}private void OnOpen(WebSocket webSocket){Debug.Log("打开成功");if (!string.IsNullOrEmpty(m_WebSendMsg)){Debug.Log("发送消息");webSocket.Send(m_WebSendMsg);}}
}

XFAudioManager 包括初始化语音内容  播放等方法

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class XFAudioManager : MonoBehaviour
{private Queue<float> m_QueAudio;private int m_AudioLength;private XFAudioComp m_XFAudioComp;private AudioSource m_AudioSourece;private AudioClip m_AudioClip;private Action m_DelPlayFinish;public void Init(string compAudioContent ,string vcn , string aue , int speed, int volume, string tte, int status, Action action){m_QueAudio = new Queue<float>();m_AudioLength = 0;m_AudioSourece = gameObject.GetOrAddComponent<AudioSource>();m_AudioClip = null;m_XFAudioComp = new XFAudioComp();m_XFAudioComp.DelOnMessage += OnReceiveMsg;m_XFAudioComp.DelOnSucceed = OnSucceedCall;m_XFAudioComp.GetAudioCompContent(compAudioContent, vcn, aue, speed, volume, tte, status);m_AudioLength = compAudioContent.Length/2;char[] ar = compAudioContent.ToCharArray();m_XFAudioComp.ConnectXFAudioComp(CommonAddress.GetXFAudioCompURL());m_DelPlayFinish = action;}private void OnSucceedCall(){m_AudioClip = AudioClip.Create("audio", 16000 * m_AudioLength, 1, 16000, true, OnAudioRead);m_AudioSourece.clip = m_AudioClip;StartCoroutine("PlayCompAudio");}private void OnReceiveMsg(string obj){float[] fs = BytesToFloat(Convert.FromBase64String(obj));for(int i = 0;i<fs.Length;i++){m_QueAudio.Enqueue(fs[i]);}}IEnumerator PlayCompAudio(){m_AudioSourece.Play();while(true){yield return null;Debug.Log("还在播放呢");if(!m_AudioSourece.isPlaying){break;}}if(m_DelPlayFinish!=null){m_DelPlayFinish();}Destroy(this.gameObject);}private void OnAudioRead(float[] data){for(int i = 0;i< data.Length;i++){if(m_QueAudio!=null&& m_QueAudio.Count > 0){data[i] = m_QueAudio.Dequeue();}else{data[i] = 0;}}}private void OnDestroy(){if (m_XFAudioComp != null){m_XFAudioComp.CloseWebSocket();}}private float[] BytesToFloat(byte[] byteArray)//byte[]数组转化为AudioClip可读取的float[]类型{float[] sounddata = new float[byteArray.Length / 2];for (int i = 0; i < sounddata.Length; i++){sounddata[i] = BytesToFloat(byteArray[i * 2], byteArray[i * 2 + 1]);}return sounddata;}private float BytesToFloat(byte firstByte, byte secondByte){// convert two bytes to one short (little endian)//小端和大端顺序要调整short s;if (BitConverter.IsLittleEndian)s = (short)((secondByte << 8) | firstByte);elses = (short)((firstByte << 8) | secondByte);// convert to range from -1 to (just below) 1return s / 32768.0F;}}

合成地址的静态工具类

public static class CommonAddress
{#region  XFpublic static string s_XFAduioCompRequestAddress = "连接地址去讯飞平台自己看";public static string s_XFAPPID = "换成自己的";public static string s_XFAPISecret = "换成自己的";public static string x_XFAPIKey = "换成自己的";#endregion/**/public static Uri GetXFAudioCompURL(){Uri uri = new Uri(s_XFAduioCompRequestAddress);string date = DateTime.Now.ToString("r");string signature_origin = string.Format("host: " + uri.Host + "\ndate: " + date + "\nGET " + uri.AbsolutePath + " HTTP/1.1");HMACSHA256 mac = new HMACSHA256(Encoding.UTF8.GetBytes(s_XFAPISecret));string signature = Convert.ToBase64String(mac.ComputeHash(Encoding.UTF8.GetBytes(signature_origin)));string authorization_origin = string.Format("api_key=\"{0}\",algorithm=\"hmac-sha256\",headers=\"host date request-line\",signature=\"{1}\"", x_XFAPIKey, signature);string authorization = Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization_origin));string url = string.Format("{0}?authorization={1}&date={2}&host={3}", uri, authorization, date, uri.Host);return new Uri(url);}/*string message = ",\"business\":{\"vcn\":\"" + voice + "\",\"aue\":\"raw\",\"speed\":" + speed + ",\"volume\":" + volume + ",\"tte\":\"UTF8\"}," +"\"data\":{\"status\":2,\"text\":\"" + needCompContent + "\"}}";*/
}[System.Serializable]
public class XFMessage
{public XFConmon common { get; set; }public XFBusiness business { get; set; }public XFData data { get; set; }
}[System.Serializable]
public class XFConmon
{public string app_id { get; set; }}[System.Serializable]
public class XFBusiness
{public string vcn { get; set; }public string aue { get; set; }public int speed { get; set; }public int volume { get; set; }public string tte { get; set; }
}[System.Serializable]
public class XFData
{public int status { get; set; }public string text { get; set; }
}//XFReturnData
[System.Serializable]
public class XFReturnData
{public int code { get; set; }public string message { get; set; }public string sid { get; set; }public XFAddioData data { get; set; }}
[System.Serializable]
public class XFAddioData
{public string audio { get; set; }public string ced { get; set; }public int status { get; set; }
}

百度的比较简单

public class OpenBaiDuVoice : MonoBehaviour
{private static string getAudioPath = "获取音频的地址";private const string m_Head = "换成自己的";private Action m_DelPlayFinis;public void Init(string content,int role,Action playFinish){m_DelPlayFinis = playFinish;StartCoroutine(GetAudio(content, role));}/// <summary>/// 下载音频的地址/// </summary>/// <param name="value">需要语音合成的文本(支持音调设置 如 :  调(tiao2))</param>/// <param name="per">0为普通女声,1为普通男生,3为情感合成 - 度逍遥,4为情感合成 - 度丫丫</param>/// <returns></returns>public static string GetAudioPath(string value,int per){StringBuilder stringBuilder = new StringBuilder();stringBuilder.AppendFormat(getAudioPath, m_Head, value,per);return stringBuilder.ToString();}private IEnumerator GetAudio(string value,int per){string url = GetAudioPath(value,per);UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.WAV);yield return www.SendWebRequest();if (!www.isNetworkError || !www.isHttpError){try{AudioClip curCompclip = DownloadHandlerAudioClip.GetContent(www);AudioSource audioSource =  this.gameObject.GetOrAddComponent<AudioSource>();audioSource.clip = curCompclip;audioSource.Play();StartCoroutine(OnPlayFinish(audioSource));}catch(Exception e){Debug.Log(e);}}}private IEnumerator OnPlayFinish(AudioSource audioSource){while (audioSource.isPlaying){yield return null;}if (m_DelPlayFinis != null){m_DelPlayFinis();}Destroy(this.gameObject);}#region 处理特殊情况/// <summary>/// 处理文字多音字情况,然后返回处理后的文字/// </summary>/// <param name="str"></param>/// <returns></returns>private string AddFormatString(string str){string formatString = str;for (int i = 0; i < formatArray.Length; i++){formatString = formatString.Replace(formatArray[i].oldString, formatArray[i].newString);}return formatString;}private FromatClass[] formatArray = new FromatClass[]{new FromatClass(){ oldString = "啊",newString = "啊(ye3)"}};[Serializable]public class FromatClass{public string oldString;public string newString;}#endregion}

还有就是发音人  讯飞加百度一共是九个

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public static class RoleAudio
{public static class XFInformant{public const string s_讯飞小燕 = "xiaoyan";public const string s_讯飞许久 = "aisjiuxu";public const string s_讯飞小萍 = "aisxping";public const string s_讯飞小婧 = "aisjinger";public const string s_讯飞许小宝 = "aisbabyxu";}public static class BaiDuInformant{public const int s_百度普通男生 = 1;public const int s_百度普通女生 = 0;public const int s_度逍遥 = 3;public const int s_度丫丫 = 4;}}
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
using Wit.BaiduAip.Speech;/// <summary>
/// 音频管理器
/// </summary>
public class AudioManager : SingletonMono<AudioManager>
{private void Start(){gameObject.name = "AudioManager";}/// <summary>/// 使用讯飞语音合成/// </summary>/// <param name="compAudioContent">合成内容(列如  傻逼才看不懂)</param>/// <param name="action">播放成功之后的回调方法</param>/// <param name="vcn">发音人</param>/// <param name="aue">音频格式</param>/// <param name="speed">速度</param>/// <param name="volume">声音</param>/// <param name="tte">编码格式</param>/// <param name="status">数据状态</param>public void PlayXFAudio(string compAudioContent, string vcn = RoleAudio.XFInformant.s_讯飞小萍, Action action = null,string aue = "raw", int speed = 50, int volume = 100, string tte = "UTF8", int status = 2 ){//每次调用  清空上次ClearPlayingAudio();GameObject go = new GameObject("XFCompAudio");go.transform.position = Vector3.zero;go.transform.rotation = Quaternion.identity;go.transform.SetParent(this.gameObject.transform);go.GetOrAddComponent<XFAudioManager>().Init(compAudioContent, vcn, aue, speed, volume, tte, status, action);}private void ClearPlayingAudio(){foreach(Transform t in transform){AudioSource  s =   t.GetComponent<AudioSource>();if (s != null && s.isPlaying){s.Stop();Destroy(s.gameObject);}}}/// <summary>/// 使用百度语音合成/// </summary>/// <param name="compAudioContent">合成内容</param>/// <param name="role">发音人</param>/// <param name="PlayFinish">播放完成回调</param>public void PlayBaiDuCompAudio(string compAudioContent,int role = RoleAudio.BaiDuInformant.s_度逍遥,Action PlayFinish = null){//每次调用  清空上次ClearPlayingAudio();GameObject go = new GameObject("BaiduCompAudio");go.transform.position = Vector3.zero;go.transform.rotation = Quaternion.identity;go.transform.SetParent(this.gameObject.transform);go.AddComponent<OpenBaiDuVoice>().Init(compAudioContent, role, PlayFinish);}}

讯飞语音合成和百度语音合成,粘贴就能用相关推荐

  1. C#讯飞实时语音识别和语音合成

    目录 MSC模块导入及添加枚举常量等 语音识别模块 语音合成模块 最终结果 工程使用说明 代码下载 最近由于需要做一个关于语音的c#项目,经老师推荐使用了讯飞的语音识别和合成的接口,但由于网上资源关于 ...

  2. 讯飞文本转语音(语音合成TTS)中添加控制静音和停顿方法

    讯飞的文本转语音和语音合成TTS中,用标点符号.回车换行可以实现一定的停顿效果.如果想要更长时间的静音或停顿怎么办? 插入停顿 这里有个特殊的标记实现静音或停顿,在文字中需要停顿的地方加入 [p100 ...

  3. 百度语音合成 html5,百度语音合成接口

    更新记录 4.1(2021-02-05) 优化 队列机制稳定性 修复 obeyMuteSwitch增加条件编译 4.0(2019-07-13) 1.Object传参模式新增returnAudio属性, ...

  4. 百度语音合成 html5,百度语音合成AI(示例代码)

    注意:不要使用Dw编辑PHP代码,会因为编码问题出错!! require_once 'AipSpeech.php'; // 你的 APPID AK SK const APP_ID = '112*** ...

  5. 百度语音合成 android,百度语音合成播放

    Android ASR SDK 集成合成****DEMO****中 (一) 简介: 本文针对遇见集成Android识别DEMO 有困难的用户,以android合成SDK作为示例,给出的步骤. 本文将集 ...

  6. 百度语音android 集成,Android集成讯飞语音、百度语音、阿里语音识别

    Python list嵌套 三维数组 cores_multicast = [[] for i in xrange(64)] temp_list = [0, 1] temp_list2 = [0, 3] ...

  7. 基于讯飞语音,百度语音,图灵机器人的智能语音机器人毕业设计第一天

    语音机器人C语言终极版 c代码更新的地址: https://github.com/1158114251/-Intelligent-speech-robot 视频地址: https://www.bili ...

  8. IOS开发--语音合成(讯飞接口)

    IOS开发–语音播报 想要实现iOS语音播报,要使用讯飞/百度语音播报的第三方接口.我使用的是讯飞的语音合成接口. 登录注册讯飞平台,申请语音合成接口! 下载iOS开发所需sdk,sdk中包含语音开发 ...

  9. 讯飞webapi语音合成多音字处理

    在使用讯飞webapi方式进行语音合成时,发现多音字经常不按语义进行发音,在讯飞论坛上找了半天,按论坛上的方法不起作用,反复试了一下,用下面组合可以起作用. 一.后台参数配置 后台主要涉及3个参数,t ...

最新文章

  1. Linux下安装Oracle参数自动初始化脚本
  2. Flutter开发之GridView组件(20)
  3. 成功解决torch\cuda\__init__.py“, line 208, in check_error raise Cuda Error(res) torch.cuda.Cuda Error: C
  4. 我的虚拟化设想(My virtualization vision)
  5. AD+DNS安装步骤详解
  6. web html分块加载,javascript – 使用webpack代码拆分,如何加载块和HTML布局?
  7. AF_INET是什么?
  8. 工作一年了,从新拾起写博客的道路
  9. java switch小程序,微信小程序 switch组件详解及简单实例
  10. Python基础-数据类型转换,默认参数,关键字参数
  11. MooTools官方插件 - Chain.Wait
  12. Ubuntu 20.04 安装多个版本 php 并应用到 nginx
  13. 成员函数指针有多态的效果吗?
  14. mangodb与mysql的区别
  15. 【悟空云课堂】第七期:不安全的反射漏洞(CWE-470: Use of Externally-Controlled Input to Select Classes or Code)
  16. AI 助力智慧城市发展 | 腾讯视觉峰会回顾
  17. 敏捷迭代燃尽图_3个敏捷燃尽报告以及如何使用它们
  18. 打开outlook显示服务器内存不足,outlook无法启动,总说计算机内存不足或磁盘已满,是怎么回事?...
  19. QSettings遇到神坑
  20. error LNK2019: 无法解析的外部符号 XXXXXXXXX,该符号在函数XXX中被引用

热门文章

  1. POJ 3133 Manhattan Wiring
  2. 虚拟机苹果macOS系统安装VMware Tools教程
  3. CAD无法正常启动[acadiso.dwt加载卡死]解决办法与问题排除思路分享--以CAD2014版本情况为例
  4. Apache Twill —— 分布式应用开发框架
  5. 莫名其妙,excel突然没有数据分析加载项,
  6. 互联网运营面试题_运营十问 | 总结运营面试可能遇到的问题
  7. 【智能家居】苹果HomeKit、米家、aqara怎么选?用智汀掌控一切
  8. 53 bays朴素贝叶斯文本挖掘English
  9. weblogic集群配置(windows版)
  10. php tpl模板文件,php自己创建TPL模板引擎之初学习