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上起效。