赞
踩
- using NAudio.Wave;
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Net;
- using System.Text;
- using UnityEngine;
- using Xfrog.Net;
- public class AsrResponse
- {
- public int err_no;
- public string err_msg;
- public string sn;
- public string[] result;
- public static AsrResponse CreateFromJSON(string jsonString)
- {
- return JsonUtility.FromJson<AsrResponse>(jsonString);
- }
- }
- public class record : MonoBehaviour
- {
- AudioClip audioClip;
- AudioSource audioSource;
-
- public int recordTime=5;
- Use this for initialization
- void Start()
- { audioSource = GameObject.Find("Canvas/Audio Source").GetComponent<AudioSource>();
- string[] md = Microphone.devices;
- int mdl = md.Length;
- if (mdl == 0)
- {
- Debug.Log("no microphone found");
- }
- }
-
- Update is called once per frame
- //void Update () {
-
- //}
- public void StartRecordAudio()
- {
-
- Microphone.End(null);
- audioClip = Microphone.Start(null, false, recordTime, 16000);
- Debug.Log("开始录音.....");
- // if(Microphone.GetPosition())
- if (!Microphone.IsRecording(null))
- {
- Debug.Log("没有声音.....");
- return;
- }
- Microphone.GetPosition(null);
-
- }
-
- public void StopRecordAudio()
- {
- /***文件读取为字节流***
- FileInfo fi = new FileInfo("d:\\1.wav");
- FileStream fs = new FileStream("d:\\1.wav", FileMode.Open);
- byte[] buffer = new byte[fs.Length];
- fs.Read(buffer, 0, buffer.Length);
- fs.Close();
- ***/
- Microphone.End(null);
-
-
-
- //*************使用语音识别api
- byte[] buffer = ConvertAudioClipToPCM16(audioClip);
- //byte[] buffer = GetClipData();
- HttpWebRequest request = null;
- //request = (HttpWebRequest)HttpWebRequest.Create("https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=ZH-CN&format=detailed");
- request = (HttpWebRequest)HttpWebRequest.Create("http://vop.baidu.com/server_api?lan=zh&cuid=B8-81-98-41-3E-E9&token=24.91d00cdafeef1490ec706f7e2f2659e1.2592000.1524029061.282335-10681472");
- request.SendChunked = true;
- request.Accept = @"application/json;text/xml";
- request.Method = "POST";
- request.ProtocolVersion = HttpVersion.Version11;
- // request.ContentType = @"audio/wav; codec=audio/pcm; samplerate=16000";
- request.ContentType = @"audio/pcm; rate = 16000";
- request.Headers["Ocp-Apim-Subscription-Key"] = "e8cd273d62c347cb9f64d6b94b94435d";
- request.ContentLength = buffer.Length;
- // Send an audio file by 1024 byte chunks
- /*
- * Open a request stream and write 1024 byte chunks in the stream one at a time.
- */
- using (Stream requestStream = request.GetRequestStream())
- {
- requestStream.Write(buffer, 0, buffer.Length);
- }
- Debug.Log("Response:");
- string responseString;
- WebResponse response = request.GetResponse();
- Debug.Log(((HttpWebResponse)response).StatusCode);
- StreamReader sr = new StreamReader(response.GetResponseStream());
- responseString = sr.ReadToEnd();
- responseString = AsrResponse.CreateFromJSON(responseString).result[0];
- Debug.Log(responseString);
-
-
-
- //************图灵api得到回答
- string url = "http://www.tuling123.com/openapi/api";
- string key = "7c664d28fa0b472ab9833c2679c431f5";
- string postDataStr = "key=" + key + "&info=" + responseString;
- string result = HttpGet(url, postDataStr);
- JsonObject newObj = new JsonObject(result);
- string info = newObj["text"].Value.ToString();
- Debug.Log(info);
-
- **************合成语音不支持linux和window只支持移动端,据说mp3版权问题,无法直接在window上播放,也就是无法从网上或者文件里读取播放。场景里的应该被转编码了。
- //string url_speaker = "http://tsn.baidu.com/text2audio";
- //string postDataStr_speaker = "tex=" + info + "&lan=zh&cuid=B8-81-98-41-3E-E9&ctp=1&tok=24.d1ba8c1f1efa8a3de68678e5404d55a4.2592000.1523629153.282335-10681472&ctp=1&cuid=10681472";
- //string req = url_speaker + "?" + postDataStr_speaker;
- //WWW www = new WWW(req); // start a download of the given URL
- //audioSource.clip = www.GetAudioClip(true, false, AudioType.MPEG); // 2D, streaming
- //audioSource.Play();
-
-
-
- //**************合成语音
- string url2 = "http://tsn.baidu.com/text2audio";
- byte[] buffer2 = null;
- string postDataStr2 = "tex=" + info + "&lan=zh&cuid=B8-81-98-41-3E-E9&ctp=1&tok=24.d1ba8c1f1efa8a3de68678e5404d55a4.2592000.1523629153.282335-10681472";
-
- HttpWebRequest request2 = (HttpWebRequest)WebRequest.Create(url2 + "?" + postDataStr2);
- request2.Method = "GET";
- request2.ContentType = "text/html;charset=UTF-8";
- HttpWebResponse response2 = (HttpWebResponse)request2.GetResponse();
-
- using (Stream stream = response2.GetResponseStream())
- {
- //buffer2 = new byte[stream.Length]; 报错*******无法取得响应流,应该用什么先盛放一下
-
- // long length = request2.ContentLength;
- //buffer2 = new byte[length];///数字溢出
- // stream.Read(buffer2, 0, (int)length);
- //BinaryReader br = new BinaryReader(stream);
- // buffer2 = br.ReadBytes((int)stream.Length);
-
- byte[] buffer3 = new byte[16*1096];
- using (MemoryStream memoryStream = new MemoryStream())
- {
- int count = 0;
- do
- {
- count = stream.Read(buffer3, 0, buffer3.Length);
- memoryStream.Write(buffer3, 0, count);
-
- } while (count != 0);
-
- buffer2 = memoryStream.ToArray();
-
- }
-
-
-
- }
- audioSource.clip = FromMp3Data(buffer2);
- audioSource.Play();
- }
- /// <summary>
- /// 将mp3格式的字节数组转换为audioclip
- /// </summary>
- /// <param name="data"></param>
- /// <returns></returns>
-
- public static AudioClip FromMp3Data(byte[] data)
- {
- // Load the data into a stream
- MemoryStream mp3stream = new MemoryStream(data);
- // Convert the data in the stream to WAV format
- Mp3FileReader mp3audio = new Mp3FileReader(mp3stream);
-
- WaveStream waveStream = WaveFormatConversionStream.CreatePcmStream(mp3audio);
- // Convert to WAV data
- Wav wav = new Wav(AudioMemStream(waveStream).ToArray());
-
- AudioClip audioClip = AudioClip.Create("testSound", wav.SampleCount, 1, wav.Frequency, false);
- audioClip.SetData(wav.LeftChannel, 0);
- // Return the clip
- return audioClip;
- }
-
- private static MemoryStream AudioMemStream(WaveStream waveStream)
- {
- MemoryStream outputStream = new MemoryStream();
- using (WaveFileWriter waveFileWriter = new WaveFileWriter(outputStream, waveStream.WaveFormat))
- {
- byte[] bytes = new byte[waveStream.Length];
- waveStream.Position = 0;
- waveStream.Read(bytes, 0, Convert.ToInt32(waveStream.Length));
- waveFileWriter.Write(bytes, 0, bytes.Length);
- waveFileWriter.Flush();
- }
- return outputStream;
- }
- //**********audioClip格式转成字节流
- public static byte[] ConvertAudioClipToPCM16(AudioClip clip)
- {
- var samples = new float[clip.samples * clip.channels];
- clip.GetData(samples, 0);
- var samples_int16 = new short[samples.Length];
-
- for (var index = 0; index < samples.Length; index++)
- {
- var f = samples[index];
- samples_int16[index] = (short)(f * short.MaxValue);
- }
-
- var byteArray = new byte[samples_int16.Length * 2];
- Buffer.BlockCopy(samples_int16, 0, byteArray, 0, byteArray.Length);
-
- return byteArray;
-
- }
- ************把mp3转换成audioclip
- //public static AudioClip FromMp3Data(byte[] data)
- //{
- // // Load the data into a stream
- // MemoryStream mp3stream = new MemoryStream(data);
- // // Convert the data in the stream to WAV format
- // Mp3FileReader mp3audio = new Mp3FileReader(mp3stream);
-
- // WaveStream waveStream = WaveFormatConversionStream.CreatePcmStream(mp3audio);
- // // Convert to WAV data
- // Wav wav = new Wav(AudioMemStream(waveStream).ToArray());
-
- // AudioClip audioClip = AudioClip.Create("testSound", wav.SampleCount, 1, wav.Frequency, false);
- // audioClip.SetData(wav.LeftChannel, 0);
- // // Return the clip
- // return audioClip;
- //}
-
- //用于http get请求
- public static string HttpGet(string Url, string postDataStr)
- {
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
- request.Method = "GET";
- request.ContentType = "text/html;charset=UTF-8";
- HttpWebResponse response = (HttpWebResponse)request.GetResponse();
- Stream myResponseStream = response.GetResponseStream();
- StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
- string retString = myStreamReader.ReadToEnd();
- myStreamReader.Close();
- myResponseStream.Close();
- return retString;
-
-
- }
- public void PlayRecordAudio()
- {
- Microphone.End(null);
- audioSource.clip = audioClip;
- audioSource.Play();
- }
- public void EndPlayRecordAudio()
- {
- Microphone.End(null);
- audioSource.Stop();
- }
-
-
-
-
- /// <summary>
- /// 把录音转换为Byte[]
- /// </summary>
- /// <returns></returns>
- //public byte[] GetClipData()
- //{
- // if (audioClip == null)
- // {
- // //Debug.LogError("录音数据为空");
- // Debug.Log("录音数据为空");
- // return null;
- // }
-
- // float[] samples = new float[audioClip.samples];
-
- // audioClip.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)
- // {
- // //Debug.LogError("录音数据为空");
- // Debug.Log("录音数据为空");
- // return null;
- // }
-
- // //return SubByte(outData, 0, audioLength * 8000 * 2);
- // return outData;
- //}
- }
项目失败,unity3d windows和ubuntu不支持mp3流,
using NAudio.Wave;
转换只在windows上起效。
所以这份代码只在windows上和移动平台,安卓,ios上起效。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。