当前位置: 首页 > news >正文

【数字人开发】Unity+百度智能云平台实现短语音文本识别功能

一、创建自己的语音识别应用

百度智能云控制台网址:https://console.bce.baidu.com/

1、创建应用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、获取APIKey和SecretKey

在这里插入图片描述

3、Api调试

调试网址:https://console.bce.baidu.com/support/?timestamp=1750317430400#/api?product=AI&project=%E8%AF%AD%E9%9F%B3%E6%8A%80%E6%9C%AF&parent=%E9%89%B4%E6%9D%83%E8%AE%A4%E8%AF%81%E6%9C%BA%E5%88%B6&api=oauth%2F2.0%2Ftoken&method=post
在这里插入图片描述

二、在Unity中进行调用

1、短语音识别标准版相关参数

在这里插入图片描述

2、完整代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
using Newtonsoft.Json;
using UnityEngine.UI;public class ASR : MonoBehaviour
{[Header("百度语音识别配置")][SerializeField] private string apiKey = "LFfK6DTaswy6LLtBqvHO86w0";[SerializeField] private string secretKey = "vj6JmKd7zBylDVGW2WmTNPWl9eKxxZEL";[SerializeField] private string accessToken;[Space][Header("短语音识别标准版参数设置")][SerializeField] private string format = "pcm";[SerializeField] private int rate = 16000;[SerializeField] private int channel = 1;[SerializeField] private string cuid = "240a906f2b88794fd0426442c4136a5a57bf5c01";[SerializeField] private int dev_pid = 1537;[Space][Header("测试使用")]public AudioSource audioSource;[Space][Header("UI相关")]public Button buttonStartASR;public Button buttonRecord;public Text textResult;// Start is called before the first frame updatevoid Start(){//一开始就进行鉴权StartCoroutine(GetAccessToken());//开始识别buttonStartASR.onClick.AddListener(() =>{print("开始识别");StartCoroutine(RecognizeFromClip(audioSource.clip, onSuccess => { textResult.text = onSuccess; }, onError => { Debug.Log(onError); }));});}#region 短语音识别相关/// <summary>/// 短语音识别方法/// </summary>/// <param name="clip">待识别语音</param>/// <param name="onSuccess">识别成功返回结果(文本)</param>/// <param name="onError">识别成功返回问题</param>/// <returns></returns>public IEnumerator RecognizeFromClip(AudioClip clip, Action<string> onSuccess, Action<string> onError){if (accessToken == null){onError?.Invoke("accessToken未获取");yield break;}// 转换 clip 为 PCM 数据(16bit)byte[] pcmData = ConvertClipToPCM16(clip);if (pcmData == null){onError?.Invoke("音频格式错误或转换失败");yield break;}string base64Audio = Convert.ToBase64String(pcmData);var requestData = new{format = format,rate = rate,channel = channel,cuid = cuid,token = accessToken,dev_pid = dev_pid,// 普通话输入法模型speech = base64Audio,len = pcmData.Length    };string jsonBody = JsonConvert.SerializeObject(requestData);using (UnityWebRequest request = new UnityWebRequest("https://vop.baidu.com/server_api", "POST")){byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonBody);request.uploadHandler = new UploadHandlerRaw(bodyRaw);request.downloadHandler = new DownloadHandlerBuffer();request.SetRequestHeader("Content-Type", "application/json");request.SetRequestHeader("Accept", "application/json");yield return request.SendWebRequest();if (request.result != UnityWebRequest.Result.Success){onError?.Invoke("网络错误: " + request.error);}else{string responseText = request.downloadHandler.text;Debug.Log("🎤 识别结果: " + responseText);var result = JsonConvert.DeserializeObject<ASRResponse>(responseText);if (result.err_no == 0)onSuccess?.Invoke(string.Join("", result.result));elseonError?.Invoke($"识别失败(错误码{result.err_no}):{result.err_msg}");}}}/// <summary>/// 语音格式转换方法,转为 PCM16 格式/// </summary>/// <param name="clip">需要转换的音频</param>/// <returns>返回转换后的音频结果</returns>// 将 AudioClip 转为 PCM16 格式private byte[] ConvertClipToPCM16(AudioClip clip){if (clip.channels != 1 || clip.frequency != 16000){Debug.LogError("❌ 仅支持 16kHz 单通道音频");return null;}float[] samples = new float[clip.samples];clip.GetData(samples, 0);byte[] pcm = new byte[samples.Length * 2]; // 16-bit = 2 bytesfor (int i = 0; i < samples.Length; i++){short value = (short)(samples[i] * short.MaxValue);byte[] bytes = BitConverter.GetBytes(value);pcm[i * 2] = bytes[0];pcm[i * 2 + 1] = bytes[1];}return pcm;}[Serializable]public class ASRResponse{/// <summary>/// 短文本语音识别返回结构/// </summary>public int err_no;public string err_msg;public string sn;public string[] result;}#endregion#region 鉴权相关/// <summary>/// 鉴权方法/// </summary>/// <returns></returns>/// <summary>/// 获取百度 AccessToken(已使用 using 自动释放资源)/// </summary>public IEnumerator GetAccessToken(){string url = "https://aip.baidubce.com/oauth/2.0/token";WWWForm form = new WWWForm();form.AddField("grant_type", "client_credentials");form.AddField("client_id", apiKey);form.AddField("client_secret", secretKey);using (UnityWebRequest request = UnityWebRequest.Post(url, form)){yield return request.SendWebRequest();if (request.result == UnityWebRequest.Result.Success){try{var tokenResponse = JsonConvert.DeserializeObject<TokenResponse>(request.downloadHandler.text);accessToken = tokenResponse.access_token;Debug.Log("✅ 短语音识别获取 AccessToken 成功: " + accessToken);}catch (Exception ex){Debug.LogError("❌ 短语音识别AccessToken 解析失败: " + ex.Message);}}else{Debug.LogError("❌ 短语音识别获取 AccessToken 失败: " + request.error);}}}[Serializable]public class TokenResponse{/// <summary>/// 鉴权返回结构/// </summary>public string access_token;}#endregion
}

3、实现效果

在这里插入图片描述

相关文章:

  • DOM型XSS深度渗透实战
  • DL00215-基于YOLOv11的太阳能电池红外异常检测含数据集
  • 不同AI架构如何选择?单Agent+MCP“与“多Agent“架构对比分析!
  • GDB 简介与使用示例:程序调试从这里开始!
  • python使用pydantic库结合fastApi实现接口参数验证
  • 华为OD机试-最佳植树距离-二分(JAVA 2025A卷)
  • Linux:信号和线程
  • Hive优化详细讲解
  • AI与大数据如何驱动工业品电商平台的智能决策?
  • WRF-Hydro分布式水文模型:洪水预报、水资源管理与规划、生态水文研究、气候变化影响评估、流域综合管理、水电工程规划与运行
  • C++问题:深拷贝和浅拷贝
  • 华为网路设备学习-25(路由器OSPF - 特性专题 二)
  • 【图像处理入门】11. 深度学习初探:从CNN到GAN的视觉智能之旅
  • 超高速10G采集卡
  • 《记者观察》期刊投稿
  • ③-1实现 FastAdmin 默认开启通用搜索功能的方法
  • python3控制流程
  • 教师办工专用 资源包|课件+手抄报+PPT模板+常用表格 PDF格式93GB
  • Java八股文——计算机网络「网络攻击篇」
  • 数据结构 6(算法)
  • 学慧网的网站是谁家做的/seo服务包括哪些
  • 成都建材网站建设/什么是网络营销公司
  • 1688一件代发详细步骤/seo排名点击
  • 企业网站建设的基本原则/最佳的资源搜索引擎
  • 网站怎么防黑客/电商网站订烟
  • 做网站与平台的区别/seo常见优化技术