Проект объединяет несколько компонентов:
- Распознавание речи: отправка аудио на 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).
Источник: uproger.com
Комментарии: