/// <summary> /// 获取音频 /// </summary> /// <param name="id"></param> /// <param name="flag"></param> /// <param name="source"></param> public static void GetAudioPacket(int id, int flag, byte[] source) { CompressPacket packet = AudioDecoder(source); byte[] data = new byte[packet.DataLength]; Buffer.BlockCopy(packet.Data, 0, data, 0, packet.CompLength); float[] sample = Speex.DeCompress(data, packet.CompLength); AudioCache Cache = null; if (AudioCacheDic.Keys.Contains(id)) { Cache = AudioCacheDic[id]; } else { //最大接收人数限制 if (AudioCacheDic.Count < MaxSpeakNum) { Cache = new AudioCache(id, flag); AudioCacheDic.Add(id, Cache); } } #if DEBUG Debug.Log("UpdateAudioLength: " + packet.AudioLength); #endif if (Cache != null) { Cache.UpData(flag, packet.AudioLength, sample); } //#if DEBUG // Debug.Log("接收:" + Cache.data.Count); //#endif }
// Use this for initialization void Awake() { audioSrc = GetComponent <AudioSource>(); _speex = new Speex(); AudioSettings.speakerMode = AudioSpeakerMode.Mono; InitDeNoiseProcess(); }
/// <summary> /// 数据封装发送 flag flag 2表示取消 0表示未完成 1表示完成 /// </summary> /// <param name="flag"></param> /// <param name="sampleBuffer"></param> void TransmitBuffer(int flag, float[] sampleBuffer) { //#if DEBUG // Debug.Log("发送:" + (test += sampleBuffer.Length)); //#endif int length = 0; byte[] buffer = Speex.SpeexCompress(sampleBuffer, out length); CompressPacket packet = new CompressPacket(); byte[] availableSampleBuffer = new byte[length]; Buffer.BlockCopy(buffer, 0, availableSampleBuffer, 0, length); packet.AudioLength = audioLength; packet.Data = availableSampleBuffer; packet.CompLength = length; packet.DataLength = buffer.Length; if (OnReComplete != null) { OnReComplete(flag, AudioEncoder(packet)); } }
protected virtual void Init(MediaFrame frame) { if (!_inited && frame.IsKeyFrame == 1 && frame.IsAudio == 1) { if (frame.Encoder == MediaFrame.AAC_Encoder) { _aac = new FFImp(AVCodecCfg.CreateAudio(frame.Channel, frame.Frequency, (int)AVCode.CODEC_ID_AAC), true, false); } if (frame.Encoder == MediaFrame.SPEXEncoder) { _speex = _speex ?? new Speex(4, 160); } if (WaveOut.Devices == null || WaveOut.Devices.Length == 0) { } else { _wave = new WaveOut(WaveOut.Devices[0], frame.Frequency, 16, frame.Channel); } _inited = true; } }
protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); if (String.IsNullOrEmpty(Settings.CachedAuthenticationToken)) { NavigationService.Navigate(new Uri("/SettingsPage.xaml", UriKind.Relative)); return; } if (e.NavigationMode == NavigationMode.Back) { return; } User.Text = "Hello " + Settings.Username; client = new SpeechServiceClient( GetBinding(), GetEndpointAddress("Speech")); client.RecognizeCompleted += (o1, e1) => { HideProgress(); if (e1.Error != null) { if (e1.Error.GetType() == typeof(FaultException <AuthenticationFault>)) { GetAuthenticationToken( new Action( () => { client.RecognizeAsync( Settings.CachedAuthenticationToken, encodedFrames.ToArray(), false, null, null); } )); } else { MessageBox.Show(e1.Error.Message); } return; } if (e1.Result.AnswerSpeech != null && e1.Result.AnswerSpeech.Length > 0) { // Play the audio in a new thread so the UI can update. new Thread( () => { byte[] speechBuffer = Speex.DecodeAllFrames(e1.Result.AnswerSpeech); //SoundEffect sound = new SoundEffect(speechBuffer, 24000, AudioChannels.Mono);//microphone.SampleRate, AudioChannels.Mono); //soundInstance = sound.CreateInstance(); //soundInstance.Play(); }).Start(); } // TODO: MessageBox.Show(String.Format("I am {0}% confident you said \"{1}\". To which I reply \"{2}\".", e1.Result.Confidence * 100, e1.Result.Command, e1.Result.AnswerText)); }; int counter = 0; foreach (var endpoint in Settings.Endpoints) { if (endpoint.Key == "Speech" || endpoint.Key == "Recipes") { continue; } HubTile tile = new HubTile() { Margin = new Thickness(12, 12, 0, 0), Source = new BitmapImage(new Uri("/Images/" + endpoint.Key + ".png", UriKind.Relative)), Name = endpoint.Key, //Title = endpoint.Key, IsFrozen = true, //Background = (SolidColorBrush)Resources["PhoneAccentBrush"], //Message = "Message", //DisplayNotification = true, //Notification = "Notification", }; tile.SetValue(Grid.ColumnProperty, counter % 2); tile.SetValue(Grid.RowProperty, counter / 2); tile.Tap += (o1, e1) => { NavigationService.Navigate(new Uri("/" + ((HubTile)o1).Name + "Page.xaml", UriKind.Relative)); }; tile.MouseLeftButtonDown += (o1, e1) => { System.Windows.Point tmpPoint = e1.GetPosition(null); contextMenuSelectedHubTile = null; List <UIElement> oControls = (List <UIElement>)VisualTreeHelper.FindElementsInHostCoordinates(tmpPoint, this); foreach (UIElement ctrl in oControls) { if (ctrl is HubTile) { contextMenuSelectedHubTile = (HubTile)ctrl; break; } } }; TileGrid.Children.Add(tile); counter++; } HideProgress(); }
public int Encode(byte[] inputBuffer, int inputBufferOffset, int dataLength, byte[] outputBuffer, int outputBufferOffset, int quality) { var compressedSize = 0; var speexBits = new Speex.SpeexBits(); var compressedBits = new byte[MAX_FRAME_SIZE]; var unmanagedStorage = IntPtr.Zero; try { var encoderState = IntPtr.Zero; unmanagedStorage = Marshal.AllocHGlobal(4); try { var mode = Speex.speex_lib_get_mode(Speex.SPEEX_MODEID_NB); var header = new Speex.SpeexHeader(); const int rate = 8000; Speex.speex_init_header(ref header, rate, 1, mode); header.frames_per_packet = 1; header.vbr = 0; header.nb_channels = 1; encoderState = Speex.speex_encoder_init(mode); Speex.speex_encoder_ctl(encoderState, Speex.SPEEX_GET_FRAME_SIZE, unmanagedStorage); var frameSize = Marshal.ReadInt32(unmanagedStorage); const int complexity = 10; Marshal.WriteInt32(unmanagedStorage, complexity); Speex.speex_encoder_ctl(encoderState, Speex.SPEEX_SET_COMPLEXITY, unmanagedStorage); Marshal.WriteInt32(unmanagedStorage, rate); Speex.speex_encoder_ctl(encoderState, Speex.SPEEX_SET_SAMPLING_RATE, unmanagedStorage); Marshal.WriteInt32(unmanagedStorage, quality); Speex.speex_encoder_ctl(encoderState, Speex.SPEEX_SET_QUALITY, unmanagedStorage); const int lookahead = 0; Marshal.WriteInt32(unmanagedStorage, lookahead); Speex.speex_encoder_ctl(encoderState, Speex.SPEEX_GET_LOOKAHEAD, unmanagedStorage); Speex.speex_bits_init(ref speexBits); var input = new byte[MAX_FRAME_SIZE]; using (var inStream = new MemoryStream(inputBuffer, inputBufferOffset, dataLength)) using ( var outStream = new MemoryStream(outputBuffer, outputBufferOffset, outputBuffer.Length - outputBufferOffset)) { while (true) { var pcmBytesToRead = 16 / 8 * header.nb_channels * frameSize; var numBytesRead = inStream.Read(input, 0, pcmBytesToRead); if (numBytesRead == 0) { break; } var numSamplesToBlank = (pcmBytesToRead - numBytesRead) / (16 / 8 * header.nb_channels); var numSamplesRead = numBytesRead / (16 / 8 * header.nb_channels); for (var i = numSamplesRead; i < numSamplesRead + numSamplesToBlank; i++) { input[(i * 2)] = 0; input[(i * 2) + 1] = 0; } var thisFrameBytesAsShort = new short[input.Length / 2]; for (var i = 0; i < thisFrameBytesAsShort.Length; i++) { thisFrameBytesAsShort[i] = BitConverter.ToInt16(input, (i * 2)); } Speex.speex_encode_int(encoderState, thisFrameBytesAsShort, ref speexBits); Speex.speex_bits_insert_terminator(ref speexBits); var numBytesEncodedThisFrame = (byte)Speex.speex_bits_write(ref speexBits, compressedBits, MAX_FRAME_SIZE); Speex.speex_bits_reset(ref speexBits); outStream.WriteByte(numBytesEncodedThisFrame); compressedSize += 1; outStream.Write(compressedBits, 0, numBytesEncodedThisFrame); compressedSize += numBytesEncodedThisFrame; } } } finally { Speex.speex_encoder_destroy(encoderState); Speex.speex_bits_destroy(ref speexBits); } } finally { Marshal.FreeHGlobal(unmanagedStorage); } return(compressedSize); }
public int Decode(byte[] inputBuffer, int inputBufferOffset, int dataLength, ref byte[] outputBuffer, int outputBufferOffset) { var speexBits = new Speex.SpeexBits(); var decoderState = IntPtr.Zero; var bytesWritten = 0; var compressedBits = new byte[200]; var decompressedBits = new short[MAX_FRAME_SIZE]; var unmanagedStoragePointer = IntPtr.Zero; var compressedBitsGCHandle = new GCHandle(); var decompressedBitsGCHandle = new GCHandle(); try { unmanagedStoragePointer = Marshal.AllocHGlobal(4); compressedBitsGCHandle = GCHandle.Alloc(compressedBits, GCHandleType.Pinned); decompressedBitsGCHandle = GCHandle.Alloc(decompressedBits, GCHandleType.Pinned); try { Speex.speex_bits_init(ref speexBits); var mode = Speex.speex_lib_get_mode(Speex.SPEEX_MODEID_NB); decoderState = Speex.speex_decoder_init(mode); Marshal.WriteInt32(unmanagedStoragePointer, 0); Speex.speex_decoder_ctl(decoderState, Speex.SPEEX_SET_ENH, unmanagedStoragePointer); Speex.speex_decoder_ctl(decoderState, Speex.SPEEX_GET_FRAME_SIZE, unmanagedStoragePointer); var frameSize = Marshal.ReadInt32(unmanagedStoragePointer); const int rate = 8000; Marshal.WriteInt32(unmanagedStoragePointer, rate); Speex.speex_decoder_ctl(decoderState, Speex.SPEEX_SET_SAMPLING_RATE, unmanagedStoragePointer); Speex.speex_decoder_ctl(decoderState, Speex.SPEEX_GET_LOOKAHEAD, unmanagedStoragePointer); var lookahead = Marshal.ReadInt32(unmanagedStoragePointer); using (var inStream = new MemoryStream(inputBuffer, inputBufferOffset, dataLength)) using ( var outstream = new MemoryStream(outputBuffer, outputBufferOffset, outputBuffer.Length - outputBufferOffset)) { while (true) { var numBytesThisFrame = inStream.ReadByte(); if (numBytesThisFrame < 1) { break; } var bytesRead = inStream.Read(compressedBits, 0, numBytesThisFrame); if (bytesRead < numBytesThisFrame) { throw new IOException("Unexpected end of stream encountered."); } Speex.speex_bits_read_from(ref speexBits, compressedBits, numBytesThisFrame); var returnVal = Speex.speex_decode_int(decoderState, ref speexBits, decompressedBits); var bitsRemaining = Speex.speex_bits_remaining(ref speexBits); if (returnVal == -1) { break; } if (returnVal == -2) { throw new IOException("Decoding error: corrupted stream?\n"); } else if (bitsRemaining < 0) { throw new IOException("Decoding overflow: corrupted stream?\n"); } for (var i = 0; i < frameSize; i++) { if (outstream.Position > outstream.Length - 2) { break; } outstream.Write(BitConverter.GetBytes(decompressedBits[i]), 0, 2); bytesWritten += 2; } } outstream.Flush(); outstream.Close(); inStream.Close(); } } finally { Speex.speex_decoder_destroy(decoderState); Speex.speex_bits_destroy(ref speexBits); } } finally { Marshal.FreeHGlobal(unmanagedStoragePointer); compressedBitsGCHandle.Free(); decompressedBitsGCHandle.Free(); //modeGCHandle.Free(); } return(bytesWritten); }