Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

СРОЧНО! КАК ИЗ OGG СДЕЛАТЬ WAV ФОРМАТ АУДИО В PYTHON.

Анонимная почта Флореста Ученик (79), на голосовании 2 недели назад
Короче, есть код, который из аудиосообщения в telegram делает текст. Иными словами, speech to text. Но модуль SpeechRecognition не поддерживает формат ogg, который благополучно выдает Telegram API. Как без FFMPEG и другой ненужной хрени сделать из ogg в wav/flac формат? Помогите пожалуйста.
А пока есть такой код.
 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)
audio__ = open(path / f'audio_{chislo}.ogg', 'wb')
audio__.write(bot.download_file(bot.get_file(message.voice.file_id).file_path))
audio__.close()
subprocess.run(['ffmpeg', f'-i audio_{chislo}.ogg', f'audio_{chislo}.wav'])
try:
r = sr.Recognizer()
file = open(path / f'audio_{chislo}.wav', 'rb')
with sr.AudioFile(file) as source:
audio = r.record(source)
text = r.recognize_google(audio, 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')))
os.remove(path / f'audio_{chislo}.ogg')
os.remove(path / f'audio_{chislo}.wav')
Голосование за лучший ответ
♡$ⴎG@r₱u₷sყ♡ Искусственный Интеллект (186042) 1 месяц назад
Никак. Нужна конвертация. А она требует сторонних модулей как ffmpeg
Анонимная почта ФлорестаУченик (79) 1 месяц назад
Короче, самый гениальный ответ. А теперь, лети в скрытие.
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)
Жарь ПтицевГуру (3423) 1 месяц назад
pydub это интерфейс для ffmpeg/libav
Похожие вопросы