|
|
|
import speech_recognition as sr |
|
from pydub import AudioSegment |
|
import os |
|
import gradio as gr |
|
import types |
|
import typing |
|
import logging |
|
|
|
|
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s') |
|
|
|
|
|
def convert_wav_to_text(audio_file_path: str) -> str: |
|
""" |
|
Эта функция получает на вход файл, который который представляет собой аудио. Если формат .wav, то такой файл сразу распознаётся. |
|
А если формат отличается от .wav, то такой аудиофайл сначала конвертируется во временное представление .wav, распознаётся и удаляется. |
|
|
|
Args: |
|
audio_file_path (Str): Путь к файлу-голосовому сообщению. |
|
Returns: |
|
text_from_audio (Str): Текст, полученный из голосового сообщения. |
|
error (Str): Сообщение об ошибке. |
|
""" |
|
file_extension = audio_file_path.split('.')[-1].lower() |
|
try: |
|
if file_extension != 'wav': |
|
audio = AudioSegment.from_file(audio_file_path, format=file_extension) |
|
audio = audio.set_channels(1).set_frame_rate(16000) |
|
temp_wav_path = 'temp.wav' |
|
audio.export(temp_wav_path, format='wav') |
|
else: |
|
temp_wav_path = audio_file_path |
|
recognizer = sr.Recognizer() |
|
with sr.AudioFile(temp_wav_path) as source: |
|
audio_data = recognizer.record(source) |
|
try: |
|
text_from_audio = recognizer.recognize_google(audio_data, language='ru-RU') |
|
return text_from_audio |
|
except sr.UnknownValueError: |
|
error_str = 'Не удалось распознать аудио! Возможно, в данных слишком много шума.' |
|
return error_str |
|
except sr.RequestError as e: |
|
error_str = f'Возникла неожиданная ошибка: {e}' |
|
return error_str |
|
finally: |
|
if file_extension != 'wav' and os.path.exists('temp.wav'): |
|
os.remove('temp.wav') |
|
|
|
|
|
def recognize_speech_from_microphone(audio: typing.Union[str, types.NoneType, AudioSegment]) -> str: |
|
""" |
|
Функция, которая записывает аудио. |
|
|
|
Args: |
|
audio (Str): Путь к аудиофайлу (загруженный файл). |
|
audio (types.NoneType): Появляется при смене типа входных данных. |
|
audio (AudioSegment): При записи звука микрофоном. |
|
Return: |
|
text_from_audio (Str): Результат выполнения функции convert_wav_to_text(). |
|
warning_str (Str): Предупреждение при смене типа входных данных. |
|
""" |
|
if isinstance(audio, str): |
|
audio_file_path = audio |
|
elif isinstance(audio, types.NoneType): |
|
warning_str = 'Вы изменили источник входных данных. Запишите звук или загрузите файл.' |
|
return warning_str |
|
else: |
|
audio_file_path = 'temp_input.wav' |
|
audio.export(audio_file_path, format='wav') |
|
return convert_wav_to_text(audio_file_path) |
|
|
|
|
|
gui = gr.Interface( |
|
fn=recognize_speech_from_microphone, |
|
inputs=gr.Audio(type='filepath'), |
|
outputs='text', |
|
live=True |
|
) |
|
|
|
|
|
if __name__ == '__main__': |
|
gui.launch(share=True) |
|
|