之前有过需求要是语音识别,而百度也提供了对应的.dll文件,后来用了一下在识别的时候占用了主线程,会卡顿,又看了看大佬的解决方案,自己也总结了一下。
总共分为四大部:1获取Token、2开始录音、3录音结束、4上传百度进行识别。
采用上传Put json的方法,返回得到json,再去解析。

using System;
using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
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 = "http://vop.baidu.com/server_api";//put地址private const string getTokenAPIPath = "https://openapi.baidu.com/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;
}

Unity接入百度语音识别解决方案相关推荐

  1. Unity接入百度语音识别WebAPI

    第一步,布局如图 image.png 第二步,代码如下 (自行填写apiKey和secretKey) using System; using System.Collections; using Sys ...

  2. Unity接入百度语音识别SDK windows平台

    1.先注册百度开放平台的账号,然后按文档申请试用资格及创建应用:https://ai.baidu.com/ai-doc/SPEECH/qknh9i8ed Windows平台选择"不需要&qu ...

  3. unity接入百度人体识别

    unity接入百度人体识别 1.去百度下载SDK 复制AipSdk.dll到工程 复制Newtonsoft.Json.dll到工程 自己按照unity版本,选择2.0,3.5,还是4.0的dll 2. ...

  4. javaAPI和android sdk接入百度语音识别

    最近由于一项目需求,需要实现上位机对下位机的语音控制,(嫌弃语音模块太贵,才想着做没有成本的方法实现),这里主要测试了两种调用百度语音识别API的方案,一种是基于SDK(这里测试使用Android S ...

  5. Unity 接入百度AI - 通用物体和场景识别

    接口介绍: 可识别超过10万类常见物体和场景,接口返回大类及细分类的名称,并支持获取识别结果对应的百科信息:还可使用EasyDL定制训练平台,定制识别分类标签.广泛适用于图像或视频内容分析.拍照识图等 ...

  6. Unity 接入百度AI - 植物识别

    接口介绍: 可识别超过2万种常见植物和近8千种花卉,接口返回植物的名称,并支持获取识别结果对应的百科信息:还可使用EasyDL定制训练平台,定制识别植物种类.适用于拍照识图.幼教科普.图像内容分析等场 ...

  7. Unity 接入百度AI - 动物识别

    接口介绍: 识别近八千种动物,接口返回动物名称,并可获取识别结果对应的百科信息:还可使用EasyDL定制训练平台,定制识别分类标签.适用于拍照识图.幼教科普.图像内容分析等场景 创建应用:      ...

  8. Unity 接入百度AI - 红酒识别

    接口介绍: 识别图像中的红酒标签,返回红酒名称.国家.产区.酒庄.类型.糖分.葡萄品种.酒品描述等信息,可识别数十万中外红酒:支持自定义红酒图库,在自建库中搜索特定红酒信息. 创建应用:      在 ...

  9. Unity 接入百度AI - 车型识别

    接口介绍: 该请求用于检测一张车辆图片的具体车型.即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片的车辆品牌及型号. 创建应用:      在产品服务中搜索图像识别,创建应用,获取AppID ...

最新文章

  1. malloc开辟的空间在哪一个区间_C++进阶系列之STL(2)SGI版本空间配置器
  2. 个人阅读作业Week7
  3. 霍夫变换(初始学习)
  4. LeetCode --- Valid Parentheses
  5. java servlet https_javaweb项目对https的配置01
  6. 中文实体命名识别工具使用汇总:Stanza、LAC、Ltp、Hanlp、foolnltk、NLTK、BosonNLP
  7. linux_38664和amd64,Cognos10 RedHat5.4 X64 安装记录
  8. Ubuntu安装Docker引擎和支持HTTPS的docker-registry服务
  9. 记录——《C Primer Plus (第五版)》第九章编程练习第二题
  10. Android开发的四大组件
  11. html5 blob video 下载
  12. entsel约束条件lisp_autocad-plugin
  13. 精品软件 推荐 常用软件 游戏的 运行库 下载 合集 3D game 玩游戏的一定要收藏一下。...
  14. protel相关资料
  15. sybase数据库导出mysql_sybase数据库备份的两种方式
  16. 推荐几个2021年App数据统计平台,分析数据运营必备工具
  17. uniapp消息推送(个推-PHP服务端推送)
  18. 解决win7防火墙打不开的问题:错误代码1079和错误代码13
  19. js 页面跳转两种方式(原页面跳转,打开新标签页)
  20. 视频知识点(17)- flv.js 实现播放本地视频文件的技巧

热门文章

  1. linux 大牛博客,大牛
  2. java大文件上传解决方案
  3. error: #error “Please include Eigen/Geometry instead of including headers inside the src directory d
  4. 暴风影音 彻底彻底无无广告广告
  5. React基础—state组件使用及分类
  6. 未来-量子计算机:量子计算机
  7. url 转pdf工具
  8. Android的一些开源项目集锦 以备以后研究
  9. android ab 广告,秒针移动广告监测指南(Android版)
  10. JS 获取上周、本周、下周的开始日期或者结束日期