Example #1
0
    /// <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
    }
Example #2
0
    // Use this for initialization
    void Awake()
    {
        audioSrc = GetComponent <AudioSource>();
        _speex   = new Speex();

        AudioSettings.speakerMode = AudioSpeakerMode.Mono;

        InitDeNoiseProcess();
    }
Example #3
0
    /// <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));
        }
    }
Example #4
0
        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;
            }
        }
Example #5
0
        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();
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }