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.

La función sounddevice.rec() en Python, con el parámetro dtype=’int8′, presenta un problema de cuantización a cero.

Estoy tratando de graficar mi señal de voz con diferentes dtypes (los bits por muestra). Así que intenté capturar mi voz con dtype = ‘int16’ y la gráfica tenía sentido. Pero luego intenté hablar al mismo nivel de sonido con dtype = ‘int8’ y mi gráfica es una línea cero.

¿Por qué está pasando esto?

Un pensamiento que me vino a la mente es que tal vez el cuantizador con 8 bits tiene una zona muerta más grande, por lo que para el mismo nivel de voz de entrada, el cuantizador deja caer el valor en 0. Por supuesto, hice una hipótesis sobre el tipo de cuantizador. No he visto si el cuantizador tiene una zona muerta uniforme.
A continuación está mi código y mis gráficas

import matplotlib.pyplot as plt
import numpy as np
import sounddevice as sd

Fs = 8000  # Frecuencia de muestreo
duration = 5  # Duración de la grabación en segundos
voice = sd.rec(frames=duration * Fs, samplerate=Fs, channels=1, dtype='int16')  # Captura de la voz

sd.wait()  # Cierre después de finalizar la grabación
time = np.linspace(0, len(voice - 1) / Fs, len(voice - 1))  # Divide el eje x en puntos voice-1
print(voice)  # Los puntos tienen una distancia de 1/Fs entre ellos
plt.plot(time, voice)  # Graficar en segundos
plt.title("Señal de voz")
plt.xlabel("Tiempo [segundos]")
plt.ylabel("Amplitud de voz")
plt.show()

Aquí están mis arrays de voz
https://www.mediafire.com/file/7bbfbz0jltszmb6/16bit.csv/file
https://www.mediafire.com/file/k627wmbeayutc20/8bit.csv/file

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí está relacionado con los niveles de cuantización. El tipo de dato int16 permite 2^16 = 65,536 posibles niveles de cuantización, mientras que el tipo de dato int8 solo permite 2^8 = 256 posibles niveles de cuantización. Esto significa que al grabar en int8, los niveles que se capturan no son tan detallados como los capturados en int16.

    Cuando hablas al mismo nivel con int8 como lo hiciste con int16, los niveles de cuantización pueden no ser lo suficientemente finos como para capturar las pequeñas fluctuaciones en tu voz, y en cambio solo capturar ruido alrededor de la línea cero. Es por esto que tu gráfica aparece como una línea plana en cero.

    Para solucionarlo, podrías intentar normalizar la señal int8 para utilizar todo el rango de valores en lugar de solo tenerlo centrado alrededor de cero. Esto se puede hacer restando 128 de la señal y luego escalándola por un factor de 256. Esto cambiará el rango de valores para que esté entre -128 y 127, y luego lo escalará para llenar todo el rango entre -32768 y 32767. Puedes hacer esto de la siguiente manera:

    voz_normalizada = (voz.astype('int16') - 128) * 256
    

    Luego puedes graficar la señal voz_normalizada y debería mostrar las mismas fluctuaciones que tu gráfica int16.

Comments are closed.