Задать вопрос
@nakem

Как обработать голосовое сообщение во фреймворке для телеграм ботов telebot?

Я пишу телеграмм бота на Go, используя https://github.com/tucnak/telebot.
Я уже облазил всю документацию, но там просто нет об этом информации. Я полазил по исходникам безрезультатно. Я предполагал, что просто в структуре Voice должен быть ридер, откуда я считаю байтики аудио. Я что-то упускаю и не делаю. Напишите, пожалуйста, просто функцию, которая будет возвращать тоже самое аудио в ответ на голосовое, спасибо.
Или подскажите как я могу найти проект на гитхабе, где работа с голосовыми сообщениями есть через этот фреймворк?
  • Вопрос задан
  • 128 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@nakem Автор вопроса
Я разобрался. Может кому-нибудь будет полезно.
Голосовые сообщения, отправленные в телеграмм - это Опус ogg.
То есть, хендлить все голосовые сообщения нужно так
bot.Handle(tb.OnVoice, voiceHandler)
любой хендлер в этом фреймворке должен иметь такой прототип `func fun(msg *tb.Message)`

msg - это структура, которая хранит в себе всю инфу о сообщении. Соответственно, в хендлере голосовых сообщениях будет доступен `msg.Voice`
Это уже структура голосового сообщения с контентом вида `audio/opus`
В структуру voice встроена структура file. У нее есть fileID. С таким айди файл нашего голосового сообщения хранится на серверах телеги. С помощью функции `bot.FileURLByID(msg.Voice.FileID)` мы можем получить URL, куда сделаем запрос и получим наши байтики аудио.
Вот код
func (r *RecognitionVoiceHandler) VoiceRecognize(msg *tb.Message) {
	ctx := context.TODO()
	isFmt, encoding := checkFmt(msg, r.TeleContent())
	if encoding == "ogg" {
		encoding = "opus"
	}
	if !isFmt {
		r.logger.Warnf(ctx, "Wrong format: %s", msg.Voice.MIME)
		r.bot.Send(msg.Sender, fmt.Sprintf(formatError, msg.Voice.MIME))
	}

	fileURL, err := r.bot.FileURLByID(msg.Voice.FileID)
	if err != nil {
		r.logger.Error(ctx, "Can't get URL from fileID")
		r.bot.Send(msg.Sender, telegramError)
	}

	text, err := r.recognize(ctx, fileURL, encoding)
	if err != nil {
		r.bot.Send(msg.Sender, telegramError)
	}
	if _, err = r.bot.Send(msg.Sender, text); err != nil {
		r.logger.Error(ctx, "Can't send telegram response")
	}
}

Если нужно обрабатывать аудио файлы типа mp3 и тд, то это структура Audio и контент endpoint tb.OnAudio.
Если нужно ваф и тд, то это структура Document и endpoint tb.OnDocument
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы