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 el método por bandas de tercio de octava de ANSI S3.5-1997 (R2017): 18 bandas de 160 Hz a 8000 Hz.

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 automáscara del habla y propagación de la máscara (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 automáscara del habla y propagación de la máscara (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, cláusulas 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 hearing
# El espectro de habla estándar de esfuerzo normal (Tabla 3) en silencio, audición normal.
result = hearing.speech_intelligibility_index("normal")
print(round(result.sii, 3)) # 0.996 (casi todo audible)
print(round(hearing.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 la propia automáscara 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 Ii 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.

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, cláusula 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 (cláusula 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 (cláusula 5.6), y la función de audibilidad de banda es la razón habla-perturbación escalada a (cláusula 5.8):

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

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

import numpy as np
from phonometry import hearing
speech = hearing.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 = hearing.speech_intelligibility_index(speech, 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 hearing
speech = hearing.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 = hearing.speech_intelligibility_index(speech, 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()

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. 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 hearing
# 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 = hearing.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 = hearing.speech_intelligibility_index(speech, 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. Los umbrales por edad de ISO 7029 son una entrada poblacional cómoda, véase la guía del umbral de audición.

Los hablantes elevan la voz en ruido, y la norma da cuatro espectros de voz estándar para los esfuerzos vocales normal, elevada, 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 hearing
# 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 hearing.sii.VOCAL_EFFORTS:
print(effort, round(hearing.speech_intelligibility_index(effort, noise).sii, 2))
# normal 0.12 | raised 0.36 | loud 0.59 | shout 0.79
print(hearing.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, elevada, 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, elevada, 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 hearing
# Una línea: toda la familia de la Tabla 3 de ANSI S3.5-1997.
hearing.standard_speech_spectra().plot(language="es")
plt.show()
# A mano, reproduciendo lo que dibuja StandardSpeechSpectrum.plot():
res = hearing.standard_speech_spectra()
pos = np.arange(res.frequencies.size)
fig, ax = plt.subplots()
for effort, levels in zip(res.vocal_efforts, res.levels):
ax.plot(pos, levels, "o-", label=effort.capitalize())
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 espectral del habla [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, elevada, 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, elevada, 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 hearing
# 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 = hearing.sii.VOCAL_EFFORTS # ("normal", "raised", "loud", "shout")
freqs = hearing.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, hearing.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 espectral del habla [dB SPL]")
ax_s.legend()
# Derecha: el SII que alcanza cada espectro en el ruido fijo.
sii = [hearing.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.

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 Ii aplicada a la audibilidad de banda AiFunción de transferencia de modulación m(F) 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: calificar 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 norma base, 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 (pip install phonometry[report]); solo se admite engine="reportlab". Pasa language="es" para la ficha en español.

from phonometry import hearing, ReportMetadata
res = hearing.speech_intelligibility_index(speech, 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. El método por bandas de tercio de octava de ANSI S3.5-1997 (R2017) (18 bandas, 160 Hz a 8000 Hz): los niveles espectrales equivalentes de habla, ruido y umbral de audición, la función de importancia de banda de la Tabla 3 y los espectros de voz estándar por esfuerzo vocal, la automáscara del habla, la propagación ascendente de la máscara, el factor de distorsión de nivel y la función de audibilidad de banda de la cláusula 5, y el índice de la cláusula 6. speech_intelligibility_index, standard_speech_spectrum y standard_speech_spectra implementan esto, y SIIResult.report(path) genera la ficha de ANSI S3.5-1997.

No cubierto. El título de la norma está en plural (“Methods for the Calculation of the Speech Intelligibility Index”): phonometry implementa solo el procedimiento por bandas de tercio de octava, no los demás métodos de resolución de banda de la norma. La función de importancia de banda usada es siempre el compromiso de habla promedio de la Tabla 3; 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 están implementadas. 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 de la cláusula 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 (cláusula 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 .

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) califica 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. El método por bandas de tercio de octava (18 bandas): la función de importancia de banda (Tabla 3), el nivel espectral del habla estándar y el ruido interno de referencia (Tabla 3), el procedimiento de enmascaramiento, perturbación y audibilidad de banda (cláusula 5) y el índice (cláusula 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.