06-09-2020, 09:24 PM
Estoy realizando un programa conversacional, que ya tengo bastante avanzado, de modo que actualmente acepta una entrada por teclado, en lenguaje natural, y el "robot" contesta tanto en pantalla como por los altavoces, es decir, "lee" la entrada del usuario y le contesta "hablando".
El siguiente paso es ir a un sistema por el que el usuario pueda dar su entrada de viva voz, no por teclado, y el "robot" le conteste; para ello, debo hacer que por micrófono se acepte una entrada, y se convierta a texto. Esto lo tengo ya resuelto mediante esta pequeña rutina
import pyaudio
import wave
import speech_recognition as sr
FORMAT=pyaudio.paInt16
CHANNELS=2
RATE=44100
CHUNK=1024
duracion=5
archivo="grabacion.wav"
audio=pyaudio.PyAudio()
stream=audio.open(format=FORMAT,channels=CHANNELS,rate=RATE,
input=True,frames_per_buffer=CHUNK)
print("grabando...")
frames=[]
for i in range(0,int(RATE/CHUNK*duracion)):
data=stream.read(CHUNK)
frames.append(data)
print("grabación terminada")
stream.stop_stream()
stream.close()
audio.terminate()
waveFile=wave.open(archivo,"wb")
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()
re = sr.Recognizer()
with sr.Microphone() as source:
audio="grabacion.wav"
with sr.AudioFile(audio) as source:
info_audio=re.record(source)
texto=re.recognize_google(info_audio,language='es')
print(texto)
print("fin")
Funciona perfectamente, pero se basa en grabar X segundos y transcribirlos (en este caso 5 segundos, aunque puedo poner los que quiera). Transcurrido este tiempo, el sistema hace la transcripción a texto, y como digo, funciona. Ahora bien, ¿no sería posible hacer que la entrada no tuviera un tiempo marcado, sino que esperase hasta que hubiera un silencio, y entonces se generara el fichero wav que se transcribe?
Agradecería cualquier ayuda.
El siguiente paso es ir a un sistema por el que el usuario pueda dar su entrada de viva voz, no por teclado, y el "robot" le conteste; para ello, debo hacer que por micrófono se acepte una entrada, y se convierta a texto. Esto lo tengo ya resuelto mediante esta pequeña rutina
import pyaudio
import wave
import speech_recognition as sr
FORMAT=pyaudio.paInt16
CHANNELS=2
RATE=44100
CHUNK=1024
duracion=5
archivo="grabacion.wav"
audio=pyaudio.PyAudio()
stream=audio.open(format=FORMAT,channels=CHANNELS,rate=RATE,
input=True,frames_per_buffer=CHUNK)
print("grabando...")
frames=[]
for i in range(0,int(RATE/CHUNK*duracion)):
data=stream.read(CHUNK)
frames.append(data)
print("grabación terminada")
stream.stop_stream()
stream.close()
audio.terminate()
waveFile=wave.open(archivo,"wb")
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()
re = sr.Recognizer()
with sr.Microphone() as source:
audio="grabacion.wav"
with sr.AudioFile(audio) as source:
info_audio=re.record(source)
texto=re.recognize_google(info_audio,language='es')
print(texto)
print("fin")
Funciona perfectamente, pero se basa en grabar X segundos y transcribirlos (en este caso 5 segundos, aunque puedo poner los que quiera). Transcurrido este tiempo, el sistema hace la transcripción a texto, y como digo, funciona. Ahora bien, ¿no sería posible hacer que la entrada no tuviera un tiempo marcado, sino que esperase hasta que hubiera un silencio, y entonces se generara el fichero wav que se transcribe?
Agradecería cualquier ayuda.