Ответы пользователя по тегу Go
  • Есть ли либа, которая сможет матчить слова, которые похожи друг на друга?

    @nakem Автор вопроса
    я нашел это https://github.com/schollz/closestmatch
    Немного потестил, вроде все как я хотел. Правда я не понял, что такое bag size, но вроде с дефолтным 2 из примера все работает
    Ответ написан
    Комментировать
  • Есть ли курсы по Go наподобие JavaRush?

    @nakem
    gotour https://go.dev/tour/welcome/1
    Это обязательно для прохождения
    Ответ написан
    Комментировать
  • Golang в чём смысл?

    @nakem
    Я тоже раньше мыслил такими категориями. Мне тоже казалось, что самые крутые технологии - это те, которые на бенчмарках всех выносят и на хабрах хвалят. "Топ 5 языков для изучения в 2019\20\21\22\23..."
    Нет)) Это не так. Можно принять это за догму:)))
    Ответ написан
    Комментировать
  • Как обработать голосовое сообщение во фреймворке для телеграм ботов telebot?

    @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
    Ответ написан
    Комментировать
  • Как правильно передать множество параметров в функцию в Golang?

    @nakem
    В некоторых кейсах функциональные опции могут оказаться более подходящим решением.
    Дейв Чейни подробно писал об этом https://dave.cheney.net/2014/10/17/functional-opti...
    Ответ написан
    Комментировать
  • Как понять причину отмененного контекста?

    @nakem Автор вопроса
    Решил проблему! Все дело в автосгенерированном моке. В моке бекенда `h.backend.Denoise()` не было чтения из канала audioChunks. Поэтому происходил дедлок и соответствующая отмена контекста. А если добавить буфер в канал, то программа не застревала. Для меня был главный вопрос почему программа возвращала StatusOK если проблемы с чтением из канала, но я забыл, что я сам добавил возврат слайс байт из мока, поэтому программа и отрабатывала. Спасибо всем, кто хотел помочь!
    Ответ написан
    Комментировать