Назад в блог

~ 15 минут

Создание Telegram-бота для распознавания речи с использованием OpenAI Whisper

51

10/6/2024

Создаем Telegram-бот, который распознает голосовые сообщения с помощью OpenAI Whisper. Полный гайд: настройка бота, конвертация аудио и интеграция с Whisper

Вадим Пашаев

Вадим Пашаев

Инженер, веб-разработчик, путешественник

Регистрация товарных знаков
Craftum - создайте сайт за 15 минут
Домены, хостинг от reg.ru

В этой статье я расскажу о том, как создать Telegram-бота, который сможет распознавать голосовые сообщения и преобразовывать их в текст. Мы будем использовать модельку OpenAI Whisper для распознавания речи, а также инструменты Node.js и ffmpeg для работы с аудиофайлами.

Зачем нужен такой бот?

Telegram — это популярная платформа для общения, где пользователи часто отправляют друг другу голосовые сообщения. Однако не всегда удобно прослушивать эти сообщения, особенно в шумной среде или на работе. В таких ситуациях бот, который способен автоматически преобразовать голос в текст, может быть очень полезен.

Основные шаги создания бота:

  • Настройка Telegram-бота
  • Конвертация аудиофайлов
  • Использование OpenAI Whisper для расшифровки речи
  • Отправка результата пользователю

Шаг 1. Создание Telegram-бота

Для начала нам понадобится Telegram-бот. Если у вас его еще нет, создайте нового бота через BotFather в Telegram. После создания вы получите токен, который потребуется для работы с API Telegram.

Далее, создайте проект на Node.js и установите библиотеку для работы с Telegram:

npm install node-telegram-bot-api

В коде инициализируем бота, используя токен, который вы получили от BotFather:

const TelegramBot = require('node-telegram-bot-api')
const bot = new TelegramBot(process.env.TELEGRAM_BOT_TOKEN, { polling: true })

Теперь ваш бот готов принимать команды. Например, можно добавить приветственное сообщение при вызове команды /start:

bot.onText(/\/start/, (msg) => {
  const chatId = msg.chat.id
  bot.sendMessage(chatId, `Привет, ${msg.from.first_name}! Отправь мне голосовое сообщение, и я расшифрую его.`)
})

Шаг 2. Конвертация аудиофайлов

Telegram сохраняет голосовые сообщения в формате .oga, который не поддерживается многими системами распознавания. Поэтому нам нужно преобразовать этот файл в формат .wav. Для этого мы будем использовать библиотеку ffmpeg:

npm install fluent-ffmpeg

Затем добавляем функцию конвертации файла:

const ffmpeg = require('fluent-ffmpeg');
const path = require('path');
const fs = require('fs');

function convertOgaToWav(inputPath, outputPath) {
  return new Promise((resolve, reject) => {
    ffmpeg(inputPath)
      .toFormat('wav')
      .on('end', () => resolve(outputPath))
      .on('error', reject)
      .save(outputPath);
  });
}

Теперь бот сможет загружать голосовые сообщения, сохранять их на диск и конвертировать в нужный формат.

Шаг 3. Распознавание речи с помощью OpenAI Whisper

Для распознавания речи мы используем OpenAI Whisper — мощную модель, способную преобразовывать аудиофайлы в текст. Сначала установим библиотеку OpenAI:

npm install openai

Инициализируем API OpenAI, используя ваш API-ключ:

const OpenAI = require('openai')
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY })

Затем создаем функцию для отправки аудиофайла в OpenAI Whisper:

async function transcribeAudio(filePath) {
  const audioFile = fs.createReadStream(filePath);
  const transcription = await openai.audio.transcriptions.create({
    file: audioFile,
    model: 'whisper-1'
  });
  return transcription.text;
}

Теперь после конвертации аудиофайла в .wav мы можем отправить его на расшифровку.

Шаг 4. Обработка голосовых сообщений

Теперь свяжем все компоненты вместе. Когда пользователь отправляет голосовое сообщение, бот скачивает его, конвертирует в формат .wav, отправляет в OpenAI для расшифровки и затем отправляет результат обратно пользователю:

bot.on('voice', async (msg) => {
  const chatId = msg.chat.id
  const fileId = msg.voice.file_id
  const fileUrl = await bot.getFileLink(fileId)

  const inputPath = path.resolve(__dirname, 'input.oga')
  const outputPath = path.resolve(__dirname, 'output.wav')

  const response = await axios({ url: fileUrl, responseType: 'stream' })
  const writer = fs.createWriteStream(inputPath)
  response.data.pipe(writer)

  writer.on('finish', async () => {
    try {
      await convertOgaToWav(inputPath, outputPath)
      const transcript = await transcribeAudio(outputPath)
      await bot.sendMessage(chatId, `Расшифровка: ${transcript}`)
      fs.unlinkSync(inputPath)
      fs.unlinkSync(outputPath)
    } catch (error) {
      await bot.sendMessage(chatId, 'Ошибка при обработке голосового сообщения.')
    }
  })
})

Заключение

Теперь у вас есть Telegram-бот, который может распознавать голосовые сообщения с помощью OpenAI Whisper! Этот бот — отличное решение для тех, кто хочет быстро преобразовывать голос в текст, будь то в личных или рабочих целях.

Дополнительные шаги

  • Масштабируемость: Вы можете расширить функционал бота, добавив поддержку разных языков и улучшив интерфейс взаимодействия с пользователями.
  • Оптимизация: Добавьте возможность параллельной обработки нескольких запросов, чтобы повысить производительность бота при большом числе пользователей.

Исходный код

Github: https://github.com/reactcoder-it/telegram-voice-transcriber

Видео на Youtube: https://youtu.be/4OIz51rpl0A?si=bMJDQrTaYK1sdiZr

Надеюсь, эта статья была полезной, и вы смогли создать своего первого бота для распознавания речи!

Для справки

Подписаться на рассылку

Получите лучшие новости по веб-разработке и AI

Подписаться на рассылку

Получите лучшие новости по веб-разработке и AI

Оценка проекта

Хотите быструю оценку Вашего проекта?

Василий Иванов
Максим Насенников
Виктория Мальцева
Vadim Pashaev

Заполните форму справа и наша команда экспертов поможет найти для Вас оптимальное решение вашей идеи или задачи

Есть интересная идея?

И вы очень хотите ее реализовать, пишите нам и получите подробное коммерческое предложение и быструю реализацию