none
Usar un progressbarr como ecualizador RRS feed

  • Pregunta

  • Hola, perdón si la pregunta les parece tonta. Estoy trabajando con Microsoft Visual Studio, creando un proyecto en WPF. Lo qué hago es un asistente virtual y quiero ponerle una progressbarr que se expanda (no sé si se dice así) según habla el asistente, un ecualizador para su voz. Cómo puedo hacer eso? Estoy usando C#. Ayúdenme por favor.

    Gracias. 

    • Cambiado Laura Ceglz jueves, 20 de octubre de 2016 15:44
    miércoles, 19 de octubre de 2016 22:03

Respuestas

  • Ok, el nivel de audio del render. Así...

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication1"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
        <Grid>
            <ProgressBar x:Name="peakmeter" HorizontalAlignment="Left" Height="85" VerticalAlignment="Top" Width="474" Margin="22,83,0,0" Maximum="1" SmallChange="0.01"/>
        </Grid>
    </Window>
    // /r:naudio.dll
    // https://naudio.codeplex.com/
    using NAudio.CoreAudioApi;
    using System;
    using System.Windows;
    using System.Windows.Threading;
    
    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            AudioMeterInformation pmSalida;
    
            public float Pico
            {
                get
                {
                    return pmSalida.MasterPeakValue;
                }
            }
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                MMDeviceEnumerator de = new MMDeviceEnumerator();
                MMDevice d = de.GetDefaultAudioEndpoint(DataFlow.Render, Role.Console);
                pmSalida = d.AudioMeterInformation;
    
                DispatcherTimer dt = new DispatcherTimer();
                dt.Tick += ActualizaBarraProgreso;
                dt.Interval = TimeSpan.FromMilliseconds(100);
                dt.Start();
            }
    
            private void ActualizaBarraProgreso(object sender, EventArgs e)
            {
                peakmeter.Value = Pico;
            }
    
        }
    
    }

    En el ejemplo, la barra de progreso se llama "peakmeter".



    • Editado walter_5 jueves, 20 de octubre de 2016 14:11
    • Marcado como respuesta SiYue Music jueves, 20 de octubre de 2016 19:19
    jueves, 20 de octubre de 2016 14:09

Todas las respuestas

  • La pregunta no es tonta, pero sería bueno que nos explicaras que significa "ecualizador" en tu pregunta.

    Digo, da la impresión de que lo que buscas es un peakmeter. El servicio está disponible en el api de core audio. Es algo bastante sencillo: obtienes el endpoint del micrófono y su control de volumen. El driver de audio analiza, por ejemplo, 200 ms de samples y determina cual fue el pico. Luego usas un timer para consultar ese valor que bindeas a la progressbar.

    Claro, si se trata realmente de un ecualizador, entonces hablamos de otra cosa. Uno debería procesar el búfer con los samples, filtrar las frecuencias (transformada de fourier, FFT), y luego mostrarla en un control que dudo pueda ser una progressbar, más bien tendrás que dibujar sobre un canvas...

    miércoles, 19 de octubre de 2016 22:24
  • Hola:

    Para que te hagas una idea.

    Vídeo:

    https://www.youtube.com/watch?v=oI36A-c9Ok4

    Saludos.


    http://electronica-pic.blogspot.com

    miércoles, 19 de octubre de 2016 22:29
  • Hola

    Por que mejor no utilizas un gif que mientras se reproduzca el sonido se muestre y cuando termine el sonido desaparezca.

    http://rs339.pbsrc.com/albums/n442/mcrmy_derick/equalizer.gif~c200

    Saludos

    miércoles, 19 de octubre de 2016 23:22
  • Se supone que tiene que ser un sample real, no una simulación con un gif, ejjejeje,

    http://electronica-pic.blogspot.com

    miércoles, 19 de octubre de 2016 23:34
  • La pregunta no es tonta, pero sería bueno que nos explicaras que significa "ecualizador" en tu pregunta.

    Digo, da la impresión de que lo que buscas es un peakmeter. El servicio está disponible en el api de core audio. Es algo bastante sencillo: obtienes el endpoint del micrófono y su control de volumen. El driver de audio analiza, por ejemplo, 200 ms de samples y determina cual fue el pico. Luego usas un timer para consultar ese valor que bindeas a la progressbar.

    Claro, si se trata realmente de un ecualizador, entonces hablamos de otra cosa. Uno debería procesar el búfer con los samples, filtrar las frecuencias (transformada de fourier, FFT), y luego mostrarla en un control que dudo pueda ser una progressbar, más bien tendrás que dibujar sobre un canvas...

    Hola....gracias por la respuesta a todos.

    Sí, la verdad es que no usé la palabra ecualizador correctamente pero no se me ocurrió otra forma de llamarlo.

    En este video en el minuto 2.40, el tipo usa una progressbarr para que se mueva según los niveles de sonido que entran por el micrófono, pero lo que a mí me interesa es hacer que la progressbarr se mueva según me habla la máquina.

    https://m.youtube.com/watch?v=EoKii0jHd10

    Como una barra que me diga los niveles de audio de salida (no sé muy bien cómo explicarme, espero que me entiendan)

    Gracias.



    • Editado SiYue Music jueves, 20 de octubre de 2016 7:20
    jueves, 20 de octubre de 2016 7:19
  • En este rudimentario ejemplo, lees cada 200 milisegundos, el valor máximo detectado en la entrada de audio para ese período. La exacta granularidad puede ser obtenida desde el dispositivo (quizá examine períodos de 40 milisegundos, o de 150, o de 382).

    Cuando inicias la captura, por ejemplo desde la grabadora de voz, la barra de progreso muestra los niveles de entrada leídos.

    using System;
    using System.Windows;
    // /r:naudio.dll
    // https://naudio.codeplex.com/
    using NAudio.CoreAudioApi;
    using System.Windows.Threading;
    
    namespace volumenaudio
    {
        public partial class MainWindow : Window
        {
            AudioMeterInformation pmMicrofono;
            
            public float Pico
            {
                get
                {
                    return pmMicrofono.PeakValues[0]; 
                }
            }
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                MMDeviceEnumerator de = new MMDeviceEnumerator();
                MMDevice d = de.GetDefaultAudioEndpoint(DataFlow.Capture, Role.Console);
                pmMicrofono = d.AudioMeterInformation;
    
                DispatcherTimer dt = new DispatcherTimer();
                dt.Tick += ActualizaBarraProgreso;
                dt.Interval = TimeSpan.FromMilliseconds(200);
                dt.Start();
            }
    
            private void Window_Unloaded(object sender, RoutedEventArgs e)
            {
            }
    
            private void ActualizaBarraProgreso(object sender, EventArgs e)
            {
                peakmeter.Value = Pico;
            }
            
        }
    }


    <Window x:Class="volumenaudio.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:volumenaudio"
            mc:Ignorable="d"
            Title="MainWindow" Height="300" Width="400" Loaded="Window_Loaded" Unloaded="Window_Unloaded">
        <Grid Margin="0,0,0,0">
           <Label x:Name="label" Content="Micrófono" HorizontalAlignment="Left" Margin="20,20,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.526,0.117"/>
           <ProgressBar x:Name="peakmeter" HorizontalAlignment="Left" Height="20" VerticalAlignment="Top" Width="300" Margin="20,50,0,0" Maximum="1" SmallChange="0.01"/>
    
        </Grid>
    </Window>


    Necesitas la referencia a <naudio.dll>

    Ok, cuando releo tu último post, ya no me queda claro de lo que hablas. Ya no sé si tenemos o no un micrófono.

    De todos modos, si quieres ver la salida, simplemente cambia DataFlow.Capture por DataFlow.Render, y tendrás el endpoint de los parlantes.

     
    • Editado walter_5 jueves, 20 de octubre de 2016 12:02
    jueves, 20 de octubre de 2016 11:41
  • En este rudimentario ejemplo, lees cada 200 milisegundos, el valor máximo detectado en la entrada de audio para ese período. La exacta granularidad puede ser obtenida desde el dispositivo (quizá examine períodos de 40 milisegundos, o de 150, o de 382).

    Cuando inicias la captura, por ejemplo desde la grabadora de voz, la barra de progreso muestra los niveles de entrada leídos.

    using System;
    using System.Windows;
    // /r:naudio.dll
    // https://naudio.codeplex.com/
    using NAudio.CoreAudioApi;
    using System.Windows.Threading;
    
    namespace volumenaudio
    {
        public partial class MainWindow : Window
        {
            AudioMeterInformation pmMicrofono;
            
            public float Pico
            {
                get
                {
                    return pmMicrofono.PeakValues[0]; 
                }
            }
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                MMDeviceEnumerator de = new MMDeviceEnumerator();
                MMDevice d = de.GetDefaultAudioEndpoint(DataFlow.Capture, Role.Console);
                pmMicrofono = d.AudioMeterInformation;
    
                DispatcherTimer dt = new DispatcherTimer();
                dt.Tick += ActualizaBarraProgreso;
                dt.Interval = TimeSpan.FromMilliseconds(200);
                dt.Start();
            }
    
            private void Window_Unloaded(object sender, RoutedEventArgs e)
            {
            }
    
            private void ActualizaBarraProgreso(object sender, EventArgs e)
            {
                peakmeter.Value = Pico;
            }
            
        }
    }


    <Window x:Class="volumenaudio.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:volumenaudio"
            mc:Ignorable="d"
            Title="MainWindow" Height="300" Width="400" Loaded="Window_Loaded" Unloaded="Window_Unloaded">
        <Grid Margin="0,0,0,0">
           <Label x:Name="label" Content="Micrófono" HorizontalAlignment="Left" Margin="20,20,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.526,0.117"/>
           <ProgressBar x:Name="peakmeter" HorizontalAlignment="Left" Height="20" VerticalAlignment="Top" Width="300" Margin="20,50,0,0" Maximum="1" SmallChange="0.01"/>
    
        </Grid>
    </Window>


    Necesitas la referencia a <naudio.dll>

    Ok, cuando releo tu último post, ya no me queda claro de lo que hablas. Ya no sé si tenemos o no un micrófono.

    De todos modos, si quieres ver la salida, simplemente cambia DataFlow.Capture por DataFlow.Render, y tendrás el endpoint de los parlantes.

     

    Siento por confundirte....lo que busco hacer es como la visualización de Windows media player....esas barras que suben segun la música que suena. Tengo un micrófono con el que le hablo al asistente...y lo que quiero es hacer que la progressbarr se mueva con la voz del asistente, no del micrófono.

    Saludos y gracias.

    jueves, 20 de octubre de 2016 12:53
  • Ok, el nivel de audio del render. Así...

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication1"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
        <Grid>
            <ProgressBar x:Name="peakmeter" HorizontalAlignment="Left" Height="85" VerticalAlignment="Top" Width="474" Margin="22,83,0,0" Maximum="1" SmallChange="0.01"/>
        </Grid>
    </Window>
    // /r:naudio.dll
    // https://naudio.codeplex.com/
    using NAudio.CoreAudioApi;
    using System;
    using System.Windows;
    using System.Windows.Threading;
    
    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            AudioMeterInformation pmSalida;
    
            public float Pico
            {
                get
                {
                    return pmSalida.MasterPeakValue;
                }
            }
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                MMDeviceEnumerator de = new MMDeviceEnumerator();
                MMDevice d = de.GetDefaultAudioEndpoint(DataFlow.Render, Role.Console);
                pmSalida = d.AudioMeterInformation;
    
                DispatcherTimer dt = new DispatcherTimer();
                dt.Tick += ActualizaBarraProgreso;
                dt.Interval = TimeSpan.FromMilliseconds(100);
                dt.Start();
            }
    
            private void ActualizaBarraProgreso(object sender, EventArgs e)
            {
                peakmeter.Value = Pico;
            }
    
        }
    
    }

    En el ejemplo, la barra de progreso se llama "peakmeter".



    • Editado walter_5 jueves, 20 de octubre de 2016 14:11
    • Marcado como respuesta SiYue Music jueves, 20 de octubre de 2016 19:19
    jueves, 20 de octubre de 2016 14:09
  • Ok, el nivel de audio del render. Así...

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication1"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
        <Grid>
            <ProgressBar x:Name="peakmeter" HorizontalAlignment="Left" Height="85" VerticalAlignment="Top" Width="474" Margin="22,83,0,0" Maximum="1" SmallChange="0.01"/>
        </Grid>
    </Window>
    // /r:naudio.dll
    // https://naudio.codeplex.com/
    using NAudio.CoreAudioApi;
    using System;
    using System.Windows;
    using System.Windows.Threading;
    
    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            AudioMeterInformation pmSalida;
    
            public float Pico
            {
                get
                {
                    return pmSalida.MasterPeakValue;
                }
            }
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                MMDeviceEnumerator de = new MMDeviceEnumerator();
                MMDevice d = de.GetDefaultAudioEndpoint(DataFlow.Render, Role.Console);
                pmSalida = d.AudioMeterInformation;
    
                DispatcherTimer dt = new DispatcherTimer();
                dt.Tick += ActualizaBarraProgreso;
                dt.Interval = TimeSpan.FromMilliseconds(100);
                dt.Start();
            }
    
            private void ActualizaBarraProgreso(object sender, EventArgs e)
            {
                peakmeter.Value = Pico;
            }
    
        }
    
    }

    En el ejemplo, la barra de progreso se llama "peakmeter".



    Muchas gracias amigo!!! Es justo lo que buscaba. Te debo tres cervezas hehehehe
    jueves, 20 de octubre de 2016 19:18