Создание агентного голосового ИИ, который понимает, планирует и говорит автономно
'Руководство по сборке голосового ИИ, который понимает, планирует и отвечает голосом в реальном времени.'
Обзор
В этом руководстве показано, как собрать агентного голосового ассистента, который слушает, понимает, рассуждает по нескольким шагам, планирует действия и отвечает естественной речью в реальном времени. Система объединяет распознавание речи, извлечение намерений и сущностей, многомаштабное рассуждение и синтез речи с использованием моделей вроде Whisper и SpeechT5. Включены рабочие примеры кода и демонстрация, показывающая, как восприятие, рассуждение и выполнение работают вместе.
Требования и установка
Установите необходимые библиотеки для распознавания и синтеза речи и инициализируйте окружение.
import subprocess
import sys
import json
import re
from datetime import datetime
from typing import Dict, List, Tuple, Any
def install_packages():
packages = ['transformers', 'torch', 'torchaudio', 'datasets', 'soundfile',
'librosa', 'IPython', 'numpy']
for pkg in packages:
subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-q', pkg])
print(" Initializing Agentic Voice AI...")
install_packages()
import torch
import soundfile as sf
import numpy as np
from transformers import (AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline,
SpeechT5Processor, SpeechT5ForTextToSpeech, SpeechT5HifiGan)
from IPython.display import Audio, display, HTML
import warnings
warnings.filterwarnings('ignore')Слой восприятия: транскрипция и извлечение смысла
Слой восприятия преобразует аудио в текст и извлекает намерение, сущности и тональность. Перцепции сохраняются в памяти для контекстно-зависимых ответов.
class VoiceAgent:
def __init__(self):
self.memory = []
self.context = {}
self.tools = {}
self.goals = []
def perceive(self, audio_input: str) -> Dict[str, Any]:
intent = self._extract_intent(audio_input)
entities = self._extract_entities(audio_input)
sentiment = self._analyze_sentiment(audio_input)
perception = {
'text': audio_input,
'intent': intent,
'entities': entities,
'sentiment': sentiment,
'timestamp': datetime.now().isoformat()
}
self.memory.append(perception)
return perception
def _extract_intent(self, text: str) -> str:
text_lower = text.lower()
intent_patterns = {
'create': ['create', 'make', 'generate', 'write'],
'search': ['search', 'find', 'look for', 'show me'],
'analyze': ['analyze', 'explain', 'understand', 'what is'],
'calculate': ['calculate', 'compute', 'how much', 'sum'],
'schedule': ['schedule', 'plan', 'set reminder', 'meeting'],
'translate': ['translate', 'say in', 'convert to'],
'summarize': ['summarize', 'brief', 'tldr', 'overview']
}
for intent, keywords in intent_patterns.items():
if any(kw in text_lower for kw in keywords):
return intent
return 'conversation'
def _extract_entities(self, text: str) -> Dict[str, List[str]]:
entities = {
'numbers': re.findall(r'\d+', text),
'dates': re.findall(r'\b\d{1,2}/\d{1,2}/\d{2,4}\b', text),
'times': re.findall(r'\b\d{1,2}:\d{2}\s*(?:am|pm)?\b', text.lower()),
'emails': re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', text)
}
return {k: v for k, v in entities.items() if v}
def _analyze_sentiment(self, text: str) -> str:
positive = ['good', 'great', 'excellent', 'happy', 'love', 'thank']
negative = ['bad', 'terrible', 'sad', 'hate', 'angry', 'problem']
text_lower = text.lower()
pos_count = sum(1 for word in positive if word in text_lower)
neg_count = sum(1 for word in negative if word in text_lower)
if pos_count > neg_count:
return 'positive'
elif neg_count > pos_count:
return 'negative'
return 'neutral'Рассуждение и планирование
Агент сопоставляет намерения с целями, проверяет предварительные условия, создаёт пошаговые планы и вычисляет уверенность. Каждый план затем выполняется по шагам.
def reason(self, perception: Dict) -> Dict[str, Any]:
intent = perception['intent']
reasoning = {
'goal': self._identify_goal(intent),
'prerequisites': self._check_prerequisites(intent),
'plan': self._create_plan(intent, perception['entities']),
'confidence': self._calculate_confidence(perception)
}
return reasoning
def act(self, reasoning: Dict) -> str:
plan = reasoning['plan']
results = []
for step in plan['steps']:
result = self._execute_step(step)
results.append(result)
response = self._generate_response(results, reasoning)
return response
def _identify_goal(self, intent: str) -> str:
goal_mapping = {
'create': 'Generate new content',
'search': 'Retrieve information',
'analyze': 'Understand and explain',
'calculate': 'Perform computation',
'schedule': 'Organize time-based tasks',
'translate': 'Convert between languages',
'summarize': 'Condense information'
}
return goal_mapping.get(intent, 'Assist user')
def _check_prerequisites(self, intent: str) -> List[str]:
prereqs = {
'search': ['internet access', 'search tool'],
'calculate': ['math processor'],
'translate': ['translation model'],
'schedule': ['calendar access']
}
return prereqs.get(intent, ['language understanding'])
def _create_plan(self, intent: str, entities: Dict) -> Dict:
plans = {
'create': {'steps': ['understand_requirements', 'generate_content', 'validate_output'], 'estimated_time': '10s'},
'analyze': {'steps': ['parse_input', 'analyze_components', 'synthesize_explanation'], 'estimated_time': '5s'},
'calculate': {'steps': ['extract_numbers', 'determine_operation', 'compute_result'], 'estimated_time': '2s'}
}
default_plan = {'steps': ['understand_query', 'process_information', 'formulate_response'], 'estimated_time': '3s'}
return plans.get(intent, default_plan)Уверенность, выполнение и генерация ответа
Вспомогательные функции вычисляют уровень уверенности, выполняют шаги плана (в примере это заглушки) и генерируют текстовый ответ, отражающий заключение агента и память о диалоге.
def _calculate_confidence(self, perception: Dict) -> float:
base_confidence = 0.7
if perception['entities']:
base_confidence += 0.15
if perception['sentiment'] != 'neutral':
base_confidence += 0.1
if len(perception['text'].split()) > 5:
base_confidence += 0.05
return min(base_confidence, 1.0)
def _execute_step(self, step: str) -> Dict:
return {'step': step, 'status': 'completed', 'output': f'Executed {step}'}
def _generate_response(self, results: List, reasoning: Dict) -> str:
intent = reasoning['goal']
confidence = reasoning['confidence']
prefix = "I understand you want to" if confidence > 0.8 else "I think you're asking me to"
response = f"{prefix} {intent.lower()}. "
if len(self.memory) > 1:
response += "Based on our conversation, "
response += f"I've analyzed your request and completed {len(results)} steps. "
return responseГолосовой ввод/вывод: Whisper и SpeechT5
Модуль загружает голосовые модели и предоставляет методы listen и speak. Используется Whisper для ASR и SpeechT5 с HiFi-GAN для генерации речи.
class VoiceIO:
def __init__(self):
print("Loading voice models...")
device = "cuda:0" if torch.cuda.is_available() else "cpu"
self.stt_pipe = pipeline("automatic-speech-recognition", model="openai/whisper-base", device=device)
self.tts_processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_tts")
self.tts_model = SpeechT5ForTextToSpeech.from_pretrained("microsoft/speecht5_tts")
self.vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan")
self.speaker_embeddings = torch.randn(1, 512) * 0.1
print("✓ Voice I/O ready")
def listen(self, audio_path: str) -> str:
result = self.stt_pipe(audio_path)
return result['text']
def speak(self, text: str, output_path: str = "response.wav") -> Tuple[str, np.ndarray]:
inputs = self.tts_processor(text=text, return_tensors="pt")
speech = self.tts_model.generate_speech(inputs["input_ids"], self.speaker_embeddings, vocoder=self.vocoder)
sf.write(output_path, speech.numpy(), samplerate=16000)
return output_path, speech.numpy()Интеграция: интерактивный ассистент
Объединяем агента и VoiceIO, реализуя цикл обработки: слушать, воспринимать, рассуждать, действовать, говорить.
class AgenticVoiceAssistant:
def __init__(self):
self.agent = VoiceAgent()
self.voice_io = VoiceIO()
self.interaction_count = 0
def process_voice_input(self, audio_path: str) -> Dict:
text_input = self.voice_io.listen(audio_path)
perception = self.agent.perceive(text_input)
reasoning = self.agent.reason(perception)
response_text = self.agent.act(reasoning)
audio_path, audio_array = self.voice_io.speak(response_text)
self.interaction_count += 1
return {
'input_text': text_input,
'perception': perception,
'reasoning': reasoning,
'response_text': response_text,
'audio_path': audio_path,
'audio_array': audio_array
}Визуализация рассуждений и демонстрация
Функция run_agentic_demo симулирует сценарии, заставляет ассистента обработать их как аудио, отображает рассуждение и проигрывает ответы. Демонстрация подчёркивает возможности агента: восприятие, распознавание намерений, планирование, выполнение и голосовой ответ.
def display_reasoning(self, result: Dict):
html = f"""
<div style='background: #1e1e1e; color: #fff; padding: 20px; border-radius: 10px; font-family: monospace;'>
<h2 style='color: #4CAF50;'> Agent Reasoning Process</h2>
<div><strong style='color: #2196F3;'> INPUT:</strong> {result['input_text']}</div>
<div><strong style='color: #FF9800;'> PERCEPTION:</strong>
<ul>
<li>Intent: {result['perception']['intent']}</li>
<li>Entities: {result['perception']['entities']}</li>
<li>Sentiment: {result['perception']['sentiment']}</li>
</ul>
</div>
<div><strong style='color: #9C27B0;'> REASONING:</strong>
<ul>
<li>Goal: {result['reasoning']['goal']}</li>
<li>Plan: {len(result['reasoning']['plan']['steps'])} steps</li>
<li>Confidence: {result['reasoning']['confidence']:.2%}</li>
</ul>
</div>
<div><strong style='color: #4CAF50;'> RESPONSE:</strong> {result['response_text']}</div>
</div>
"""
display(HTML(html))
def run_agentic_demo():
print("\n" + "="*70)
print(" AGENTIC VOICE AI ASSISTANT")
print("="*70 + "\n")
assistant = AgenticVoiceAssistant()
scenarios = [
"Create a summary of machine learning concepts",
"Calculate the sum of twenty five and thirty seven",
"Analyze the benefits of renewable energy"
]
for i, scenario_text in enumerate(scenarios, 1):
print(f"\n--- Scenario {i} ---")
print(f"Simulated Input: '{scenario_text}'")
audio_path, _ = assistant.voice_io.speak(scenario_text, f"input_{i}.wav")
result = assistant.process_voice_input(audio_path)
assistant.display_reasoning(result)
print("\n Playing agent's voice response...")
display(Audio(result['audio_array'], rate=16000))
print("\n" + "-"*70)
print(f"\n Completed {assistant.interaction_count} agentic interactions")
print("\n Key Agentic Capabilities Demonstrated:")
print(" • Autonomous perception and understanding")
print(" • Intent recognition and entity extraction")
print(" • Multi-step reasoning and planning")
print(" • Goal-driven action execution")
print(" • Natural language response generation")
print(" • Memory and context management")
if __name__ == "__main__":
run_agentic_demo()Итог
Пример демонстрирует, как объединить модули восприятия, рассуждения и исполнения в голосовом интерфейсе. Это практичная база для дальнейшего расширения: подключите внешние инструменты, улучшите планирование и интегрируйте более продвинутые модели по потребности.
Switch Language
Read this article in English