第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > Unity接入百度语音识别解决方案

Unity接入百度语音识别解决方案

时间:2019-03-28 10:09:15

相关推荐

Unity接入百度语音识别解决方案

之前有过需求要是语音识别,而百度也提供了对应的.dll文件,后来用了一下在识别的时候占用了主线程,会卡顿,又看了看大佬的解决方案,自己也总结了一下。

总共分为四大部:1获取Token、2开始录音、3录音结束、4上传百度进行识别。

采用上传Put json的方法,返回得到json,再去解析。

using System;using System.Collections;using System.Text;using UnityEngine;using working;public class ToWord : MonoBehaviour{private string token = ""; //access_tokenprivate string cuid = "11"; //用户唯一标识private string format = "pcm"; //语音格式private int dev_pid = 1536;//语言设置private int rate = 16000; //采样率private int channel = 1; //声道数private string speech; //语音数据,进行base64编码private int len; //原始语音长度private const string grant_Type = "client_credentials";//固定值private const string API_KEY = "你的API Key"; //百度appkeyprivate const string SECRET_KEY = "你的Secret Key"; //百度Secret Keyprivate const string baiduAPI = "/server_api";//put地址private const string getTokenAPIPath = "/oauth/2.0/token";//获取TokenPost地址AudioClip clip;MyJsonData jsonData = new MyJsonData();private void Awake(){StartCoroutine(GetToken(getTokenAPIPath));}/// <summary>/// 获取百度用户令牌/// </summary>/// <param name="url">获取的url</param>/// <returns></returns>private IEnumerator GetToken(string url){WWWForm form = new WWWForm();form.AddField("grant_type", grant_Type);form.AddField("client_id", API_KEY);form.AddField("client_secret", SECRET_KEY);UnityWebRequest request = UnityWebRequest.Post(url, form);yield return request.SendWebRequest();if (request.error == null){string msg = DownloadHandlerBuffer.GetContent(request);RecodeJson json = JsonUtility.FromJson<RecodeJson>(msg);token = json.access_token;DebugLog("获取百度用户令牌 初始化完成");}else DebugLog("error:" + request.error);}/// <summary>/// 开始录音/// </summary>public void StartMic(int durationTime){if (Microphone.devices.Length == 0) return;Microphone.End(null);DebugLog("Start");clip = Microphone.Start(null, false, durationTime, rate);}/// <summary>/// 结束录音/// </summary>public void EndMic(Action<string> CallBack){DebugLog("录音结束");Microphone.End(null);byte[] clipByte = GetClipData();len = clipByte.Length;speech = Convert.ToBase64String(clipByte);StartCoroutine(GetAudioString(baiduAPI, CallBack));}/// <summary>/// 把语音转换为文字/// </summary>/// <param name="url"></param>/// <returns></returns>private IEnumerator GetAudioString(string url, Action<string> CallBack = null){string resultStr = "";//识别后的结果jsonData.format = format;jsonData.dev_pid = dev_pid;jsonData.rate = rate;jsonData.channel = channel;jsonData.token = token;jsonData.cuid = cuid;jsonData.len = len;jsonData.speech = speech;string jsonStr = JsonUtility.ToJson(jsonData);UnityWebRequest request = UnityWebRequest.Put(url, Encoding.Default.GetBytes(jsonStr));yield return request.SendWebRequest();if (request.isDone){if (request.error == null){string msg = DownloadHandlerBuffer.GetContent(request);RecodeJson json = JsonUtility.FromJson<RecodeJson>(msg);if (json.err_msg == "success."){resultStr = json.result[0];if (CallBack != null) CallBack(resultStr);DebugLog("success:" + resultStr);}}else DebugLog("error:" + request.error);}}/// <summary>/// 把录音转换为Byte[]/// </summary>/// <returns></returns>byte[] GetClipData(){if (clip == null){DebugLog("DataNull");return null;}float[] samples = new float[clip.samples];clip.GetData(samples, 0);byte[] outData = new byte[samples.Length * 2];int rescaleFactor = 32767; //to convert float to Int16 for (int i = 0; i < samples.Length; i++){short temshort = (short)(samples[i] * rescaleFactor);byte[] temdata = System.BitConverter.GetBytes(temshort);outData[i * 2] = temdata[0];outData[i * 2 + 1] = temdata[1];}if (outData == null || outData.Length <= 0){DebugLog("ConvertDataNull");return null;}return outData;}void DebugLog(string mes){#if UNITY_EDITORDebug.Log(mes);#endif}private void OnGUI(){if (GUILayout.Button("开始录音"))StartMic(10);if (GUILayout.Button("结束录音"))EndMic(ToWordOverAction);}/// <summary>/// 识别结束的回调/// </summary>/// <param name="str"></param>void ToWordOverAction(string str){switch (str){case "123":print("123");break;}}}public class MyJsonData{public string format;public int dev_pid;public int rate;public int channel;public string token;public string cuid;public int len;public string speech;}[Serializable]public class RecodeJson{public string access_token;public string err_msg;public string[] result;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。