C#语音识别 用的百度AI,B站视频里的代码
部分代码如下:(我觉得问题在这里面)
这是获取到的result:{"err_detail":"Params error.","err_msg":"parameter error.","err_no":501,"err_subcode":29,"tts_logid":2240285032}
这是错误描述
NullReferenceException: Object reference not set to an instance of an object
SpeechRecognize+d__21.MoveNext () (at Assets/Scripts/SpeechRecognize.cs:196)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <978764d1d9b243168a3a9f50b21a9490>:0)
```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using LitJson;
using UnityEngine.UI;
using UnityEngine.Events;
using System;
[RequireComponent(typeof(AudioSource))]
public class SpeechRecognize : MonoBehaviour
{
public string APP_ID = "XX";
public string API_KEY = "XX";
public string SECRET_KEY = "XX";
public string GetTokenUrl = "https://aip.baidubce.com/oauth/2.0/token";
public string Access_Token = "";
[Header("录音按钮")]
public Button RecordButton;
[Header("是否在录音的状态")]
public bool isRecording = false;
[Header("麦克风设备的名字")]
public string MicrophoneName = "";
public AudioClip RecordAudioClip;
public AudioSource audioSource;
public string SpeechRecognition_Address = "http://tsn.baidu.com/text2audio";
public string SpeechSynthesis_Address = "http://tsn.baidu.com/text2audio";
[Header("识别到的文字")]
public string RecognizeContent = "";
[Header("录音的时长")]
public int recordTime=5;
public class AccessToken
{
public string access_token;
public int expires_in;
public string session_key;
public string scope;
public string refresh_token;
public string session_secret;
}
public class RecognizeResult
{
public string corpus_no;
public string err_msg;
public int err_no;
public List<string> result;
public string sn;
}
[Obsolete]
private void Start()
{
GetToken(GetTokenUrl);
RecordButton.onClick.AddListener(OnRecordButtonClick);
if(Microphone.devices.Length > 0 )
{
MicrophoneName = Microphone.devices[0];
}
else
{
Debug.LogError("当前设备缺少麦克风设备进行录制");
}
audioSource = GetComponent<AudioSource>();
}
[Obsolete]
private void OnRecordButtonClick()
{
if(isRecording==false)
{
isRecording = true;
RecordAudioClip = Microphone.Start(MicrophoneName, false, recordTime, 16000);
RecordButton.GetComponent<Image>().color = Color.red;
}
else
{
isRecording=false;
Microphone.End(MicrophoneName);
RecordButton.GetComponent <Image>().color = Color.white;
audioSource.PlayOneShot(RecordAudioClip);
StartCoroutine(Recognition(RecordAudioClip,recordTime));
}
}
[Obsolete]
public void GetToken(string url)
{
WWWForm form = new();
form.AddField("grant_type", "client_credentials");
form.AddField("client_id", API_KEY);
form.AddField("client_secret", SECRET_KEY);
StartCoroutine(HttpPostRequest(url, form));
}
[Obsolete]
IEnumerator HttpPostRequest(string url,WWWForm form)
{
UnityWebRequest unityWebRequest=UnityWebRequest.Post(url, form);
yield return unityWebRequest.SendWebRequest();
if(unityWebRequest.isNetworkError)
{
Debug.Log("网络错误"+unityWebRequest.error);
}
else
{
if(unityWebRequest.responseCode == 200)
{
string result = unityWebRequest.downloadHandler.text;
print("成功获取到数据:" + result);
OnGetHttpResponse_Success(result);
}
else
{
print("状态码不为200:" + unityWebRequest.responseCode);
}
}
}
private void OnGetHttpResponse_Success(string result)
{
AccessToken accessToken=JsonMapper.ToObject<AccessToken>(result);
Access_Token = accessToken.access_token;
}
[Obsolete]
IEnumerator Recognition(AudioClip audioClip,int recordTime)
{
WWWForm form=new();
string url = string.Format("{0}?cuid={1}&token={2}", SpeechRecognition_Address, SystemInfo.deviceUniqueIdentifier, Access_Token);
float[]samples=new float[16000* recordTime * audioClip.channels];
audioClip.GetData(samples, 0);
short[]sampleShort=new short[samples.Length];
for(int i=0; i<samples.Length; i++)
{
sampleShort[i] = (short)(samples[i]*short.MaxValue);
}
byte[] data = new byte[sampleShort.Length * 2];
Buffer.BlockCopy(sampleShort,0,data,0,data.Length);
form.AddBinaryData("audio", data);
UnityWebRequest request = UnityWebRequest.Post(url, form);
request.SetRequestHeader("Content-Type", "audio/pcm;rate=16000");
yield return request.SendWebRequest();
Debug.Log(request.downloadHandler.text);
if (request.isNetworkError)
{
Debug.Log("网络错误" + request.error);
}
else
{
if (request.responseCode == 200)
{
string result = request.downloadHandler.text;
print("成功获取到数据:" + result);
RecognizeResult resultContent=JsonMapper.ToObject<RecognizeResult>(result);
RecognizeContent = resultContent.result[0];
RecordButton.GetComponentInChildren<Text>().text = resultContent.result[0];
}
else
{
print("状态码不为200:" + request.responseCode);
}
}
}
}
希望有人能解答我的这个问题,万分感谢!
错误就提示两个问题:"Params error."和"parameter error.",堆栈跟踪中显示了空引用异常,跟前面两个提示一样存在参数错误,你要自己对应百度AI的官方文档去检查检查对应参数引用啥的,这种问题最好的解决办法就是直接联系发布视频的人,如果他们是引流卖课当我没说
参数错误,估计是appkey之类的不正确,调用接口都需要有认证的appkey的。
如果有appkey的话,就需要检测下appkey和入参的参数是否正确。
【以下回答由 GPT 生成】
根据提供的代码和错误描述,问题出现在 SpeechRecognize 类的 SpeechRecognition 方法中。具体的错误是 NullReferenceException,意味着代码中一个对象的引用为 null,而我们试图对它进行操作。
根据提供的错误信息和代码,我们可以确定问题出现在此处的 SpeechRecognition 方法中:
IEnumerator SpeechRecognition()
{
// ...
UnityWebRequest www = UnityWebRequest.Post(url, form);
yield return www.SendWebRequest();
// ...
JsonData resultJson = JsonMapper.ToObject(www.downloadHandler.text);
RecognizeResult result = JsonMapper.ToObject<RecognizeResult>(resultJson.ToJson());
// ...
RecognizeContent = result.err_msg; // 这里是问题所在
// ...
}
根据错误信息,我们可以看到 result.err_msg 的值是 "parameter error.",这是错误的详细描述信息。根据代码,我们可以推断出问题出现在将 JSON 数据中的 err_msg 属性赋给 RecognizeContent 变量时。
问题可能出现在两个地方: 1. JsonMapper.ToObject(resultJson.ToJson()) 方法未能正确地将 JSON 数据转换为 RecognizeResult 对象。 2. RecognizeContent 变量没有正确地初始化或赋值。
针对问题1,由于无法查看程序的完整代码和 JSON 数据,我们无法确定出错的具体原因。建议使用调试工具查看 resultJson.ToJson() 返回的 JSON 字符串,以确保它符合 RecognizeResult 对象的结构。
对于问题2,我们可以尝试将 RecognizeContent 变量初始化为一个空字符串。在 SpeechRecognize 类中添加以下代码:
public <span class="hljs-built_in">string</span> RecognizeContent = "<span class="hljs-keyword">"</span>;
另外,还需确保调用 SpeechRecognize 方法时已经正确初始化 SpeechRecognize 类的实例,并且 RecognizeContent 变量应该属于实例变量而非静态变量。
如果问题仍然存在,请提供完整的代码和更多的上下文信息。
看你的报错``{"err_detail":"Params error.","err_msg":"parameter error.","err_no":501,"err_subcode":29,"tts_logid":2240285032}`,
看起来是参数问题,检查下你调用接口时候的参数:
如有问题随时沟通
如有帮助欢迎采纳
IEnumerator SpeechRecognition()
{
// ...
UnityWebRequest www = UnityWebRequest.Post(url, form);
yield return www.SendWebRequest();
// ...
public string RecognizeContent = "";
JsonData resultJson = JsonMapper.ToObject(www.downloadHandler.text);
RecognizeResult result = JsonMapper.ToObject<RecognizeResult>(resultJson.ToJson());
// ...
RecognizeContent = result.err_msg; // 这里是问题所在
// ...
}
引用chatgpt内容作答:
你遇到的错误是NullReferenceException,特定在你的SpeechRecognize.cs脚本的第196行。然而,你的代码片段中没有提供第196行的代码,所以我假设它出现在Recognition方法内。
错误消息"NullReferenceException: Object reference not set to an instance of an object"通常意味着你正试图访问一个当前为null的对象的成员或属性。在你的情况下,可能与试图访问未正确初始化的对象的属性或字段有关。
以下是诊断并可能修复该问题的步骤:
1、检查第196行:由于你提到错误出现在SpeechRecognize.cs脚本的第196行,请确保确定在该方法中的哪一行代码引起了问题。仔细检查是否在该行之前访问了任何对象的属性、方法或字段。
2、检查对象初始化:查看你在代码的那部分中使用的对象。确保在该行之前正确初始化了你要访问的对象。如果对象为null,则需要确保在使用之前对其进行适当的初始化。
3、检查返回的数据:如果错误不在第196行,而是在从该位置调用的方法中发生(比如你的协程),确保从协程前面步骤返回的任何数据都不是null。
4、调试和日志:插入调试日志或使用断点,在代码的不同点打印出对象、变量和数组的值,尤其是在发生错误的行之前。这将帮助你了解问题的原因。
以下是如何修改你的代码以添加一些调试日志并更好地处理潜在的空引用的示例:
IEnumerator Recognition(AudioClip audioClip, int recordTime)
{
// ... (其他代码)
UnityWebRequest request = UnityWebRequest.Post(url, form);
request.SetRequestHeader("Content-Type", "audio/pcm;rate=16000");
yield return request.SendWebRequest();
if (request.isNetworkError)
{
Debug.Log("网络错误:" + request.error);
}
else
{
if (request.responseCode == 200)
{
string result = request.downloadHandler.text;
Debug.Log("成功获取到数据:" + result);
RecognizeResult resultContent = JsonMapper.ToObject<RecognizeResult>(result);
if (resultContent.result != null && resultContent.result.Count > 0)
{
RecognizeContent = resultContent.result[0];
Debug.Log("识别结果:" + RecognizeContent);
RecordButton.GetComponentInChildren<Text>().text = RecognizeContent;
}
else
{
Debug.LogWarning("识别结果为空");
}
}
else
{
Debug.Log("状态码不为200:" + request.responseCode);
}
}
}
调试和诊断此类问题可能需要一些试错,以及对代码中的数据流和对象初始化的仔细检查。
参数字段不对,报错的原因应该是这个
参考gpt:
结合自己分析给你如下建议:
根据我的搜索结果,您遇到的错误码是 501,错误描述是 parameter error,错误细节是 Params error。这意味着您的请求参数有误,导致语音识别服务无法正常处理您的请求。
可能导致参数错误的原因有以下几种:
您的请求参数缺少必要的字段,比如 access_token、format、rate、dev_pid 等。您需要检查您的请求参数是否完整,并且符合 API 文档的要求。
您的请求参数格式不正确,比如 access_token 不是字符串类型,或者 format 不是支持的音频格式,或者 rate 不是支持的采样率,或者 dev_pid 不是支持的语言模型等。您需要检查您的请求参数是否正确,并且符合 API 文档的要求。
您的请求参数值不匹配,比如 access_token 已经过期或无效,或者 format 和 rate 与音频文件不一致,或者 dev_pid 与音频文件不匹配等。您需要检查您的请求参数是否有效,并且与音频文件相符。
我建议您根据以上可能的原因,对照 API 文档和示例代码,检查并修改您的请求参数,然后重新尝试语音识别服务。如果问题仍然存在,您可以联系百度AI开放平台的技术支持或社区寻求帮助。
你的代码中使用了 UnityWebRequest.Post 来发送请求,但你在请求头部中并没有指定使用 https 协议。如果你的接口地址是使用 https,你需要在请求头部中明确指定协议。
NullReferenceException: Object reference not set to an instance of an object。这可能是因为在你的代码中存在空引用异常,某些对象没有被正确实例化或赋值。请确保所有需要用到的对象都被正确初始化。
err_detail":"Params error.","err_msg":"parameter error.","err_no":501,"err_subcode":29,"tts_logid":2240285032。这可能是由于在请求参数或头部中出现错误或缺失。确保你在发送请求时提供了正确的参数和头部。
报空指针了,应该是参数配置的有问题,建议下载官方的sdk 里面一般都有现成的demo可以运行。
参考我的这个案例
在线语音转文字工具V1.0_IT技术分享社区的博客-CSDN博客
C# 10分钟完成百度语音技术(语音识别与合成)
可以参考下
https://xin3721.com/ArticlecSharp/csharpvbnet_34846.html
https://ai.baidu.com/forum/topic/show/497150
你传递给百度AI的参数存在问题
参考gpt
参数错误:根据错误信息"Params error."和"parameter error.",可能是你在使用百度AI语音识别时传递的参数有误。请检查你的代码,确保你传递的参数是正确的,并且符合百度AI语音识别接口的要求。
空引用异常:根据错误信息"NullReferenceException: Object reference not set to an instance of an object",可能是在代码的某个地方出现了空引用异常。请检查你的代码,特别是在SpeechRecognize.cs文件的196行,确保你没有对一个空对象进行操作或访问。
针对这些问题,你可以尝试以下步骤来解决:
检查参数:仔细检查你在调用百度AI语音识别接口时传递的参数,确保参数的格式和值是正确的。你可以参考百度AI语音识别的官方文档,查看参数的要求和示例。
调试空引用异常:在SpeechRecognize.cs文件的196行,检查是否有可能出现空引用异常的地方。你可以使用调试工具(如Visual Studio的调试器)来逐步执行代码并查看变量的值,以找到引起空引用异常的原因。
查看百度AI文档和示例:如果问题仍然存在,建议查看百度AI语音识别的官方文档和示例代码,以获取更详细的使用说明和示例。你可以参考百度AI开发者中心的文档和资源,或者搜索相关的教程和问题解答。
根据错误来看,应该是执行某个对象实例化的过程中发生了 NullReferenceException 异常。这种异常一般是由于访问一个空引用对象的方法或属性导致的错误。问题可能出现在 SpeechRecognize.cs 文件的第 196 行。请检查下代码
参数错误,原因都很清楚的,你对接百度的参数检查一下