es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para medir el nivel actual de decibelios utilizando un micrófono en Python, puedes usar la biblioteca PyAudio, la cual proporciona enlaces para la biblioteca PortAudio para entrada y salida de audio multiplataforma. También necesitarás instalar la biblioteca numpy para realizar operaciones numéricas en matrices.

    Aquí tienes un código de ejemplo que registra la entrada de audio desde el micrófono predeterminado durante una duración especificada (en segundos) y calcula la amplitud promedio de la raíz cuadrada media (RMS, por sus siglas en inglés), que es proporcional al nivel de presión sonora (SPL, por sus siglas en inglés) en decibelios:

    import pyaudio
    import numpy as np
    
    FORMATO = pyaudio.paInt16
    CANALES = 1
    TASA_MUESTREO = 44100
    TAMANO_BLOQUE = 1024
    DURACION = 0.3  # segundos
    
    p = pyaudio.PyAudio()
    
    flujo = p.open(format=FORMATO, channels=CANALES, rate=TASA_MUESTREO, input=True,
                   frames_per_buffer=TAMANO_BLOQUE)
    
    while True:
        datos = flujo.read(int(DURACION * TASA_MUESTREO))
        muestras = np.frombuffer(datos, dtype=np.int16)
        rms = np.sqrt(np.mean(np.square(muestras)))
        decibelios = 20 * np.log10(rms / 32767.0) + 20  # ajustar al nivel de referencia
        print(f"Nivel actual de decibelios: {decibelios:.2f} dB")
    
    flujo.stop_stream()
    flujo.close()
    p.terminate()
    

    Este código crea un flujo PyAudio con el formato, canales, tasa de muestreo y tamaño de búfer especificados para la entrada del micrófono. El bucle while lee repetidamente un fragmento de datos de audio, lo convierte en una matriz numpy de muestras enteras de 16 bits, calcula la amplitud RMS y la convierte a decibelios utilizando la fórmula:

    dB = 20 * log10(rms / ref)
    

    donde ref es el nivel de presión sonora de referencia de 20 micropascales (uPa) para una amplitud RMS de 1 en una muestra entera de 16 bits con signo. La fórmula también agrega 20 dB para ajustar el hecho de que la amplitud RMS representa la raíz cuadrada media de la presión sonora, que es proporcional a la intensidad del sonido (es decir, energía por unidad de tiempo por unidad de área).

    Puedes almacenar el nivel actual de decibelios en una variable asignándola dentro del bucle while, de la siguiente manera:

    decibelios = 0.0  # valor inicial
    
    while True:
        datos = flujo.read(int(DURACION * TASA_MUESTREO))
        muestras = np.frombuffer(datos, dtype=np.int16)
        rms = np.sqrt(np.mean(np.square(muestras)))
        decibelios = 20 * np.log10(rms / 32767.0) + 20  # ajustar al nivel de referencia
        print(f"Nivel actual de decibelios: {decibelios:.2f} dB")
    

    Esto actualizará la variable decibelios con la última medición cada 0.3 segundos (u otra duración que establezcas para DURACION). También puedes agregar una pausa de tiempo al final del bucle para controlar más precisamente la tasa de actualización:

    import time
    
    while True:
        datos = flujo.read(int(DURACION * TASA_MUESTREO))
        muestras = np.frombuffer(datos, dtype=np.int16)
        rms = np.sqrt(np.mean(np.square(muestras)))
        decibelios = 20 * np.log10(rms / 32767.0) + 20  # ajustar al nivel de referencia
        print(f"Nivel actual de decibelios: {decibelios:.2f} dB")
        time.sleep(0.3)
    

    Esto pausará la ejecución del bucle durante 0.3 segundos después de cada medición, lo cual limitará el uso de la CPU y evitará sobrecargar el búfer de entrada del micrófono.

Comments are closed.