Drew
Мастер
(1722)
1 месяц назад
Можешь модуль libsndfile подрубить и pydub
from pydub import AudioSegment
import speech_recognition as sr
import random
import os
from telebot import types
def speech_to_text(message: types.Message):
if not message.voice:
bot.reply_to(
message,
f'Поддерживаются только голосовые сообщения.',
reply_markup=types.InlineKeyboardMarkup().add(types.InlineKeyboardButton('Назад', callback_data='back'))
)
else:
if message.voice.duration > 600:
bot.reply_to(
message,
f'Голосовое сообщение длиться более 10 минут.',
reply_markup=types.InlineKeyboardMarkup().add(types.InlineKeyboardButton('Назад', callback_data='back'))
)
else:
msg = bot.reply_to(message, f'Начинаю транскрибацию...')
chislo = random.randint(1, 10000)
ogg_path = path / f'audio_{chislo}.ogg'
wav_path = path / f'audio_{chislo}.wav'
# Сохраняем OGG-файл
with open(ogg_path, 'wb') as audio_file:
audio_file.write(bot.download_file(bot.get_file(message.voice.file_id).file_path))
try:
# Конвертируем OGG в WAV
audio = AudioSegment.from_file(ogg_path, format="ogg")
audio.export(wav_path, format="wav")
# Распознаём речь
r = sr.Recognizer()
with sr.AudioFile(wav_path) as source:
audio_data = r.record(source)
text = r.recognize_google(audio_data, language='ru-RU')
bot.delete_message(msg.chat.id, msg.id)
bot.reply_to(
message,
f'В голосовом сообщении сказано следующее: `{text}`.',
parse_mode='Markdown',
reply_markup=types.InlineKeyboardMarkup().add(types.InlineKeyboardButton('Назад', callback_data='back'))
)
except Exception as e:
bot.delete_message(msg.chat.id, msg.id)
bot.reply_to(
message,
f'Произошла ошибка: `{e}`.',
parse_mode='Markdown',
reply_markup=types.InlineKeyboardMarkup().add(types.InlineKeyboardButton('Назад', callback_data='back'))
)
finally:
# Удаляем временные файлы
if os.path.exists(ogg_path):
os.remove(ogg_path)
if os.path.exists(wav_path):
os.remove(wav_path)
А пока есть такой код.