Голосовой 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-ключи
- Установите зависимости. Например, выполнив в терминале: bashКопировать
pip install streamlit openai elevenlabs torch soundfile silero
(Также потребуется установить PyTorch – командаpip install torch
– и, при использовании Silero, библиотеку soundfile.) - Получите API-ключ OpenAI. Создайте аккаунт на platform.openai.com и в разделе API Keys сгенерируйте новый ключkdnuggets.com. Сохраните его.
- Получите API-ключ ElevenLabs. Зарегистрируйтесь на elevenlabs.io, перейдите в Dashboard → API Keys и создайте свой ключelevenlabs.io. Сохраните его.
- Где указать ключи. В коде нужно будет подставить эти ключи, например: pythonКопировать
openai.api_key = "ВАШ_OPENAI_API_KEY" client = ElevenLabs(api_key="ВАШ_ELEVENLABS_API_KEY")
Либо можно использовать файл.env
или переменные окружения по выбору (см. документацию ElevenLabselevenlabs.io). - Альтернативный 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()
для воспроизведения.
Запуск локально
- Поместите приведённый код в файл
app.py
. - Убедитесь, что установлены необходимые библиотеки (см. выше).
- Вставьте свои API-ключи в соответствующие места кода (переменные
openai.api_key
иElevenLabs(api_key=...)
). - Запустите Streamlit: arduinoКопировать
streamlit run app.py
- Откройте указанный адрес (обычно http://localhost:8501) в браузере.
Пример работы
Допустим, пользователь говорит в микрофон: «Какая завтра погода в Москве?». Процесс будет таким:
- Запись и распознавание: виджет Streamlit записывает аудио, Whisper API возвращает текст: «Какая завтра погода в Москве?»kdnuggets.com.
- Запрос к ChatGPT: отправляем этот текст в модель GPT-3.5. Например, ChatGPT может ответить (пример): «Сожалею, но у меня нет прямого доступа к актуальным метеоданным. Однако обычно в конце марта в Москве ожидается температура около +5…+10 °C и возможны осадки. Я рекомендую проверить прогноз погоды на специализированных сайтах.»
- Синтез речи: полученный текстовый ответ передаётся выбранному 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
+1
2
+1
+1
+1