Ir al contenido

Índice de inteligibilidad del habla

Normas aplicables: ANSI S3.5Referencias: French y Steinberg 1947

El índice de inteligibilidad del habla predice cuánto de una señal de habla es audible, y por tanto inteligible, para un oyente en una condición dada de ruido y audición. Reduce un espectro de habla, un espectro de ruido y un umbral auditivo a un único número en [0, 1]: 0 cuando nada útil alcanza al oyente, 1 cuando todo el espectro portador del habla es audible. Esta página cubre los cuatro procedimientos por bandas de ANSI S3.5-1997 (R2017): el método por bandas de tercio de octava (18 bandas de 160 Hz a 8000 Hz), que es el valor por omisión y el que recorren los apartados 1 a 4, y los métodos por bandas críticas, por bandas críticas de contribución equitativa y por bandas de octava del apartado 5.

El flujo de cálculo del SII: tres entradas de nivel espectral equivalente (habla Ei', ruido Ni', umbral de audición Ti') alimentan la etapa de autoenmascaramiento del habla y propagación del enmascaramiento (nivel espectral de enmascaramiento equivalente Zi), después la perturbación equivalente Di, después la función de audibilidad de banda Ai acotada a [0, 1], y por último la suma ponderada por importancia de banda SII sobre las 18 bandas de tercio de octavaEl flujo de cálculo del SII: tres entradas de nivel espectral equivalente (habla Ei', ruido Ni', umbral de audición Ti') alimentan la etapa de autoenmascaramiento del habla y propagación del enmascaramiento (nivel espectral de enmascaramiento equivalente Zi), después la perturbación equivalente Di, después la función de audibilidad de banda Ai acotada a [0, 1], y por último la suma ponderada por importancia de banda SII sobre las 18 bandas de tercio de octava

1. Entradas y la función de importancia de banda

Sección titulada «1. Entradas y la función de importancia de banda»

Las tres entradas son niveles espectrales equivalentes (ANSI S3.5-1997, apartados 3.11 y 3.55) muestreados en los 18 centros de banda de tercio de octava: el nivel espectral del habla , el nivel espectral del ruido (ambos en dB SPL) y el umbral de audición (en dB HL). Cada banda contribuye a la inteligibilidad en proporción a su función de importancia de banda (ANSI S3.5-1997 Tabla 3, material de habla promedio), que suma uno sobre las 18 bandas.

from phonometry import speech
# El espectro de habla estándar de esfuerzo normal (Tabla 3) en silencio, audición normal.
result = speech.speech_intelligibility_index("normal")
print(round(result.sii, 3)) # 0.996 (casi todo audible)
print(round(speech.sii.BAND_IMPORTANCE.sum(), 6)) # 1.0
result.plot() # audibilidad por banda y su contribución ponderada (necesita matplotlib)

Sin ruido y con un umbral de audición normal, el espectro de habla estándar es casi totalmente audible, por lo que el índice se acerca a uno; el pequeño déficit es el propio autoenmascaramiento del habla del oyente.

La función de importancia es donde vive el conocimiento perceptivo de la norma. Desciende de los experimentos de articulación que sustentan el índice de articulación de French y Steinberg: los oyentes puntuaban sílabas sin sentido oídas a través de filtros que eliminaban una parte del espectro cada vez, y la caída de acierto mide cuánta inteligibilidad transporta cada banda. El resultado es llamativamente desigual, y ajeno a dónde está la energía del habla: las cinco bandas de 1250 Hz a 3150 Hz transportan en torno al 43 % de la inteligibilidad (ahí viven las pistas de punto y modo de articulación de las consonantes), mientras que las cinco bandas más bajas, de 160 Hz a 400 Hz, transportan en torno al 11 % aunque contienen casi la mitad de la potencia del habla. El de la Tabla 3 es el compromiso para habla promedio; el Anexo B de la norma tabula funciones de importancia alternativas para materiales de ensayo concretos (sílabas sin sentido, listas de palabras monosílabas, pasajes cortos), que desplazan el peso según la redundancia del material.

Los niveles de banda no son niveles espectrales

Sección titulada «Los niveles de banda no son niveles espectrales»

Esta es la trampa que arruina en silencio un SII calculado a partir de datos medidos. Un nivel espectral equivalente es el nivel que tendría la banda si su energía se repartiera sobre 1 Hz, así que un nivel de banda de tercio de octava salido de un analizador se convierte en nivel espectral restándole diez veces el logaritmo del ancho de banda en hercios:

No hace falta memorizar los anchos: cada objeto de procedimiento lleva sus propios bordes de banda, así que la conversión son dos líneas para cualquiera de los cuatro métodos.

import numpy as np
# `speech` es la importación del primer fragmento de esta página.
proc = speech.sii_procedure("one-third-octave")
widths = np.diff(proc.band_edges) # hercios, banda a banda
print(np.round(10 * np.log10(widths), 1)[[0, 8, 17]]) # [15.5 23.5 32.7]
band_levels = np.full(18, 55.0) # lo que declara un analizador
spectrum_levels = band_levels - 10 * np.log10(widths)
print(round(float(spectrum_levels[8]), 1)) # 31.5 dB a 1 kHz

Así que la corrección va de 15,5 dB a 160 Hz a 32,7 dB a 8 kHz en el procedimiento de tercio de octava, y vale 28,5 dB a 1 kHz en el de octava: es decir, un nivel de banda medido de 55 dB a 1 kHz es un nivel espectral de 31,5 dB, no de 55 dB. Mete niveles de banda directamente y tanto el habla como el ruido quedan de 15 a 33 dB demasiado altos, banda a banda, y el fallo es silencioso: el índice sigue dentro de y la gráfica de audibilidad sigue pareciendo plausible.

De ahí siguen dos cosas. La entrada de umbral no se convierte: es un nivel de umbral de audición en dB HL, una diferencia de niveles y no una magnitud por hercio. Y hay una comprobación barata: como un nivel espectral es por hercio, un ruido blanco tiene el mismo nivel espectral de ruido equivalente en todas las bandas de todos los procedimientos, mientras que sus niveles de banda suben 3 dB por octava. Si un SII sale exactamente 0 para un ruido de oficina corriente, o exactamente 1 con ruido presente, sospecha de niveles de banda introducidos como niveles espectrales; una comprobación rápida es que el propio espectro de habla de esfuerzo normal de la norma tiene su máximo en 34,8 dB cerca de 250 Hz, así que cualquier entrada de habla más de unos 15 dB por encima de eso es un nivel de banda.

La razón de que los tres datos de entrada puedan combinarse siquiera es que describen el mismo punto del espacio. ANSI S3.5-1997 define los niveles espectrales equivalentes de habla y de ruido en la posición correspondiente al centro de la cabeza del oyente, a media distancia entre los oídos y con el oyente ausente: ambos son magnitudes de campo en una posición de escucha desocupada. Es decir: el ruido se mide ahí con el hablante o la fuente de interés en silencio, y el habla se mide ahí con el hablante a la distancia y el esfuerzo vocal reales.

Tres consecuencias que merecen constar en un informe. Los espectros tabulados por esfuerzo vocal de la sección 4 son el habla de referencia de la norma, excelente para diseñar y comparar, pero no sustituyen a un medido cuando la condición de escucha real está a otra distancia o en un espacio reverberante. Los niveles registrados en el tímpano, en un acoplador o bajo auriculares no son niveles equivalentes de campo libre y hay que transformarlos antes de poder usarlos. Y threshold= es el nivel de umbral de audición en tonos puros del oyente en dB HL en los 18 centros de banda y pertenece a un solo oído, así que hay que decir cuál es y cómo se llevó el audiograma a esos centros, a lo que vuelve la sección 3.2.

2. Enmascaramiento y la función de audibilidad de banda

Sección titulada «2. Enmascaramiento y la función de audibilidad de banda»

El procedimiento (ANSI S3.5-1997, apartado 5) convierte las entradas en una audibilidad por banda. El habla se enmascara a sí misma hacia abajo desde cada banda (); el mayor entre eso y el ruido externo, , se propaga hacia arriba en frecuencia con una pendiente dependiente del nivel para dar el nivel espectral de enmascaramiento equivalente (apartado 5.4):

El enmascaramiento se combina con el ruido interno equivalente (, el ruido interno de referencia desplazado por la pérdida auditiva) en la perturbación equivalente (apartado 5.6), y la función de audibilidad de banda es la razón habla-perturbación escalada a (apartado 5.8):

A niveles de habla muy por encima del esfuerzo normal, un factor de distorsión de nivel del apartado 5.7 (la unidad para los espectros estándar usados en esta página) reduce aún más ; phonometry lo aplica automáticamente.

Todos los arrays de esa cadena están en el resultado, así que puede dibujarse el apartado 5 entero para un caso donde el trabajo lo hace la propagación del enmascaramiento: un ventilador o un conducto que pone toda su energía por debajo de 450 Hz:

La cadena del apartado 5 de ANSI S3.5 sobre las 18 bandas de tercio de octava para el habla estándar de esfuerzo normal en un enmascarador cuyo nivel espectral de 60 dB queda confinado por debajo de 450 Hz. El ruido externo cae a nada por encima de 400 Hz, pero el nivel espectral de enmascaramiento equivalente decae en cambio de forma gradual, y sigue valiendo 23 dB a 1 kHz, donde no hay ruido ninguno; la perturbación equivalente lo sigue, la ventana sombreada de 30 dB de D menos 15 a D más 15 dB se dibuja a su alrededor, y la audibilidad de banda del eje derecho sube de cero a 500 Hz hasta uno a 2000 Hz a medida que la curva del habla sale de esa ventana. El índice vale 0,60La cadena del apartado 5 de ANSI S3.5 sobre las 18 bandas de tercio de octava para el habla estándar de esfuerzo normal en un enmascarador cuyo nivel espectral de 60 dB queda confinado por debajo de 450 Hz. El ruido externo cae a nada por encima de 400 Hz, pero el nivel espectral de enmascaramiento equivalente decae en cambio de forma gradual, y sigue valiendo 23 dB a 1 kHz, donde no hay ruido ninguno; la perturbación equivalente lo sigue, la ventana sombreada de 30 dB de D menos 15 a D más 15 dB se dibuja a su alrededor, y la audibilidad de banda del eje derecho sube de cero a 500 Hz hasta uno a 2000 Hz a medida que la curva del habla sale de esa ventana. El índice vale 0,60

La audibilidad de banda es una posición dentro de una ventana de 30 dB: en el borde inferior la banda está totalmente enmascarada, en el superior es totalmente audible, y entre ambos hay una recta. La ventana está centrada en , y sigue a , que es el sentido de la figura: no hay ruido ninguno por encima de 400 Hz y, aun así, el enmascaramiento a 1 kHz vale 23 dB, propagado hacia arriba desde las bandas graves. Esa falda ascendente es lo que hace del SII algo más que una relación señal-ruido banda a banda, y es el término que el procedimiento de octava de la sección 5 se deja por el camino.

Mostrar el código de esta figura
import matplotlib.pyplot as plt
# `np` y `speech` vienen de los fragmentos de arriba.
freqs = speech.sii_procedure("one-third-octave").frequencies
noise = np.where(freqs <= 450.0, 60.0, 0.0) # toda la energía por debajo de 450 Hz
res = speech.speech_intelligibility_index("normal", noise)
print(round(res.sii, 2), round(float(res.masking[8]), 1)) # 0.6 23.2
pos = np.arange(freqs.size)
fig, ax = plt.subplots(figsize=(10.4, 6.0))
ax.fill_between(pos, res.disturbance - 15, res.disturbance + 15, alpha=0.25)
ax.plot(pos, res.speech_spectrum, "o-", label="habla Ei'")
ax.plot(pos, noise, "s--", label="ruido externo Ni'")
ax.plot(pos, res.masking, "^-", label="enmascaramiento equivalente Zi")
ax.twinx().plot(pos, res.band_audibility) # la audibilidad, a la derecha
ax.legend()
plt.show()

El índice de inteligibilidad del habla es la suma de las audibilidades de banda ponderada por la importancia de banda (ANSI S3.5-1997, apartado 6):

import numpy as np
from phonometry import speech
speech_spectrum = speech.standard_speech_spectrum("normal")
# Un ruido de enmascaramiento de banda ancha descendente (espectro tipo oficina/ventilación).
noise = np.array([38.0, 37.0, 36.0, 34.0, 32.0, 30.0, 28.0, 26.0, 24.0,
22.0, 20.0, 18.0, 16.0, 14.0, 12.0, 10.0, 8.0, 6.0])
result = speech.speech_intelligibility_index(speech_spectrum, noise)
print(round(result.sii, 2)) # 0.46
print(result.band_audibility.round(2)) # Ai por banda
result.plot() # la figura de abajo: Ai y la contribución ponderada por banda
Audibilidad de banda del espectro de habla estándar de esfuerzo normal en un ruido de banda ancha descendente: las barras claras son la audibilidad por banda Ai sobre las 18 bandas de tercio de octava de 160 Hz a 8000 Hz, las barras más oscuras la contribución ponderada por importancia Ii*Ai (escalada), y el SII global es 0,46Audibilidad de banda del espectro de habla estándar de esfuerzo normal en un ruido de banda ancha descendente: las barras claras son la audibilidad por banda Ai sobre las 18 bandas de tercio de octava de 160 Hz a 8000 Hz, las barras más oscuras la contribución ponderada por importancia Ii*Ai (escalada), y el SII global es 0,46
Ver el código de esta figura
import numpy as np
import matplotlib.pyplot as plt
from phonometry import speech
speech_spectrum = speech.standard_speech_spectrum("normal")
noise = np.array([38.0, 37.0, 36.0, 34.0, 32.0, 30.0, 28.0, 26.0, 24.0,
22.0, 20.0, 18.0, 16.0, 14.0, 12.0, 10.0, 8.0, 6.0])
result = speech.speech_intelligibility_index(speech_spectrum, noise)
# En una línea:
result.plot(language="es")
plt.show()
# A mano, replicando lo que dibuja SIIResult.plot():
pos = np.arange(result.frequencies.size)
weighted = result.band_audibility * result.band_importance
fig, ax = plt.subplots()
ax.bar(pos, result.band_audibility, color="#c6dbef", label=r"Audibilidad de banda $A_i$")
ax.bar(pos, weighted / weighted.max(), width=0.5, color="#1f77b4",
label=r"Ponderada por importancia $I_i\,A_i$ (escalada)")
ax.set_xticks(pos)
ax.set_xticklabels([f"{f:g}" for f in result.frequencies], rotation=45, ha="right")
ax.set_xlabel("Banda de tercio de octava [Hz]")
ax.set_ylabel("Audibilidad de banda")
ax.set_title(f"SII = {result.sii:.2f}")
ax.legend()
plt.show()

Cómo leer el número. El SII es la fracción del espectro de habla que resulta audible ponderada por importancia, así que 0,46 significa que llega más o menos la mitad de lo que transporta la inteligibilidad. Es una proporción de audibilidad, no de palabras: ANSI S3.5 lleva el índice a inteligibilidad solo a través de funciones de transferencia propias del material de habla y de los oyentes, y por eso un mismo 0,5 sostiene aciertos altos en frases y bastante más bajos en sílabas sin sentido. Nunca cites un SII como «X % de inteligibilidad» sin nombrar el material. Como anclas prácticas, por encima de 0,75 está el objetivo de diseño cuando hay que entender material desconocido, la misma escala que hace de requirement=0.75 un valor razonable en la ficha de la sección 7; de 0,45 a 0,75 se trabaja con material familiar en un contexto conocido; por debajo de 0,3 aproximadamente no se puede confiar en la comunicación hablada. Y atención a la resolución: las entradas son espectros medidos con su propia incertidumbre, así que las diferencias de unas centésimas son ruido. Cuando dos condiciones puntúan parecido, el perfil de audibilidad por banda, y no el escalar, es la parte que dice qué hay que arreglar.

Un umbral de audición elevado (threshold=) sube el ruido interno equivalente y reduce el índice, igual que lo hace añadir ruido de enmascaramiento. La entrada es el nivel de umbral de audición en tonos puros en dB HL en los 18 centros de banda, de un solo oído. El SIIResult también lleva el enmascaramiento por banda , la perturbación , la audibilidad y la importancia , y su .plot() dibuja la figura de arriba.

Los mismos habla y ruido escuchados por una persona con pérdida auditiva en agudos muestran lo que eso cuesta, banda a banda:

Audibilidad de banda del espectro de habla estándar de esfuerzo normal en el mismo ruido de banda ancha, para un oyente con pérdida auditiva descendente en agudos: las bandas hasta 800 Hz conservan buena parte de su audibilidad, las bandas desde 4000 Hz caen a cero y el SII resultante es 0,36 frente al 0,46 de una audición normalAudibilidad de banda del espectro de habla estándar de esfuerzo normal en el mismo ruido de banda ancha, para un oyente con pérdida auditiva descendente en agudos: las bandas hasta 800 Hz conservan buena parte de su audibilidad, las bandas desde 4000 Hz caen a cero y el SII resultante es 0,36 frente al 0,46 de una audición normal
Ver el código de esta figura
import numpy as np
import matplotlib.pyplot as plt
from phonometry import speech
# Los mismos habla y ruido de oficina de arriba, escuchados a través de una
# pérdida descendente en agudos (umbrales en las 18 frecuencias centrales).
speech_spectrum = speech.standard_speech_spectrum("normal")
noise = np.array([38.0, 37.0, 36.0, 34.0, 32.0, 30.0, 28.0, 26.0, 24.0,
22.0, 20.0, 18.0, 16.0, 14.0, 12.0, 10.0, 8.0, 6.0])
threshold = np.array([5.0, 5.0, 5.0, 5.0, 8.0, 10.0, 12.0, 15.0, 18.0,
22.0, 28.0, 35.0, 42.0, 48.0, 55.0, 60.0, 65.0, 70.0])
res = speech.speech_intelligibility_index(speech_spectrum, noise, threshold=threshold)
print(round(res.sii, 3)) # 0.358 (0.458 con audición normal)
# En una línea: las mismas barras de audibilidad, ahora limitadas por el umbral.
res.plot(language="es")
plt.show()

La pérdida elimina las bandas que llevan las claves consonánticas, y por eso el índice baja una quinta parte sin que el nivel del habla haya cambiado. Este es el uso práctico del SII en audiología y en control de ruido de espacios ocupados: un índice objetivo se puede alcanzar bajando el ruido o devolviendo audibilidad (amplificando), y el perfil por bandas dice en qué bandas hay que poner el esfuerzo.

Cómo llevar un array de umbrales a la rejilla del SII. Los umbrales por edad de ISO 7029 son una entrada poblacional cómoda, pero las dos normas están tabuladas en rejillas distintas y el traslado es una decisión de quien llama, no algo automático. La ISO 7029 devuelve once frecuencias audiométricas (de 125 a 8000 Hz) mientras que el procedimiento de tercio de octava del SII necesita dieciocho valores de 160 Hz a 8000 Hz, y ANSI S3.5 no define ninguna interpolación: el bloque «No cubierto» de esta misma página dice que no se ofrece remuestreo entre conjuntos de bandas. Así que hay que explicitar la elección: interpolar los umbrales audiométricos sobre un eje logarítmico de frecuencia hasta los centros de banda del SII, o tomar para cada banda la frecuencia audiométrica más próxima, y decir cuál de las dos en el informe. Hay un segundo desajuste: age_threshold devuelve la desviación respecto a la mediana de los 18 años, que es un nivel de umbral de audición en dB HL solo si esa línea de base se toma como 0 dB HL, una suposición que merece declararse y que conviene abandonar en cuanto exista un audiograma real, porque los valores medidos en dB HL pueden introducirse directamente. Y por último, atención al sentido del error: una interpolación gruesa alisa la muesca de 3 kHz a 6 kHz que lleva un audiograma expuesto a ruido, y esas son bandas con mucho peso de importancia, así que el SII sale optimista.

Los hablantes elevan la voz en ruido, y la norma da cuatro espectros de voz estándar para los esfuerzos vocales normal, elevado, fuerte y grito (ANSI S3.5-1997, Tabla 3). Al pasar el nombre del esfuerzo se selecciona el espectro correspondiente; hablar más fuerte sube todo el espectro y, en un ruido fijo, aumenta el índice.

import numpy as np
from phonometry import speech
# El mismo ruido de banda ancha, cuatro esfuerzos vocales.
noise = np.array([48.0, 47.0, 46.0, 44.0, 42.0, 40.0, 38.0, 36.0, 34.0,
32.0, 30.0, 28.0, 26.0, 24.0, 22.0, 20.0, 18.0, 16.0])
for effort in speech.sii.VOCAL_EFFORTS:
print(effort, round(speech.speech_intelligibility_index(effort, noise).sii, 2))
# normal 0.12 | raised 0.36 | loud 0.59 | shout 0.79
print(speech.standard_speech_spectrum("loud")[8]) # 42.16 dB SPL a 1 kHz

Los cuatro espectros también están disponibles como un único resultado representable: standard_speech_spectra() devuelve un StandardSpeechSpectrum que lleva las frecuencias centrales de banda y los niveles de banda por esfuerzo, y su .plot() los dibuja como una familia etiquetada sobre el eje de bandas de tercio de octava.

Los cuatro espectros de voz estándar de ANSI S3.5-1997 (normal, elevado, fuerte, grito) como una familia etiquetada: el nivel espectral de voz en dB SPL sobre las 18 bandas de tercio de octava de 160 Hz a 8000 Hz, cada esfuerzo mayor sube todo el espectroLos cuatro espectros de voz estándar de ANSI S3.5-1997 (normal, elevado, fuerte, grito) como una familia etiquetada: el nivel espectral de voz en dB SPL sobre las 18 bandas de tercio de octava de 160 Hz a 8000 Hz, cada esfuerzo mayor sube todo el espectro
Mostrar el código de esta figura
import numpy as np
import matplotlib.pyplot as plt
from phonometry import speech
# Una línea: toda la familia de la Tabla 3 de ANSI S3.5-1997.
speech.standard_speech_spectra().plot(language="es")
plt.show()
# A mano, reproduciendo lo que dibuja StandardSpeechSpectrum.plot():
res = speech.standard_speech_spectra()
pos = np.arange(res.frequencies.size)
nombres = {"normal": "Normal", "raised": "Elevada",
"loud": "Fuerte", "shout": "Grito"}
fig, ax = plt.subplots()
for effort, levels in zip(res.vocal_efforts, res.levels):
ax.plot(pos, levels, "o-", label=nombres[effort])
ax.set_xticks(pos)
ax.set_xticklabels([f"{f:g}" for f in res.frequencies], rotation=45, ha="right")
ax.set_xlabel("Banda de tercio de octava [Hz]")
ax.set_ylabel("Nivel del espectro de voz [dB SPL]")
ax.legend()
plt.show()

Los mismos cuatro espectros alimentan el índice: en un ruido de banda ancha fijo, cada esfuerzo vocal mayor sube el espectro de voz y aumenta el SII.

Izquierda: los cuatro espectros de voz estándar de ANSI S3.5-1997 (normal, elevado, fuerte, grito) de 160 Hz a 8000 Hz, cada esfuerzo mayor sube todo el espectro. Derecha: el SII resultante en un ruido de banda ancha fijo, subiendo de 0,12 (normal) a 0,79 (grito)Izquierda: los cuatro espectros de voz estándar de ANSI S3.5-1997 (normal, elevado, fuerte, grito) de 160 Hz a 8000 Hz, cada esfuerzo mayor sube todo el espectro. Derecha: el SII resultante en un ruido de banda ancha fijo, subiendo de 0,12 (normal) a 0,79 (grito)
Mostrar el código de esta figura
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import NullFormatter
from phonometry import speech
# Los cuatro espectros de la Tabla 3 de ANSI S3.5-1997 y el ruido fijo de arriba.
noise = np.array([48.0, 47.0, 46.0, 44.0, 42.0, 40.0, 38.0, 36.0, 34.0,
32.0, 30.0, 28.0, 26.0, 24.0, 22.0, 20.0, 18.0, 16.0])
efforts = speech.sii.VOCAL_EFFORTS # ("normal", "raised", "loud", "shout")
freqs = speech.sii.BAND_CENTERS # los 18 centros de banda de tercio de octava
nombres = {"normal": "Normal", "raised": "Elevada",
"loud": "Fuerte", "shout": "Grito"}
fig, (ax_s, ax_i) = plt.subplots(1, 2, figsize=(12, 5))
# Izquierda: cada esfuerzo vocal mayor sube todo el espectro de voz.
for effort in efforts:
ax_s.plot(freqs, speech.standard_speech_spectrum(effort), "o-",
label=nombres[effort])
ax_s.set_xscale("log")
ax_s.set_xticks(list(freqs))
ax_s.set_xticklabels([f"{f:g}" for f in freqs], rotation=45, ha="right")
ax_s.xaxis.set_minor_formatter(NullFormatter())
ax_s.set_xlabel("Banda de tercio de octava [Hz]")
ax_s.set_ylabel("Nivel del espectro de voz [dB SPL]")
ax_s.legend()
# Derecha: el SII que alcanza cada espectro en el ruido fijo.
sii = [speech.speech_intelligibility_index(e, noise).sii for e in efforts]
pos = np.arange(len(efforts))
ax_i.bar(pos, sii)
ax_i.set_xticks(pos)
ax_i.set_xticklabels([nombres[e] for e in efforts])
ax_i.set_ylim(0.0, 1.0)
ax_i.set_ylabel("Índice de inteligibilidad del habla")
plt.show()

Los nombres de esfuerzo vocal funcionan en cualquier sitio donde se espere un espectro de voz, incluido como primer argumento de speech_intelligibility_index.

El título de la norma está en plural, y la norma también: ANSI S3.5-1997 define cuatro procedimientos por bandas. Solo se diferencian en la tabla de bandas y en cómo se expresa la propagación ascendente del enmascaramiento, y method= elige uno. El valor por omisión es el procedimiento por tercios de octava usado arriba.

method=BandasCentros de bandaLímites de bandaConstantesPropagación del enmascaramiento
"critical-band"21150 Hz a 8500 Hz100 Hz a 9500 HzTabla 1entre los límites de banda tabulados
"equally-contributing"17350 Hz a 5800 Hz300 Hz a 6400 HzTabla 2entre los límites de banda tabulados
"one-third-octave"18160 Hz a 8000 Hz143 Hz a 8980 Hz (calculados)Tabla 3entre las frecuencias centrales de banda
"octave"6250 Hz a 8000 Hz177 Hz a 11314 HzTabla 4ninguna

Las dos columnas son sii_procedure(method).frequencies y .band_edges; solo los límites de tercio de octava se calculan a partir de los centros en vez de estar tabulados.

Todos los procedimientos recorren la misma cadena del apartado 2: el autoenmascaramiento del habla, la propagación ascendente del enmascaramiento, el ruido interno equivalente y la perturbación, el factor de distorsión de nivel y la función de audibilidad de banda, ponderada por la función de importancia de banda propia de cada procedimiento. La pendiente de enmascaramiento es una sola fórmula en todos ellos, , con el ancho de banda en hercios. Los procedimientos por bandas críticas y de contribución equitativa propagan el enmascaramiento desde el límite superior de la banda enmascarante hasta la frecuencia central de la banda enmascarada; el de tercios de octava escribe esa misma geometría en función de las frecuencias centrales, de donde salen su y su dB impresos. El procedimiento por bandas de octava no tiene propagación del enmascaramiento: una banda de octava ya es más ancha que la propagación que se modela, así que su nivel espectral de enmascaramiento equivalente es el propio nivel espectral de ruido equivalente.

Las cuatro funciones de importancia de banda son una sola distribución subyacente muestreada a cuatro resoluciones, así que cuanto más anchas son las bandas, mayor es cada . Cada función suma uno, salvo la de la Tabla 2, que imprime 0,0588 en cada una de sus 17 bandas y por tanto suma 0,9996.

La función de importancia de banda de los cuatro procedimientos por bandas de ANSI S3.5-1997 superpuestos en un mismo eje logarítmico de frecuencia: las 21 bandas críticas, las 17 bandas críticas de contribución equitativa, las 18 bandas de tercio de octava y las 6 bandas de octava, cada una dibujada como escalón sobre sus propios límites de banda. Las cuatro trazan el mismo ascenso hasta un máximo en torno a 2 kHz, y cuanto más anchas son las bandas más alto es el escalón: la función de octava culmina en 0,265 frente a 0,090 de la de tercio de octavaLa función de importancia de banda de los cuatro procedimientos por bandas de ANSI S3.5-1997 superpuestos en un mismo eje logarítmico de frecuencia: las 21 bandas críticas, las 17 bandas críticas de contribución equitativa, las 18 bandas de tercio de octava y las 6 bandas de octava, cada una dibujada como escalón sobre sus propios límites de banda. Las cuatro trazan el mismo ascenso hasta un máximo en torno a 2 kHz, y cuanto más anchas son las bandas más alto es el escalón: la función de octava culmina en 0,265 frente a 0,090 de la de tercio de octava
Ver el código de esta figura
import numpy as np
import matplotlib.pyplot as plt
from phonometry import SII_METHODS, sii_procedure
# Una línea: el .plot() de cada procedimiento escalona su Ii sobre sus límites.
fig, ax = plt.subplots(figsize=(10, 6))
for method in SII_METHODS:
sii_procedure(method).plot(ax=ax, linewidth=1.8)
plt.show()
# A mano, replicando lo que dibuja SIIProcedure.plot():
fig, ax = plt.subplots()
for method in SII_METHODS:
proc = sii_procedure(method)
ii = proc.band_importance
ax.plot(proc.band_edges, np.append(ii, ii[-1]), drawstyle="steps-post",
label=method)
ax.set_xscale("log")
ax.set_xlabel("Frecuencia [Hz]")
ax.set_ylabel(r"Importancia de banda $I_i$")
ax.set_ylim(bottom=0.0)
ax.legend()
plt.show()

Como el nivel espectral equivalente es una magnitud por hercio, un ruido blanco tiene el mismo nivel espectral de ruido equivalente en todas las bandas de todos los procedimientos, lo que hace que los cuatro sean directamente comparables:

import numpy as np
from phonometry import speech
for method in speech.SII_METHODS:
n_bands = speech.sii_procedure(method).frequencies.size
result = speech.speech_intelligibility_index(
"normal", np.full(n_bands, 25.0), method=method
)
print(method, n_bands, round(result.sii, 3))
# critical-band 21 0.343
# equally-contributing 17 0.333
# one-third-octave 18 0.350
# octave 6 0.369

Los cuatro coinciden dentro de unas 0,04 unidades en la misma situación de escucha. El de octava es el que lee más alto porque prescinde de la propagación del enmascaramiento, que es justo el riesgo que arrastra: si se le da un ruido fuerte en baja frecuencia, no verá ese ruido alcanzando las bandas que portan el habla.

El SII calculado por los cuatro procedimientos de bandas frente al nivel espectral de un ruido de baja frecuencia confinado por debajo de 450 Hz, barrido de 45 a 80 dB. Las curvas de banda crítica, de contribución equitativa y de tercio de octava caen juntas desde unos 0,75 hasta por debajo de 0,07, mientras que la de octava se mantiene plana en 0,87 en todo el recorrido; en el punto más ruidoso se anota que ambas están separadas por 0,81 unidades de índiceEl SII calculado por los cuatro procedimientos de bandas frente al nivel espectral de un ruido de baja frecuencia confinado por debajo de 450 Hz, barrido de 45 a 80 dB. Las curvas de banda crítica, de contribución equitativa y de tercio de octava caen juntas desde unos 0,75 hasta por debajo de 0,07, mientras que la de octava se mantiene plana en 0,87 en todo el recorrido; en el punto más ruidoso se anota que ambas están separadas por 0,81 unidades de índice

La coincidencia anterior es una propiedad del estímulo, no de los procedimientos. Sobre ruido blanco los cuatro se siguen entre sí; sobre un enmascarador que vive por debajo de 450 Hz, los tres procedimientos que llevan la propagación ascendente del enmascaramiento se desploman juntos mientras que el de octava no se mueve en absoluto, 0,81 unidades de índice de separación en el punto más ruidoso, que es casi toda la escala. Un SII en bandas de octava bajo un ruido dominado por la baja frecuencia es una cota superior, no una estimación.

Mostrar el código de esta figura
levels = np.arange(45.0, 80.1, 1.0)
for method in ("critical-band", "equally-contributing", "one-third-octave",
"octave"):
proc = speech.sii_procedure(method)
curve = [speech.speech_intelligibility_index(
proc.speech_spectrum,
np.where(np.asarray(proc.frequencies) <= 450.0, x, 0.0),
method=method).sii for x in levels]
print(method, round(curve[0], 3), round(curve[-1], 3))
# critical-band 0.736 0.03
# equally-contributing 0.753 0.026
# one-third-octave 0.777 0.067
# octave 0.882 0.872

Qué procedimiento usar.

  • "one-third-octave" es el valor por omisión de trabajo: la resolución más fina que ofrece la norma, la única tabla que trae los cuatro espectros de voz por esfuerzo vocal y la resolución en la que suelen llegar los datos de medición.
  • "critical-band" sigue el filtro auditivo. Sus 21 bandas son las bandas críticas clásicas, por lo que es el procedimiento a emparejar con modelos de enmascaramiento o sonoridad por bandas críticas, y el único que baja hasta los 100 Hz.
  • "equally-contributing" da a sus 17 bandas la misma importancia entre 300 Hz y 6400 Hz, así que el índice se lee directamente como la fracción de bandas igualmente importantes que son audibles. Eso lo hace rápido de comprobar a mano, y es la presentación más cercana a la tradición del índice de articulación de la que nació el SII.
  • "octave" es para datos por bandas de octava, que es lo que dan de forma rutinaria los sonómetros, la selección de equipos de climatización y los informes de acústica de la edificación. Úsalo cuando sea todo lo que tengas, y léelo sabiendo que falta la propagación del enmascaramiento.

Una función de importancia de banda alternativa. band_importance= sustituye la tabulada del procedimiento por otra propia, que es la forma de aplicar las funciones del Anexo B de la norma para materiales de ensayo de habla concretos (sílabas sin sentido, listas de palabras monosílabas, pasajes cortos). Solo cambia la ponderación: la cadena de audibilidad, y por tanto result.band_audibility, queda intacta.

res = speech.speech_intelligibility_index(
"normal", np.full(6, 25.0), method="octave",
band_importance=[0.0, 0.0, 1.0, 0.0, 0.0, 0.0], # todo el peso en 1 kHz
)
print(round(res.sii, 3)) # 0.5 (solo la banda de octava de 1 kHz)

Las constantes tabuladas. sii_procedure(method) devuelve un SIIProcedure con las frecuencias centrales de banda, los límites de banda, la función de importancia de banda, el nivel espectral de ruido interno de referencia y el nivel espectral de voz estándar de esfuerzo normal de ese procedimiento; su .plot() dibuja la función de importancia de banda como escalón sobre los límites de banda, que es la figura de arriba. Las Tablas 1, 2 y 4 imprimen en la norma las cuatro columnas de esfuerzo vocal, pero aquí solo se incluye su columna de esfuerzo normal, de modo que "raised", "loud" y "shout" están disponibles únicamente en el procedimiento por tercios de octava.

octave = speech.sii_procedure("octave")
print(octave.frequencies) # [ 250. 500. 1000. 2000. 4000. 8000.]
print(octave.band_importance) # [0.0617 0.1671 0.2373 0.2648 0.2142 0.0549]
# La Tabla 2 son las bandas críticas 3 a 19 de la Tabla 1, ponderadas por igual.
equal = speech.sii_procedure("equally-contributing")
print(equal.band_edges[0], equal.band_edges[-1]) # 300.0 6400.0
print(equal.band_importance.sum().round(4)) # 0.9996

Las dos métricas del habla responden preguntas distintas a partir de mediciones distintas, y cada una es ciega a lo que la otra captura:

SII (ANSI S3.5)STI (IEC 60268-16)
Pregunta que responde¿Es audible suficiente espectro del habla en el oído de quien escucha?¿Cuánta de la envolvente del habla conserva el canal de transmisión?
EntradasEspectros de habla, ruido y umbral de audición (18 niveles espectrales equivalentes de tercio de octava)Una respuesta al impulso (indirecto) o una grabación STIPA a través del canal (directo)
Maquinaria de bandasPonderación por importancia de banda aplicada a la audibilidad de banda Función de transferencia de modulación por banda de octava, convertida en una SNR efectiva
CapturaRuido estacionario, propagación ascendente del enmascaramiento, pérdida auditiva, esfuerzo vocal, distorsión de nivelReverberación, ecos, ruido y (medido en directo) procesado no lineal
Ciega aLa reverberación y cualquier emborronamiento temporal: un canal totalmente audible pero irremediablemente reverberante sigue puntuando altoEl estado auditivo individual: los oyentes con pérdida auditiva requieren correcciones específicas
Uso típicoAudiología, audífonos y protectores, objetivos de control de ruido en una posición de escuchaSistemas de megafonía, interfonos y salas: valorar un canal de transmisión de extremo a extremo

El mismo espacio puede aprobar una y suspender la otra. Un atrio silencioso y muy reverberante es un SII cercano a 1 con un STI pobre; una oficina seca inundada de ruido de ventilación puede dar un STI aceptable desde su respuesta al impulso mientras el SII (y el STI consciente del ruido, vía snr= o level=) revela que poco del espectro del habla supera el ruido. Cuando ambos mecanismos están en juego, calcula ambos; las entradas son baratas una vez medidas la sala y el ruido. Consulta la guía del índice de transmisión del habla para el lado del STI.

SIIResult.report(path) genera una ficha PDF de una página dispuesta como un informe de audibilidad del habla: una línea de base normativa, un bloque de metadatos opcional, una tabla por bandas de tercio de octava del espectro del habla equivalente , la función de importancia de banda de la Tabla 3 y la función de audibilidad de banda junto a las barras de audibilidad y de aportación ponderada por importancia (el .plot() del propio resultado), el número único enmarcado SII = X, una fila de veredicto opcional y un pie con el descargo fijo. Usa el mismo contenedor ReportMetadata y el mismo motor que la ficha de aislamiento de ISO 717; un requirement indicado se interpreta como el SII mínimo exigido (un SII mayor cumple). verbose=True añade la columna del nivel de espectro de perturbación equivalente . La generación necesita reportlab y, para la figura que incrusta la ficha, matplotlib (pip install "phonometry[report,plot]"); solo se admite engine="reportlab". Pasa language="es" para la ficha en español.

from phonometry import ReportMetadata, speech
res = speech.speech_intelligibility_index(speech_spectrum, noise, threshold=threshold)
res.report(
"sii_fiche.pdf",
metadata=ReportMetadata(
specimen="Habla conversacional en ruido ambiente de baja frecuencia",
measurement_standard="ANSI S3.5-1997",
laboratory="Laboratorio de referencia Phonometry",
requirement=0.75, # SII mínimo exigido (un SII mayor cumple)
),
language="es",
)

La ficha de ejemplo se regenera con make reports y se mantiene renderizada en el repositorio; pulsa la vista previa para abrir el PDF.

Informe de ejemplo SII ANSI S3.5-1997 (PDF)

Ficha de índice de inteligibilidad del habla de una página: cabecera de metadatos, tabla por bandas de tercio de octava del espectro del habla equivalente, la importancia de banda y la audibilidad de banda, las barras de audibilidad, el número único enmarcado SII = 0,851 y un veredicto CUMPLE frente a un mínimo de 0,75.

Descargar el informe (PDF)

Ficha de índice de inteligibilidad del habla (SIIResult.report), el SII con su audibilidad por banda.
  • Cubierto

    Los cuatro procedimientos por bandas de ANSI S3.5-1997 (R2017): el método por bandas críticas (21 bandas, Tabla 1), el de bandas críticas de contribución equitativa (17 bandas, Tabla 2), el de bandas de tercio de octava (18 bandas, Tabla 3, el valor por omisión) y el de bandas de octava (6 bandas, Tabla 4). Para cada uno: los niveles espectrales equivalentes de habla, ruido y umbral de audición, la función de importancia de banda y el nivel espectral de voz estándar, el autoenmascaramiento del habla, la propagación ascendente del enmascaramiento, el factor de distorsión de nivel y la función de audibilidad de banda del apartado 5, y el índice del apartado 6. speech_intelligibility_index (con method= y band_importance=), sii_procedure, standard_speech_spectrum y standard_speech_spectra implementan esto, y SIIResult.report(path) genera la ficha de ANSI S3.5-1997 para el procedimiento que se haya usado.

  • No cubierto

    Los espectros de voz estándar de esfuerzo vocal elevado, fuerte y de grito solo se incluyen para el procedimiento por tercios de octava; las Tablas 1, 2 y 4 se implementan con su columna de esfuerzo normal, que es la que necesita el factor de distorsión de nivel del apartado 5.7. Las funciones de importancia de banda tabuladas son el compromiso de habla promedio de cada tabla; las funciones de importancia alternativas del Anexo B para materiales de ensayo concretos (sílabas sin sentido, listas de palabras monosílabas, pasajes cortos) no se distribuyen como constantes, pero cualquier función de importancia puede aplicarse con band_importance=. No se ofrece remuestreo entre los cuatro conjuntos de bandas: cada procedimiento se alimenta con espectros en sus propias bandas. El índice de transmisión del habla, una métrica distinta para un canal de transmisión en vez de la audibilidad de quien escucha, se cubre aparte en la guía del índice de transmisión del habla.

¿Qué bandas de frecuencia importan más para la inteligibilidad del habla?

Sección titulada «¿Qué bandas de frecuencia importan más para la inteligibilidad del habla?»

En el método por bandas de tercio de octava de ANSI S3.5-1997, la función de importancia de banda (Tabla 3, material de habla promedio) suma uno sobre las 18 bandas de 160 Hz a 8000 Hz. Las cinco bandas de 1250 Hz a 3150 Hz transportan en torno al 43 % de la inteligibilidad (las claves consonánticas), mientras que las cinco bandas más bajas, de 160 Hz a 400 Hz, transportan en torno al 11 % aunque contienen casi la mitad de la potencia del habla.

¿Cómo se calcula el índice de inteligibilidad del habla?

Sección titulada «¿Cómo se calcula el índice de inteligibilidad del habla?»

El SII del apartado 6 de ANSI S3.5-1997 es la suma de las audibilidades de banda ponderada por la importancia de banda, , sobre las 18 bandas de tercio de octava. Cada audibilidad de banda es (apartado 5.8), donde es el nivel espectral del habla equivalente y la perturbación equivalente, que combina el ruido externo, la propagación ascendente del enmascaramiento y el ruido interno equivalente. El índice queda en .

¿Cuál de los cuatro procedimientos por bandas de ANSI S3.5 debo usar?

Sección titulada «¿Cuál de los cuatro procedimientos por bandas de ANSI S3.5 debo usar?»

ANSI S3.5-1997 define cuatro, citados aquí por el centro de banda: bandas críticas (21 bandas, centros de 150 Hz a 8500 Hz), bandas críticas de contribución equitativa (17 bandas, centros de 350 Hz a 5800 Hz), tercio de octava (18 bandas, centros de 160 Hz a 8000 Hz) y octava (6 bandas, centros de 250 Hz a 8000 Hz). Usa method="one-third-octave" por omisión: es la resolución más fina y el único procedimiento cuya tabla trae los espectros de voz elevado, fuerte y de grito. Usa method="critical-band" para alinear el índice con un modelo de enmascaramiento o sonoridad por bandas críticas (Bark), method="equally-contributing" cuando el índice deba leerse como la fracción de bandas igualmente importantes que son audibles, y method="octave" cuando solo se hayan medido datos por bandas de octava, recordando que el procedimiento de octava no incluye la propagación ascendente del enmascaramiento y por tanto lee alto con ruido fuerte en baja frecuencia.

Usa el SII (ANSI S3.5) cuando la pregunta es si suficiente espectro del habla es audible en el oído de quien escucha: captura el ruido estacionario, la propagación ascendente del enmascaramiento, la pérdida auditiva y el esfuerzo vocal, pero es ciego a la reverberación. El STI (IEC 60268-16) valora un canal de transmisión, cuánta de la modulación del habla conserva una sala o un sistema de sonido. Cuando ambos mecanismos están en juego, calcula ambos.

  • American National Standards Institute. (1997). American National Standard Methods for the Calculation of the Speech Intelligibility Index (ANSI S3.5-1997 (R2017)). Acoustical Society of America. Los cuatro procedimientos por bandas: bandas críticas (21 bandas, Tabla 1), bandas críticas de contribución equitativa (17 bandas, Tabla 2), tercio de octava (18 bandas, Tabla 3) y octava (6 bandas, Tabla 4), cada uno con su función de importancia de banda, nivel espectral del habla estándar y ruido interno de referencia; el procedimiento de enmascaramiento, perturbación y audibilidad de banda (apartado 5) y el índice (apartado 6).
  • French, N. R. y Steinberg, J. C. (1947). Factors governing the intelligibility of speech sounds. The Journal of the Acoustical Society of America, 19(1), 90-119. https://doi.org/10.1121/1.1916407Los experimentos por bandas de articulación de los que desciende la función de importancia de banda de la sección 1.