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);
}
}
}
}
希望有人能解答我的这个问题,万分感谢!