abcdkjwb 2023-08-21 02:18 采纳率: 50%
浏览 14
已结题

C#百度AI语音识别

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);
            }
        }

    }
    
}

希望有人能解答我的这个问题,万分感谢!

  • 写回答

17条回答 默认 最新

  • 喝茶品人生 2023-08-21 09:35
    关注
    获得0.80元问题酬金

    错误就提示两个问题:"Params error."和"parameter error.",堆栈跟踪中显示了空引用异常,跟前面两个提示一样存在参数错误,你要自己对应百度AI的官方文档去检查检查对应参数引用啥的,这种问题最好的解决办法就是直接联系发布视频的人,如果他们是引流卖课当我没说

    评论

报告相同问题?

问题事件

  • 系统已结题 8月29日
  • 修改了问题 8月21日
  • 修改了问题 8月21日
  • 修改了问题 8月21日
  • 展开全部

悬赏问题

  • ¥30 为什么会失败呢,该如何调整
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析