File size: 2,097 Bytes
6f3bdd5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from transformers import pipeline # Para el procesamiento del lenguaje
import numpy as np # Porque la transcripción de audio a texto se hace mediante arrays
import gradio as gr # Para la interfaz

# Si disponemos de una GPU con el parámetro device=0 le estamos diciendo que la use
pipe = pipeline(
    "automatic-speech-recognition", model="openai/whisper-medium", device=-1
)

def transcribe(stream, nuevo_fragmento): # Recibe 2 parámetros "stream" un historial de todo lo anteriormente dicho y "nuevo_framento" las últimas palabras registradas
    sr, y = nuevo_fragmento # Ahora se obtiene el sample rate y el array con el audio de nuevo_fragmento
    # Pasamos el array de muestras a tipo NumPy de 32 bits porque el método pipeline espera que le pasemos un array
    y = y.astype(np.float32)
    y /= np.max(np.abs(y)) # Normalizamos el audio para evitar problemas de distorsión o saturación. Para ello encontramos el valor máximo del array "y" y dividimos todos los valores de "y" por ese valor para que estén en un rago entre -1 y 1 

    if stream is not None: # Si stream no es vacio se concatenamos lo que ya contiene stream con elnuevo audio
        stream = np.concatenate([stream, y])
    else: # Si stream si que esta vació y estamos ante el primer caso de uso igualamos stream directamente a lo que contenga y que es el nuevo fragmento
        stream = y

    return stream, pipe({"sampling_rate": sr, "raw": stream})["text"] # Devolvemos el stream actualizado con el texto trancrito

demo = gr.Interface(
    transcribe,
    # ["state", gr.Audio.stream(sources=["microphone"], streaming=True)], # como parámetros de entrada ahora debemos manejar el estado para mantener el stream actualizado y la entrada de audio desde el microphone con stream=True
    ["state", gr.Audio(sources=["microphone"], streaming=True)], # como parámetros de entrada ahora debemos manejar el estado para mantener el stream actualizado y la entrada de audio desde el microphone con stream=True
    ["state", "text"],
    live=True, # Permitimos la actualización en tiempo real
)

demo.launch()