Голосовой AI-ассистент на Python (Streamlit, Whisper, ChatGPT, TTS)

Проект объединяет несколько компонентов:

  • Распознавание речи: отправка аудио на OpenAI Whisper API (модель whisper-1) для транскрипции русской речиkdnuggets.com.
  • Генерация ответа: отправка полученного текста в OpenAI ChatCompletion (модель gpt-3.5-turbo) для получения ответа в виде текстаgokhang1327.medium.com.
  • Синтез речи (TTS): два варианта генерации звука из текста: платный сервис ElevenLabs (реалистичные голоса, поддержка русского) и открытая модель Silero TTS (бесплатная, поддерживает русский)github.comgithub.com.
  • Интерфейс: веб-приложение на Streamlit с виджетом записи аудио (микрофон) и областью для отображения распознанного текста и ответа.

Ниже приведён подробный код приложения и инструкции по его запуску.

Установка и API-ключи

  1. Установите зависимости. Например, выполнив в терминале: bashКопироватьpip install streamlit openai elevenlabs torch soundfile silero (Также потребуется установить PyTorch – команда pip install torch – и, при использовании Silero, библиотеку soundfile.)
  2. Получите API-ключ OpenAI. Создайте аккаунт на platform.openai.com и в разделе API Keys сгенерируйте новый ключkdnuggets.com. Сохраните его.
  3. Получите API-ключ ElevenLabs. Зарегистрируйтесь на elevenlabs.io, перейдите в Dashboard → API Keys и создайте свой ключelevenlabs.io. Сохраните его.
  4. Где указать ключи. В коде нужно будет подставить эти ключи, например: pythonКопироватьopenai.api_key = "ВАШ_OPENAI_API_KEY" client = ElevenLabs(api_key="ВАШ_ELEVENLABS_API_KEY") Либо можно использовать файл .env или переменные окружения по выбору (см. документацию ElevenLabselevenlabs.io).
  5. Альтернативный TTS без API. Для бесплатного синтеза речи можно использовать локальную модель Silero TTS (достаточно pip install silero)github.compypi.org. Например, Silero предлагает скрипт silero_tts.py, который умеет синтезировать русский текст: arduinoКопироватьpython silero_tts.py --language ru --text "Привет, мир!" pypi.org. Код ниже использует PyTorch Hub-версию Silero.

Реализация проекта

Основной скрипт app.py для Streamlit может выглядеть так (весь код на русском):

import streamlit as st
import openai
from elevenlabs.client import ElevenLabs
import torch
import soundfile as sf
import io

st.title("Голосовой AI-ассистент")
# Выбор движка синтеза речи
движок = st.radio("Выберите движок синтеза речи:", ["ElevenLabs (платно)", "Silero TTS (бесплатно)"])

st.write("Нажмите и удерживайте кнопку, чтобы записать вопрос голосом:")
# Запись аудио с микрофона пользователя
аудио_запись = st.audio_input("Запись аудио")

if аудио_запись:
# Сохраняем записанное аудио во временный WAV-файл
with open("вопрос.wav", "wb") as f:
f.write(аудио_запись.getbuffer())

# Распознаём речь через Whisper API
аудио_файл = open("вопрос.wav", "rb")
транскрипт = openai.Audio.transcribe("whisper-1", аудио_файл, language="ru")
текст_вопроса = транскрипт.text
st.subheader("Распознанный текст:")
st.write(текст_вопроса)

# Генерируем ответ через ChatGPT (gpt-3.5-turbo)
сообщения = [
{"role": "system", "content": "Вы — голосовой ассистент, отвечайте понятно и по существу."},
{"role": "user", "content": текст_вопроса}
] ответ = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=сообщения)
текст_ответа = ответ["choices"][0]["message"]["content"] st.subheader("Ответ ассистента:")
st.write(текст_ответа)

# Синтезируем ответ в речь
st.write("Производим синтез речи...")
if движок.startswith("ElevenLabs"):
# Используем ElevenLabs API (платно)
client = ElevenLabs(api_key="ВАШ_ELEVENLABS_API_KEY")
# Пример использования: voice_id можно получить через client.voices.search()
voice_id = "JBFqnCBsd6RMkjVDRZzb" # пример: английский голос "George"
аудиоданные = client.text_to_speech.convert(
text=текст_ответа,
voice_id=voice_id,
model_id="eleven_multilingual_v2",
output_format="mp3_44100_128"
)
st.audio(аудиоданные, format="audio/mp3")
else:
# Используем Silero TTS (бесплатно)
model, _ = torch.hub.load(
'snakers4/silero-models', 'silero_tts',
language='ru', speaker='v4_ru'
)
model.to('cpu')
аудио_массив = model.apply_tts(
text=текст_ответа,
speaker='xenia', # одна из русскоязычных актрис Silero
sample_rate=48000
)
# Сохраняем аудио в буфер и воспроизводим
буфер = io.BytesIO()
sf.write(буфер, аудио_массив, 48000, format='WAV')
буфер.seek(0)
st.audio(буфер, format="audio/wav")

В этом коде:

  • Виджет st.audio_input позволяет записать голос через микрофон (Streamlit >=2023)brendg.co.uk. После записи данные возвращаются в объекте bytes, который мы сохраняем в файл вопрос.wav.
  • openai.Audio.transcribe("whisper-1", файл, language="ru") выполняет распознавание речи моделью Whisper (русский язык)kdnuggets.com. Результат – текстовая строка.
  • openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=…) генерирует ответ ChatGPT на основе подсказки (включая системное и пользовательское сообщение)gokhang1327.medium.com. Ответ выводится в интерфейс.
  • Для ElevenLabs TTS используется официальный клиент ElevenLabs. Метод text_to_speech.convert принимает текст, идентификатор голоса (voice_id) и модель (eleven_multilingual_v2) и возвращает MP3-данныеgithub.com. Нужно заранее узнать нужный voice_id в вашем аккаунте (например, через client.voices.search()).
  • Для Silero TTS модель загружается через PyTorch Hub с указанием языка ru и модели v4_ru. Метод apply_tts возвращает аудиосигнал (частота дискретизации 48000 Гц)github.com. Затем через библиотеку soundfile мы сохраняем аудио в буфер и передаём его st.audio() для воспроизведения.

Запуск локально

  1. Поместите приведённый код в файл app.py.
  2. Убедитесь, что установлены необходимые библиотеки (см. выше).
  3. Вставьте свои API-ключи в соответствующие места кода (переменные openai.api_key и ElevenLabs(api_key=...)).
  4. Запустите Streamlit: arduinoКопироватьstreamlit run app.py
  5. Откройте указанный адрес (обычно http://localhost:8501) в браузере.

Пример работы

Допустим, пользователь говорит в микрофон: «Какая завтра погода в Москве?». Процесс будет таким:

  1. Запись и распознавание: виджет Streamlit записывает аудио, Whisper API возвращает текст: «Какая завтра погода в Москве?»kdnuggets.com.
  2. Запрос к ChatGPT: отправляем этот текст в модель GPT-3.5. Например, ChatGPT может ответить (пример): «Сожалею, но у меня нет прямого доступа к актуальным метеоданным. Однако обычно в конце марта в Москве ожидается температура около +5…+10 °C и возможны осадки. Я рекомендую проверить прогноз погоды на специализированных сайтах.»
  3. Синтез речи: полученный текстовый ответ передаётся выбранному TTS-движку. Например, ElevenLabs с женским русским голосом сгенерирует MP3-ответ, который воспроизводится в браузере, или Silero TTS озвучит ответ с помощью модели «xenia» из набора Silero.

Таким образом, пользователь получает голосовой ответ на свой вопрос о погоде (хотя для точной информации о погоде стоило бы интегрировать реальный погодный API).

Источники и материалы

  • Официальное использование OpenAI Whisper APIkdnuggets.com и ChatGPT (gpt-3.5-turbo)gokhang1327.medium.com.
  • Документация ElevenLabs (создание API-ключа и метод text-to-speech/convert)elevenlabs.iogithub.com.
  • Модель Silero TTS (русскоязычная модель v4)github.compypi.org и её использование через PyTorch Hub.
  • Виджет Streamlit st.audio_input для записи аудио
+1
0
+1
2
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *