-
Notifications
You must be signed in to change notification settings - Fork 8
/
bot.py
111 lines (89 loc) · 3.41 KB
/
bot.py
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
"""
Telegram бот для конвертации голосового/аудио сообщения в текст и
создания аудио из текста.
"""
import logging
import os
from pathlib import Path
from aiogram import Bot, Dispatcher, executor, types
from aiogram.types.input_file import InputFile
from dotenv import load_dotenv
from stt import STT
from tts import TTS
load_dotenv()
TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN")
bot = Bot(token=TELEGRAM_TOKEN) # Объект бота
dp = Dispatcher(bot) # Диспетчер для бота
tts = TTS()
stt = STT()
logger = logging.getLogger(__name__)
logging.basicConfig(
level=logging.INFO,
filename="bot.log",
)
# Хэндлер на команду /start , /help
@dp.message_handler(commands=["start", "help"])
async def cmd_start(message: types.Message):
await message.reply(
"Привет! Это Бот для конвертации голосового/аудио сообщения в текст"
" и создания аудио из текста."
)
# Хэндлер на команду /test
@dp.message_handler(commands="test")
async def cmd_test(message: types.Message):
"""
Обработчик команды /test
"""
await message.answer("Test")
# Хэндлер на получение текста
@dp.message_handler(content_types=[types.ContentType.TEXT])
async def cmd_text(message: types.Message):
"""
Обработчик на получение текста
"""
await message.reply("Текст получен")
out_filename = tts.text_to_ogg(message.text)
# Отправка голосового сообщения
path = Path("", out_filename)
voice = InputFile(path)
await bot.send_voice(message.from_user.id, voice,
caption="Ответ от бота")
# Удаление временного файла
os.remove(out_filename)
# Хэндлер на получение голосового и аудио сообщения
@dp.message_handler(content_types=[
types.ContentType.VOICE,
types.ContentType.AUDIO,
types.ContentType.DOCUMENT
]
)
async def voice_message_handler(message: types.Message):
"""
Обработчик на получение голосового и аудио сообщения.
"""
if message.content_type == types.ContentType.VOICE:
file_id = message.voice.file_id
elif message.content_type == types.ContentType.AUDIO:
file_id = message.audio.file_id
elif message.content_type == types.ContentType.DOCUMENT:
file_id = message.document.file_id
else:
await message.reply("Формат документа не поддерживается")
return
file = await bot.get_file(file_id)
file_path = file.file_path
file_on_disk = Path("", f"{file_id}.tmp")
await bot.download_file(file_path, destination=file_on_disk)
await message.reply("Аудио получено")
text = stt.audio_to_text(file_on_disk)
if not text:
text = "Формат документа не поддерживается"
await message.answer(text)
os.remove(file_on_disk) # Удаление временного файла
if __name__ == "__main__":
# Запуск бота
print("Запуск бота")
try:
executor.start_polling(dp, skip_updates=True)
except (KeyboardInterrupt, SystemExit):
pass