KateProxa commited on
Commit
0b41292
1 Parent(s): 4226382

Initial commit

Browse files
Files changed (6) hide show
  1. .gitignore +6 -0
  2. README.md +49 -12
  3. TGBot.py +266 -0
  4. TGBot_config.yaml +12 -0
  5. model_whisper.py +12 -0
  6. requirements.txt +7 -0
.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ venv
2
+ .idea
3
+ *.iml
4
+ **/*.iml
5
+ **/.env
6
+ logfile.log
README.md CHANGED
@@ -1,12 +1,49 @@
1
- ---
2
- title: TG Bot
3
- emoji: 👁
4
- colorFrom: purple
5
- colorTo: indigo
6
- sdk: streamlit
7
- sdk_version: 1.34.0
8
- app_file: app.py
9
- pinned: false
10
- ---
11
-
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # URFU_project_bot
2
+
3
+ Программная инженерия II
4
+ Практическое задание к модулю 3
5
+
6
+ Цель задания:
7
+ - проанализировать код в репозитории GitHub проекта и оценить, как можно улучшить его качество
8
+ - записать идеи по улучшению качества кода
9
+ - выбрать 2-3 предложения по улучшению качества кода
10
+
11
+
12
+ Чат бот - приложение для перевода голосовых сообщений в текст
13
+
14
+ С помощью смартфона можно записать короткое аудио или надиктовать голосом объемный текст.
15
+ Однако получателю не всегда удобно прослушать голосовое сообщение с телефона - тогда на помощь приходит чат бот
16
+ для перевода аудио в текст.
17
+
18
+
19
+ Функционал:
20
+ - доступ к чат боту через телеграмм
21
+ - запись головых сообщений
22
+ - перевод голосовых сообщений в текст
23
+ - поддержка нескольких языков
24
+ - обработка ошибок
25
+ - выбор языка голосового сообщения
26
+
27
+ Используемые модули: (см. requirements.txt)
28
+
29
+ Состав команды:
30
+ - Коньшина Ольга
31
+ - Егоренкова Татьяна
32
+ - Ильиных Виктория
33
+ - Шабанов Дмитрий
34
+ - Воробьев Василий
35
+ - Прохорова Екатерина
36
+
37
+ Идеи по улучшению качества кода:
38
+ - разработать процедуру для чтения голосовых данных из Telegram с использованием функционала API
39
+ - встроить предобученную модель распознования голоса и литерации его в текст
40
+ - научить приложение возвращать текстовое сообщение пользователю
41
+ - разместить приложение в облаке (например HF)
42
+ - форматирование кода в соответствии с pep8
43
+ - осмысленные имена
44
+ - обработка ошибок
45
+ - код должен содержать тесты, и они все должны завершаться успешно
46
+ - функции и методы должны быть небольшими и решать только одну задачу, а также помещаться на один экран
47
+ - Код-ревью (проверка кода командой перед объединением в общий проект)
48
+ - создать Чат-бот в Telegram для запуска приложения
49
+
TGBot.py ADDED
@@ -0,0 +1,266 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import telebot
2
+ import whisper
3
+ import os
4
+ import requests
5
+ import subprocess
6
+ import pytz
7
+ import yaml
8
+ import logging
9
+
10
+
11
+ logging.basicConfig(
12
+ level=logging.INFO,
13
+ filename="logfile.log",
14
+ filemode="w",
15
+ encoding='utf-8',
16
+ format="%(name)s %(asctime)s %(levelname)s %(message)s",
17
+ )
18
+
19
+
20
+ try:
21
+ with open(r"TGBot_config.yaml", "r") as f:
22
+ config = yaml.safe_load(f)
23
+ logging.info("Конфигурационный файл успешно загружен.")
24
+ except Exception as e:
25
+ logging.critical(
26
+ f"Конфигурационный файл не был загружен. Ошибка {e}", exc_info=True
27
+ )
28
+
29
+
30
+ try:
31
+ token = config["token"]
32
+ bot = telebot.TeleBot(token)
33
+ p_timezone = pytz.timezone(config["timezone"])
34
+ timezone_common_name = config["timezone_common_name"]
35
+ logging.info("Конфигурации успешно загружены")
36
+ except Exception as e:
37
+ logging.critical(f"Конфигерации не загружены. Ошибка {e}", exc_info=True)
38
+
39
+
40
+ @bot.message_handler(commands=["start"])
41
+ def start_message(message):
42
+ try:
43
+ bot.send_message(
44
+ message.chat.id,
45
+ "Привет ✌️ , отправь аудио/видео сообщение!\n"
46
+ "Hi ✌️, send me a voice/video message!",
47
+ )
48
+ logging.info("Отправлено приветственное сообщение.")
49
+ except Exception as e:
50
+ logging.error(
51
+ f"Приветственное сообщение не отправлено. Ошибка: {e}", exc_info=True
52
+ )
53
+
54
+
55
+ @bot.message_handler(commands=["help"])
56
+ def help_message(message):
57
+
58
+ try:
59
+ bot.send_message(
60
+ message.chat.id,
61
+ "Этот бот переводит голосовые/видео сообщения в текст\n"
62
+ "Бот создан в учебных целях\n\n"
63
+ "This bot translates voice/video messages into text\n"
64
+ "The bot was created for educational purposes",
65
+ )
66
+ logging.info("Отправлено информационное сообщение")
67
+ except Exception as e:
68
+ logging.error(
69
+ f"Произошла ошибка, инфоонмационное сообщение не отправлено. {e}",
70
+ exc_info=True,
71
+ )
72
+
73
+
74
+ @bot.message_handler(commands=["model"])
75
+ @bot.message_handler(commands=["lang"])
76
+ def help_message(message):
77
+ try:
78
+ bot.send_message(
79
+ message.chat.id,
80
+ "Бот понимает сообщения на многих языках,\nно пока не на всех\nВыберете язык\nBot can understand many languages\nChoose languages.",
81
+ )
82
+
83
+ keyboard = telebot.types.InlineKeyboardMarkup()
84
+ keyboard.row(
85
+ telebot.types.InlineKeyboardButton(
86
+ "Русский / Russian", callback_data="lang-rus"
87
+ )
88
+ )
89
+ keyboard.row(
90
+ telebot.types.InlineKeyboardButton(
91
+ "Английский / English", callback_data="lang-eng"
92
+ )
93
+ )
94
+ keyboard.row(
95
+ telebot.types.InlineKeyboardButton(
96
+ "Хинди / Hindi", callback_data="lang-hin"
97
+ )
98
+ )
99
+ bot.send_message(
100
+ message.chat.id,
101
+ "Выберите язык / Choose the language:",
102
+ reply_markup=keyboard,
103
+ )
104
+ logging.info("Отправлено информационное сообщение о выборе языка")
105
+ except Exception as e:
106
+ logging.error(
107
+ f"Сообщение о выборе языка не было отправлено. Ошибка {e}", exc_info=True
108
+ )
109
+
110
+
111
+ @bot.callback_query_handler(func=lambda call: True)
112
+ def callback_inline(call):
113
+ # Если сообщение из чата с ботом
114
+ try:
115
+ if call.message:
116
+ if call.data == "lang-rus":
117
+ bot.edit_message_text(
118
+ chat_id=call.message.chat.id,
119
+ message_id=call.message.message_id,
120
+ text="Вы выбрали Русский язык сообщения",
121
+ )
122
+ logging.info("Выбран язык: русский")
123
+ elif call.data == "lang-eng":
124
+ bot.edit_message_text(
125
+ chat_id=call.message.chat.id,
126
+ message_id=call.message.message_id,
127
+ text="You've chose English message language",
128
+ )
129
+ logging.info("Выбран язык: английский")
130
+ elif call.data == "lang-hin":
131
+ bot.edit_message_text(
132
+ chat_id=call.message.chat.id,
133
+ message_id=call.message.message_id,
134
+ text="आपने अंग्रेजी संदेश भाषा चुनी है",
135
+ )
136
+ logging.info("Выбран язык: хинди")
137
+ else:
138
+ bot.edit_message_text(
139
+ chat_id=call.message.chat.id,
140
+ message_id=call.message.message_id,
141
+ text="Я не знаю такой язык",
142
+ )
143
+ logging.warning("Неизвестный язык")
144
+ except Exception as e:
145
+ logging.error(f"Произошла неизвестная ошибка: {e}", exc_info=True)
146
+
147
+
148
+ @bot.message_handler(
149
+ content_types=[
150
+ "audio",
151
+ "photo",
152
+ "document",
153
+ "text",
154
+ "location",
155
+ "contact",
156
+ "sticker",
157
+ ]
158
+ )
159
+ def exceptions(message):
160
+ try:
161
+ bot.send_message(
162
+ message.from_user.id,
163
+ "Ничего не понятно, но очень интересно!😳\nПопробуйте команду /help😳\n\n"
164
+ "Nothing is clear, but it is very interesting!😳 \nTry the /help command😳",
165
+ )
166
+ logging.warning("Не удалось что-либо распознать")
167
+ except Exception as e:
168
+ logging.error("Неизвестная ошибка: {e}", exc_info=True)
169
+
170
+
171
+ @bot.message_handler(content_types=["voice", "video", "video_note"])
172
+ def get_media_messages(message):
173
+ bot.send_message(message.from_user.id, "Started recognition...")
174
+ try:
175
+ bot.send_message(message.from_user.id, "Continue recognition...")
176
+ logging.info("Отправили сообщение о процессе распознавания")
177
+
178
+ if message.content_type == "voice":
179
+ file_id = message.voice.file_id
180
+ logging.info("Распознаём аудио сообщение")
181
+ elif message.content_type == "video_note":
182
+ file_id = message.video_note.file_id
183
+ logging.info("Распознаем видеео сообщение")
184
+ elif message.content_type == "video":
185
+ file_id = message.video.file_id
186
+ logging.info("Распоознаем видео сообщние")
187
+ else:
188
+ bot.send_message(message.from_user.id, "Такой формат я не знаю😳")
189
+ logging.error(
190
+ f"Не удалось распознать сообщение, неверный формат {message.content_type}"
191
+ )
192
+ return
193
+
194
+ try:
195
+ file_info = bot.get_file(file_id)
196
+ path = file_info.file_path
197
+ fname = os.path.basename(path)
198
+ doc = requests.get(
199
+ "https://api.telegram.org/file/bot{0}/{1}".format(
200
+ token, file_info.file_path
201
+ )
202
+ )
203
+ with open(fname, "wb") as f:
204
+ f.write(doc.content)
205
+ logging.info("Файл для распознавания успешно открыт")
206
+ except Exception as e:
207
+ logging.critical(f"Не удалось открыть файл. Ошибка {e}", exc_info=True)
208
+
209
+ try:
210
+ subprocess.run(["ffmpeg", "-i", fname, fname[:-4] + ".wav"], check=True)
211
+ logging.info("Конвертация произошла успешно")
212
+ except subprocess.CalledProcessError as e:
213
+ bot.send_message(
214
+ message.from_user.id, "c конвертацией файла что-то пошло не так... 😣"
215
+ )
216
+ os.remove(fname)
217
+ logging.critical(f"Ошибка в конвертации {e}", exc_info=True)
218
+ return
219
+
220
+ try:
221
+ model = whisper.load_model("small")
222
+ bot.send_message(message.from_user.id, "Model loaded")
223
+ logging.info("Модель успешно загружена")
224
+ except Exception as e:
225
+ logging.critical(f"Модель не загружена. Ошибка: {e}", exc_info=True)
226
+
227
+ try:
228
+ result = model.transcribe(
229
+ fname[:-4] + ".wav", fp16=False
230
+ ) # распознаем аудио и переводим в текст
231
+ logging.info("Распознали аудио и перевели его в текст")
232
+ except Exception as e:
233
+ bot.send_message(
234
+ message.from_user.id, "Что-то пошло не так c распознованием😣"
235
+ )
236
+ os.remove(fname)
237
+ os.remove(fname[:-4] + ".wav")
238
+ logging.critical(
239
+ f"Не удалось перевести аудио в текст. Ошибка: {e}", exc_info=True
240
+ )
241
+ return
242
+
243
+ bot.send_message(message.from_user.id, "Finish recognition...")
244
+
245
+ if result["text"] == "":
246
+ bot.send_message(message.from_user.id, "Ничего не удалось распознать 😣")
247
+ logging.warning("Не удалось распознаттть текст")
248
+ else:
249
+ bot.send_message(message.from_user.id, result["text"])
250
+ logging.info("Сообщение распознано и переведенов текст")
251
+
252
+ except Exception as e:
253
+ bot.send_message(
254
+ message.from_user.id,
255
+ "Что-то пошло не так, но наши смелые инженеры уже трудятся над решением... 😣 \n"
256
+ "Something went wrong, but our brave engineers are already working on a solution... 😣",
257
+ )
258
+ logging.critical(f"Скрипт не отработал. Ошибка {e}", exc_info=True)
259
+
260
+ finally:
261
+ os.remove(fname)
262
+ os.remove(fname[:-4] + ".wav")
263
+ logging.info("Закончили выполнение скрипта")
264
+
265
+
266
+ bot.polling(none_stop=True, interval=0)
TGBot_config.yaml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ token:
2
+ '6948303365:AAGKlyvBlEFYISnzsZQfbTApZOjKHXsVT_4' # заменить на токен своего бота
3
+
4
+ user_id:
5
+
6
+ 'VoiceKatebot:' # заменить на название вашего бота
7
+
8
+ timezone:
9
+ 'Europe/Moscow'
10
+
11
+ timezone_common_name:
12
+ 'Moscow'
model_whisper.py ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+ # coding: utf-8
3
+
4
+ # In[ ]:
5
+
6
+
7
+ import whisper
8
+
9
+ model = whisper.load_model('small')
10
+ result = model.transcribe('audio_6.ogg', fp16=False) # добавляем аудио для обработки
11
+ print(result['text'])
12
+
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ openai-whisper
2
+ ffmpeg
3
+ telebot~=0.0.5
4
+ requests~=2.31.0
5
+ pytz~=2024.1
6
+ whisper~=1.1.10
7
+ PyYAML~=6.0.1