Sintetizador de Voz Basado en Lpc_v1.2

10
Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 1 ResumenEste trabajo presenta el diseño de un sistema de síntesis de voz en tiempo real basado en coeficientes de predicción lineal (LPC). Este sistema se encuentra fundamentado en el detector de actividad de voz (VAD) para determinar que segmentos de la señal que se quiere sintetizar son sonoros y cuales no sonoros, se cimenta en el uso de la autocorrelación para detectar el periodo fundamental de cada segmento de la señal y en los coeficientes de predicción lineal (LPC) para modelar el tracto vocal. Cada uno de los bloques que conforman el sintetizador se realiza a través de la herramienta MATLAB para luego efectuar las simulaciones pertinentes. Palabras claveSintetizador, detector de voz, filtro preénfasis, segmento, autocorrelación, periodo, coeficientes, error. AbstractThis paper presents the design of a speech synthesis system in real time based on linear prediction coefficients, where this is based on the detector of voice activity (VAD) to determine which segments of the signal that you want to synthesize are sound and which do not sound, the use of autocorrelation to detect the critical period of each segment of the signal and linear prediction coefficients to model the vocal tract. Each of the blocks that make up the synthesizer is performed in MATLAB tool to perform the relevant simulations. Key wordsSynthesizer, voice detector, preemphasis filter, frame, autocorrelation, pitch, coefficients and error. I. INTRODUCCIÓN La síntesis de la señal vocal es la creación de voz sintetizada, donde se desea que una máquina sea capaz de expresarse emitiendo sonidos que se puedan entender como palabras u oraciones. Esto conlleva a la comprensión total del proceso del habla, implicando la interacción de disciplinas en las que está incluida la fisiología del órgano humano así como también la lingüística. La voz se produce en la laringe, que es una estructura con unos cartílagos flexibles que son el soporte de las cuerdas vocales. Estas cuerdas vocales están formadas por unos músculos finos, que dispuestos en posición horizontal forman una especie de V. Para producir un sonido en concreto, las cuerdas vocales se contraen o se alargan. Por otro lado, también se da un cambio en la presión del aire al salir a través de los pliegues vocales. Todo ello produce una vibración que al resonar por la laringe produce el sonido. Un sonido tiene tres cualidades básicas; el tono o altura, volumen o intensidad y el timbre o resonancia. Al espacio situado entre dos cuerdas vocales se llama glotis, variando este espacio el cuerpo consigue dar al sonido las cualidades adecuadas de tono y volumen. La cualidad del timbre la determina la posición resonadora de la garganta, boca y nariz, que son cavidades que modulan y amplifican el sonido de la laringe. II. PROCESAMIENTO DE VOZ El procesamiento de voz es el estudio de la señal de voz y las técnicas de procesado de estas señales. Este procesamiento se divide en distintas categorías: el reconocimiento de voz, mejora de la señal voz, codificación de la señal voz y síntesis de voz. A. Naturaleza de la señal vocal El análisis de la señal vocal se lleva a cabo mediante un modelo que describe el proceso del habla, clasificando las señales en dos tipos: o Las señales sonoras que presentan cierta periodicidad como se muestra en la siguiente figura: Fig. 1. Periodicidad de un segmento sonoro 0 50 100 150 200 250 -0.2 -0.15 -0.1 -0.05 0 0.05 0.1 0.15 Muestras (t=N/fs) Amplitud Sintetizador de Voz Basado en LPC Gerardo Andrés López [email protected] Universidad del Quindío

Transcript of Sintetizador de Voz Basado en Lpc_v1.2

Page 1: Sintetizador de Voz Basado en Lpc_v1.2

Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 1

Resumen— Este trabajo presenta el diseño de un sistema de

síntesis de voz en tiempo real basado en coeficientes de

predicción lineal (LPC). Este sistema se encuentra

fundamentado en el detector de actividad de voz (VAD) para

determinar que segmentos de la señal que se quiere sintetizar

son sonoros y cuales no sonoros, se cimenta en el uso de la

autocorrelación para detectar el periodo fundamental de cada

segmento de la señal y en los coeficientes de predicción lineal

(LPC) para modelar el tracto vocal. Cada uno de los bloques

que conforman el sintetizador se realiza a través de la

herramienta MATLAB para luego efectuar las simulaciones

pertinentes.

Palabras clave— Sintetizador, detector de voz, filtro

preénfasis, segmento, autocorrelación, periodo, coeficientes,

error.

Abstract— This paper presents the design of a speech

synthesis system in real time based on linear prediction

coefficients, where this is based on the detector of voice

activity (VAD) to determine which segments of the signal that

you want to synthesize are sound and which do not sound, the

use of autocorrelation to detect the critical period of each

segment of the signal and linear prediction coefficients to

model the vocal tract. Each of the blocks that make up the

synthesizer is performed in MATLAB tool to perform the

relevant simulations.

Key words— Synthesizer, voice detector, preemphasis filter,

frame, autocorrelation, pitch, coefficients and error.

I. INTRODUCCIÓN

La síntesis de la señal vocal es la creación de voz

sintetizada, donde se desea que una máquina sea

capaz de expresarse emitiendo sonidos que se

puedan entender como palabras u oraciones. Esto

conlleva a la comprensión total del proceso del

habla, implicando la interacción de disciplinas en

las que está incluida la fisiología del órgano

humano así como también la lingüística.

La voz se produce en la laringe, que es una

estructura con unos cartílagos flexibles que son el

soporte de las cuerdas vocales. Estas cuerdas

vocales están formadas por unos músculos finos,

que dispuestos en posición horizontal forman una

especie de V. Para producir un sonido en concreto,

las cuerdas vocales se contraen o se alargan. Por

otro lado, también se da un cambio en la presión del

aire al salir a través de los pliegues vocales. Todo

ello produce una vibración que al resonar por la

laringe produce el sonido. Un sonido tiene tres

cualidades básicas; el tono o altura, volumen o

intensidad y el timbre o resonancia.

Al espacio situado entre dos cuerdas vocales se

llama glotis, variando este espacio el cuerpo

consigue dar al sonido las cualidades adecuadas de

tono y volumen. La cualidad del timbre la

determina la posición resonadora de la garganta,

boca y nariz, que son cavidades que modulan y

amplifican el sonido de la laringe.

II. PROCESAMIENTO DE VOZ

El procesamiento de voz es el estudio de la señal de

voz y las técnicas de procesado de estas señales.

Este procesamiento se divide en distintas categorías:

el reconocimiento de voz, mejora de la señal voz,

codificación de la señal voz y síntesis de voz.

A. Naturaleza de la señal vocal

El análisis de la señal vocal se lleva a cabo

mediante un modelo que describe el proceso del

habla, clasificando las señales en dos tipos:

o Las señales sonoras que presentan cierta

periodicidad como se muestra en la siguiente

figura:

Fig. 1. Periodicidad de un segmento sonoro

0 50 100 150 200 250-0.2

-0.15

-0.1

-0.05

0

0.05

0.1

0.15

Señal Sintetizada

Muestras (t=N/fs)

Am

pli

tud

Sintetizador de Voz Basado en LPC Gerardo Andrés López

[email protected]

Universidad del Quindío

Page 2: Sintetizador de Voz Basado en Lpc_v1.2

Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 2

o Las señales no sonoras también conocidas como

fricativas que presentan aleatoriedad en forma

de ruido blanco como se muestra en la siguiente

figura:

Fig. 2. Aleatoriedad de un segmento no sonoro

B. Extracción de características

La extracción de características intenta presentar el

contenido de la señal de voz de manera compacta,

de tal forma que la información propia de la señal se

preserva.

o Limitación en frecuencia

Para lograr esto se aplica un filtro de preénfasis que

amplifica las frecuencias más altas y comprime la

señal, donde la compresión es deseable para mejorar

la respuesta del detector de voz.

La señal de entrada s(n) es filtrada con el siguiente

filtro para obtener una señal pre-enfatizada:

�̂�(𝑛) = 𝑠(𝑛) − 𝛼𝑠(𝑛 − 1) (1)

Donde 𝛼 tiene un valor próximo a la unidad. [1]

o Segmentación

Usualmente el análisis de las características de la

señal de voz se desarrolla segmentando la señal en

bloques que se tratan individualmente. Para evitar

los efectos negativos provocados al tomar un

segmento que contenga una transición de una zona

de la señal cuasi-estacionaria (casi estacionaria) a la

siguiente, se usa la técnica del solapamiento de

segmentos.

La siguiente ecuación permite el cálculo de

muestras para cada segmento:

𝑁 = (𝑚𝑢𝑒𝑠𝑡𝑟𝑎𝑠/𝑠𝑒𝑔𝑢𝑛𝑑𝑜) ∗ 𝑙𝑜𝑛𝑔𝑖𝑡𝑢𝑑 𝑑𝑒𝑙 𝑓𝑟𝑎𝑚𝑒 (2)

Las siguientes ecuaciones representan la señal en

segmentos, sin solapar y con solapamiento

respectivamente:

𝑓𝑗 = {𝑥(𝑖)}𝑖=(𝑗−1)𝑁+1𝑗𝑁

(3) − 𝑎

𝑓𝑗 = {𝑥(𝑖)}𝑖=(𝑗−1)𝑁+1𝑗𝑁−(𝑗−1)𝑁

(3) − 𝑏

o Enventanado Se aplica a cada segmento una función ventana, que

suaviza los bordes del intervalo haciendo que estos

tiendan a cero, y resalta la parte central acentuando

las propiedades características del segmento:

𝑆′𝑓𝑟𝑎𝑚𝑒(𝑛) = 𝑆𝑓𝑟𝑎𝑚𝑒(𝑛) ∗ 𝑉(𝑛) ,0 ≤ 𝑛 ≤ 𝑁 − 1 (4)

La función ventana más comúnmente utilizada en el

análisis de la señal de voz, es la llamada ventana

Hamming, su mayor virtud radica en que mantiene

un buen equilibrio entre su duración temporal y su

resolución en frecuencia.

o Detección de voz

La detección de voz se lleva a cabo a través de los

detectores de actividad de voz (VAD), estos pueden

esquematizarse mediante el diagrama de bloques

mostrado en la figura 3. La decisión del VAD se

realiza en base a la información suministrada por las

características de cada frame y finalmente, esta

decisión se suaviza en el tiempo.

Fig. 3. Diagrama de bloques del VAD

En este caso la detección de voz se lleva a cabo a

través del detector de actividad de voz (VAD)

propuesto por el artículo Dynamical Energy-Based

Speech/Silence Detector for Speech Enhancement

Applications. Se declara actividad de voz (VAD =

0 50 100 150 200 250-1.5

-1

-0.5

0

0.5

1

1.5x 10

-3

Muestras (t=N/fs)

Am

pli

tud

Page 3: Sintetizador de Voz Basado en Lpc_v1.2

Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 3

1) si los valores medidos superan los umbrales. De

lo contrario, sino se detecta ninguna actividad (es

decir, ruido), se declara como silencio (VAD = 0).

o Sonoridad y pitch

Una vez establecido qué segmentos son sonoros

utilizando el VAD, se procede a determinar el pitch

o periodo fundamental a partir de la función de

autocorrelación determinada por la siguiente

ecuación:

𝑅(𝜏) =1

𝑁∑ 𝑆𝑗 ∗ 𝑆𝑗−𝜏

𝑁

𝑗=1

(6)

Si el segmento es periódico, la función de

autocorrelación también lo será, esto se traducirá en

un valor máximo para aquellos retardos iguales al

período de la señal, por lo tanto, el máximo global

corresponde al retardo nulo, mientras que el

segundo máximo debiese corresponder al retardo

igual al período fundamental [2].

o Modelado del tracto vocal

La idea fundamental es que a partir de una

determinada muestra de la voz o trama y aplicando

un modelo determinado para la generación de la

misma, se obtiene un conjunto de parámetros que

definen el modelo. Ese modelo corresponde a un

modelo de predicción lineal LPC (Linear Predictive

Coding), donde el tracto vocal, se puede describir

por un filtro todo polo de respuesta impulsiva

infinita (IIR) con una función de transferencia dada

por:

𝐻(𝑧) =𝑏0

1 + ∑ 𝑎𝑘𝑧−𝑘𝑃𝑘=1

(7)

Donde 𝑏02 es la varianza del ruido blanco de entrada

o error de predicción.

La ecuación en diferencias del sistema que modela

el tracto vocal resulta en:

𝑠(𝑛) = ∑ 𝑎𝑘𝑠(𝑛 − 𝑘)

𝑃

𝑘=1

+ 𝐺𝑢(𝑛) (8)

El término de la sumatoria, puede interpretarse

como un predictor lineal en el cual la muestra de

salida se puede generar mediante una combinación

lineal de P muestras anteriores, donde se puede

calcular el error de predicción e(n) como:

𝑠′(𝑛) = ∑ 𝑎𝑘𝑠(𝑛 − 𝑘)

𝑃

𝑘=1

(9)

𝑒(𝑛) = 𝑠(𝑛) − 𝑠′(𝑛) = 𝐺𝑢(𝑛) (10)

Una vez determinado el filtro, este tiene dos

posibles señales de entrada que dependerán del tipo

de señal, sonora o no sonora. Para señales sonoras

la excitación será un tren de impulsos de frecuencia

controlada, mientras que para las señales no sonoras

la excitación será ruido aleatorio, donde la

combinación de estas señales modela el

funcionamiento de la glotis.

Fig. 4. Modelo de producción de voz

Este diagrama enseña el proceso de producción de

voz, donde los parámetros del tracto vocal se

calculan a través de la función LPC suministrada

por la herramienta MATLAB.

III. DESCRIPCIÓN DE BLOQUES

Los siguientes bloques describen cada uno de los

algoritmos que conforman el sistema sintetizador de

voz; el algoritmo de preénfasis para comprimir la

señal en amplitud, el algoritmo para determinar qué

segmentos de la señal son sonoros y cuales son

fricativos, el algoritmo que calcula la

autocorrelación para la detección del pitch y el

algoritmo que modela el tracto vocal para sintetizar

la señal voz.

A. Filtro de preénfasis

Este bloque tiene como función realizar la

traducción de la ecuación (1) (ecuación en

diferencias del filtro) al correspondiente código

MATLAB.

Page 4: Sintetizador de Voz Basado en Lpc_v1.2

Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 4

Señal de entrada

Señal preenfatizada

Filtro de preénfasis

Fig. 5. Diagrama de bloques del filtro de preénfasis

B. Detector de actividad de voz

El siguiente diagrama de bloques extraído del

artículo Dynamical Energy-Based Speech/Silence

Detector for Speech Enhancement Applications,

describe el algoritmo empleado para determinar qué

segmentos de la señal, son sonoros y cuáles no.

Fig. 6. Diagrama de flujo del VAD

El algoritmo caracteriza su comportamiento a través

de la energía de raíz media cuadrática (RMSE) de

un segmento de voz; la estimación del umbral se

basa en la observación de que la energía a corto

plazo exhibe distintos picos y valles

correspondientes a períodos de actividad o de

silencio de la voz.

C. Detector de Pitch

El detector de pitch se basa en el cálculo de la

autocorrelación de cada segmento extraído de la

señal, para luego buscar los dos picos máximos que

permitan determinar el periodo fundamental.

Cálculo de

autocorrelaciónBúsqueda del pico maximo

S[n]R[τ ] Pico máximo

Posición Fig. 7. Diagrama de bloques del detector de pitch

El siguiente diagrama de flujo contiene los detalles

de cómo determinar el pitch:

signal frame

N=length(signal frame); index=0max=0

Calculate R[τ ]

R[τ ]>max

max=R[τ ]; index=τ

τ++

return index & max

τ>N-

+

-+

Fig. 8. Diagrama de flujo del detector de pitch

D. Modelo del tracto vocal

Este bloque representa el filtro final con el que se

obtiene la señal sintetizada, este recibe los

Page 5: Sintetizador de Voz Basado en Lpc_v1.2

Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 5

parámetros producidos por la función lpc (Linear

Predictor Coefficients) de MATLAB y el tipo de

excitación; tren de impulsos, con periodo igual a la

frecuencia fundamental calculada en el bloque

anterior, para segmentos sonoros y ruido para

segmentos no sonoros.

Filtro todo polo IIR

Tren de impulsos

Ruido

Parámetros del tracto vocal

Voz Sintetizada

Fig. 9. Diagrama de bloques del modelo del tracto vocal

IV. RESULTADOS MATLAB

Después de haber establecido cada uno de los

bloques que conforman el sistema, se procede a

realizar la experimentación con la señal grabada

“sintetizador de voz” a una frecuencia de muestreo

de 8000Hz durante dos segundos.

A. Bloque de preénfasis

La siguiente figura enseña la señal de entrada

graficada con respecto al número de muestras en

contraste con la misma señal pero procesada por el

filtro de preénfasis.

Fig. 10. Señal de entrada sin filtro y con filtro de preénfasis

Se observa la compresión del rango dinámico de la

señal a partir de la utilización de dicho filtro, cuyo

objetivo no es más que facilitar la decisión del

VAD, realzar las frecuencias altas y suavizar el

espectro.

B. Bloque VAD

Para llevar a cabo la detección de los segmentos

sonoros y no sonoros se aplica el algoritmo VAD

descrito anteriormente, donde a partir del cálculo

del valor cuadrático de la energía, del

establecimiento del valor máximo y mínimo de la

energía y del umbral establecido para cada frame se

obtienen las siguientes curvas características:

Fig. 11. Energía RMS, energía mínima y umbral de energía

Fig. 12. Energía RMS y energía máxima

Los parámetros anteriores, representados en las

gráficas, son el fundamento de la decisión del VAD,

lo que da lugar al resultado de la figura 13, se

observa la alta sensibilidad del VAD frente frames

de la señal que presentan una amplitud cercana al

umbral que se establece, lo que se traduce en un

valor binario clasificatorio (como voz o ruido) para

esos frames sin ser realmente frames de voz:

0 2000 4000 6000 8000 10000 12000 14000 16000-1

-0.5

0

0.5

1

Señal de Entrada

Muestras

Am

pli

tud

0 2000 4000 6000 8000 10000 12000 14000 16000-0.5

0

0.5

1

Señal con Filtrado de Preénfasis

Muestras

Am

pli

tud

0 20 40 60 80 100 120 1400

0.01

0.02

0.03

0.04

0.05

0.06

0.07

0.08

0.09

0.1

Energías de la Señal de Entrada y Umbral de Energía

Segmentos

Am

pli

tud

Energía de la señal

Energía mínima

Umbral de energía

0 20 40 60 80 100 120 1400

0.01

0.02

0.03

0.04

0.05

0.06

0.07

0.08

0.09

0.1

Energía de la Señal de Entrada y su Energía Máxima

Segmentos

Am

pli

tud

Energía de la señal

Energía máxima

Page 6: Sintetizador de Voz Basado en Lpc_v1.2

Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 6

Fig. 13. Detector de actividad de voz

Para reducir la sensibilidad del VAD al nivel de

ruido se utiliza un valor de cota superior para el

nivel del umbral, lo que produce el siguiente

resultado:

Fig. 14. Energía RMS, energía mínima y umbral de energía

Fig. 15. Detector de actividad de voz

El incremento del umbral supone una mejora en el

momento de sintetizar la señal, puesto que

segmentos que no son sonoros no serán excitados

con el tren de impulsos, como si ocurre inicialmente

con el VAD calculado (figura 13), donde ciertos

segmentos no sonoros serán excitados con el tren de

impulsos y no con ruido, como debiera ocurrir.

C. Bloque sintetizador

Este bloque calcula la frecuencia fundamental de

cada segmento clasificado como sonoro por el

VAD. Se emplea el filtro todo polo IIR, que

representa el tracto vocal, para sintetizar la señal de

voz a partir de los coeficientes lpc extraídos con la

herramienta MATLAB y la excitación que

corresponda, tren de impulsos para segmentos

sonoros y ruido para segmentos no sonoros.

Inicialmente se sintetiza la señal haciendo uso de un

nivel de umbral reducido en el VAD para enseñar lo

anteriormente expuesto:

Fig. 16. Sintetizador de voz

Para luego incrementar el umbral y obtener el

siguiente resultado:

Fig. 17. Sintetizador de voz

0 2000 4000 6000 8000 10000 12000 14000 16000-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

Gráfica del VAD y de la Señal de Entrada

Muestras

Am

pli

tud

0 20 40 60 80 100 120 1400

0.01

0.02

0.03

0.04

0.05

0.06

0.07

0.08

0.09

0.1

Energías de la Señal de Entrada y Umbral de Energía

Segmentos

Am

pli

tud

Energía de la señal

Energía mínima

Umbral de energía

0 2000 4000 6000 8000 10000 12000 14000 16000-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

Gráfica del VAD y de la Señal de Entrada

Muestras

Am

pli

tud

0 2000 4000 6000 8000 10000 12000 14000 16000-1

0

1

Señal de Entrada

Muestras

Am

pli

tud

0 2000 4000 6000 8000 10000 12000 14000 16000-0.5

0

0.5

1

Señal Preénfasis y VAD

Muestras

Am

pli

tud

0 2000 4000 6000 8000 10000 12000 14000 16000-0.1

0

0.1

Señal Sintetizada

Muestras

Am

pli

tud

0 2000 4000 6000 8000 10000 12000 14000 16000-1

0

1

Señal de Entrada

Muestras

Am

pli

tud

0 2000 4000 6000 8000 10000 12000 14000 16000-0.5

0

0.5

1

Señal Preénfasis y VAD

Muestras

Am

pli

tud

0 2000 4000 6000 8000 10000 12000 14000 16000-0.1

0

0.1

Señal Sintetizada

Muestras

Am

pli

tud

Page 7: Sintetizador de Voz Basado en Lpc_v1.2

Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 7

Observándose una señal sintetizada con menos

ruido con respecto a la del umbral inicial (figura

17).

Fig. 18. Voz sintetizada

IV. CONCLUSIONES

Se comprendió en términos generales el proceso de

sintetizado de una señal de voz, entendiendo de qué

manera una de las técnicas más usadas en el

procesamiento de señales permite, de modo

eficiente, parametrizar cualquier señal en un

conjunto pequeño de patrones o coeficientes que

admiten la reconstrucción adecuada de dicha señal.

Haciendo uso del método de detección de pitch a

través de la autocorrelación se logra obtener, de

manera sencilla, la frecuencia fundamental de cada

segmento, donde su baja complejidad

computacional hace de este el método ideal para

entender por qué ciertos segmentos de voz

presentan características estacionarias

caracterizadas por un periodo fundamental.

Establecer un umbral adecuado en el algoritmo que

realiza el cálculo de segmentos sonoros y no

sonoros permite al sistema ejecutar una mejor

discriminación sobre los frames que representan voz

y sobre los que representan ruido, obteniéndose una

reconstrucción de la señal de voz más fidedigna.

Matlab como herramienta para el procesamiento de

señales es indispensable, a través de esta es posible

realizar un adecuado análisis de la voz,

determinando a partir de pequeños segmentos de la

misma, características o patrones importantes con

respecto a su naturaleza, patrones que permiten

determinar de manera adecuada, en conjunto con

otras técnicas, la señal de excitación de nuestro

sistema sintetizador. Gracias a la versatilidad en el

manejo de vectores de MATLAB, fue posible

realizar cada subsistema del sintetizador sin mayor

dificultad; la parte de preénfasis de la señal, el

establecimiento del algoritmo VAD, el cálculo del

periodo fundamental a través de la autocorrelación,

el cálculo de los coeficientes lpc y el

establecimiento del filtro todo polo IIR.

Permitiendo de esta manera ahondar en la

comprensión de la forma en la que un tipo de señal

puede ser analizada y procesada.

REFERENCIAS

[1]http://hera.ugr.es/tesisugr/16128503.pdf, pág. 50

[2]http://www.tesis.uchile.cl/tesis/uchile/2009/robles_i/s

ources/robles_i.pdf, pág. 23

0 2000 4000 6000 8000 10000 12000 14000 16000-0.1

-0.05

0

0.05

0.1

0.15

Voz Sintetizada

Muestras

Am

pli

tud

Page 8: Sintetizador de Voz Basado en Lpc_v1.2

Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 8

ANEXOS

A continuación se presenta la traducción de los algoritmos, realizados en Matlab, en lenguaje C:

A. Filtro LPC void filter_lpc(float error, float *coef, float *signal_x)

{

short i, k;

float x_n=0, y_n=0, signalpc=0;

float y[numcoef+1];

for(k=0; k<numcoef+1; k++) y[k] = 0.0;

for(k=0; k<N; k++) output_filter[k] = 0.0;

for(i=N; i>0; i--){

x_n = error*signal_x[i];

y_n = y[0]*coef[1];

for(k=numcoef-1; k>0; k--){

y_n = y_n + coef[k+1]*y[k];

y[k] = y[k-1];

}

signalpc = x_n - y_n;

y[0] = signalpc;

output_filter[i-1] = signalpc;

}

}

B. Función de sintetizado void dsp_main()

{

uint32_t k;

uint32_t j, i, m;

float max_abs;

//buffer que almacena el numero total de coeficientes por cada frame

float buffer_coef[numcoef+1];

//vector que almacena la señal sintetizada en punto flotante

float synthesizer[size_signal_total];

//vector que almacena el absoluto de toda la señal sintetizada

float synthesizer_abs[size_signal_total];

//vector que almacena la señal sintetizada en punto fijo

int16_t synthesizer_int[size_signal_total];

//creacion de ficheros para almacenar los resultados

char name[] = "fichero.xls";

char name2[] = "fichero2.xls";

char name3[] = "fichero3.xls";

for(k=0; k<size_signal_total; k++) synthesizer[k] = 0.0;

//el siguiente algoritmo es una traduccion de lo realizado en MATLAB

for(j=0; j<size_pitch; j++){

if(Npitch_total[j] != 0){

printf("frame sonoro\n");

//se genera la señal de excitacion

pulse_train(N, Npitch_total[j]);

//se almacenan los coeficientes en el buffer

Page 9: Sintetizador de Voz Basado en Lpc_v1.2

Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 9

for(k = j*(numcoef+1), i=0; k<=(numcoef+1)*j+numcoef; k++, i++)

buffer_coef[i] = coef_total[k];

// se aplica el filtro que representa el tracto vocal

filter_lpc(sqrt(error_total[j]), buffer_coef, dirac_train);

for(k = j*Nsub, i=0; k<=(j+1)*N-j*Nsub; k++, i++)

synthesizer[k] = output_filter[i];

}

else{

printf("frame NO sonoro\n");

//ruido aleatorio para excitar los frames no sonoros

for(i=0; i<N; i++)

noise[i] = (float)rand()/(float)RAND_MAX-0.5;

//se almacenan los coeficientes en el buffer

for(k = j*(numcoef+1), i=0; k<=(numcoef+1)*j+numcoef; k++, i++)

buffer_coef[i] = coef_total[k];

// se aplica el filtro que representa el tracto vocal

filter_lpc(sqrt(error_total[j]), buffer_coef, noise);

for(k = j*Nsub, i=0; k<(j+1)*N-j*Nsub; k++, i++)

synthesizer[k] = output_filter[i];

}

}

//se calcula el valor absoluto de la señal

for(k=0; k<size_signal_total; k++)

synthesizer_abs[k] = fabs(synthesizer[k]);

//se calcula el maximo absoluto de la señal

max_abs = max_pos(synthesizer_abs, sizeof(synthesizer_abs)/sizeof(float));

if(max_abs>=1)

m = floor(16 - 1 - log2(max_abs));

else

m = 15;

//se pasa el vector que contiene la señal sintetiza a punto fijo

for(k=0; k<size_signal_total; k++)

synthesizer_int[k] = (short)round(synthesizer[k]*pow(2, m));

//se escribe en ficheros la informacion generada

write_file_float(synthesizer, sizeof(synthesizer)/sizeof(float), name);

write_file_int(synthesizer_int, sizeof(synthesizer_int)/sizeof(int16_t), name2);

write_file_float(synthesizer_abs, sizeof(synthesizer_abs)/sizeof(float), name3);

}

Obteniéndose el siguiente resultado, tanto en punto flotante como en punto fijo:

-0,1

-0,05

0

0,05

0,1

0,15

0 2000 4000 6000 8000 10000 12000 14000 16000 18000

Sintetizador de Voz, punto flotante

Page 10: Sintetizador de Voz Basado en Lpc_v1.2

Universidad del Quindío, López Orozco. Procesamiento Digital de Señales. 10

-4000

-3000

-2000

-1000

0

1000

2000

3000

4000

5000

0 2000 4000 6000 8000 10000 12000 14000 16000 18000

Sintetizador de Voz, punto fijo