Я разобрался. Может кому-нибудь будет полезно.
Голосовые сообщения, отправленные в телеграмм - это Опус 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