第九章:语音模式与多模态

语音模式启用与配置

Hermes Agent 的语音模式允许用户通过自然语言语音与 Agent 进行交互,将口述需求直接转化为代码实现。这一模式特别适合快速原型开发、代码审查口述以及移动场景下的编程辅助。

启用语音模式

# 启动 Hermes Agent 语音模式
hermes-agent --voice

# 指定语音引擎
hermes-agent --voice --voice-engine openai-whisper

# 启用实时转录
hermes-agent --voice --realtime

语音配置参数

# .hermes/voice.yaml
voice:
  enabled: true

  # 语音识别引擎
  recognition:
    engine: "whisper-1"           # 支持 whisper-1 / deepgram / azure
    language: "zh"                # 语言代码(zh/en/ja 等)
    model: "large-v3"             # 模型版本
    sample_rate: 16000            # 采样率(Hz)

  # 语音合成(用于 Agent 回复)
  synthesis:
    engine: "openai-tts"          # 支持 openai-tts / elevenlabs / azure
    voice: "alloy"                # 音色选择
    speed: 1.0                    # 语速(0.5-2.0)

  # 输入设备
  input:
    device: "default"             # 麦克风设备
    timeout: 30                   # 录音超时(秒)
    silence_threshold: 0.5        # 静音检测阈值

  # 热词识别
  hotwords:
    - "Hermes"                    # 唤醒词
    - "Agent"

语音输入处理流程

语音输入到代码输出的完整处理流程如下:

用户语音 → 音频采集 → 语音识别(ASR) → 文本转录
    → 意图识别 → 上下文融合 → Agent 推理
    → 代码生成 → 语音合成(TTS) → 语音回复

各阶段说明

阶段技术耗时说明
音频采集PCM/WAV 编码实时从麦克风采集原始音频数据
语音识别Whisper / Deepgram200-500ms将语音转为文本
意图识别LLM 分类100-200ms识别用户意图类型
上下文融合对话状态跟踪50-100ms结合历史对话信息
Agent 推理LLM 推理1-5s核心推理与代码生成
语音合成TTS 引擎300-800ms将回复文本转为语音
# 语音处理流程核心实现(伪代码)
class VoiceProcessor:
    def __init__(self, config: VoiceConfig):
        self.asr = ASREngine(config.recognition)
        self.tts = TTSEngine(config.synthesis)
        self.agent = HermesAgent()

    async def process_voice_input(self, audio_stream) -> Response:
        # 1. 语音识别
        text = await self.asr.transcribe(audio_stream)
        print(f"[转录] {text}")

        # 2. Agent 处理
        result = await self.agent.process(text)

        # 3. 语音合成回复
        audio = await self.tts.synthesize(str(result))

        return Response(text=result, audio=audio)

多模态理解能力

Hermes Agent 不仅支持语音输入,还具备多模态理解能力,能够同时处理文本、图像、图表等多种输入形式。

支持的输入模态

  • 文本:代码文件、文档、配置文件
  • 图像:截图、UI 设计稿、流程图
  • 图表:架构图、数据可视化图表
  • 混合:同时包含代码与注释的截图
# .hermes/multimodal.yaml
multimodal:
  enabled: true

  # 支持的图像格式
  supported_formats:
    - png
    - jpg
    - jpeg
    - webp
    - gif

  # 图像处理配置
  image:
    max_size: 20MB               # 最大图像大小
    max_resolution: 4096x4096    # 最大分辨率
    compression_quality: 85      # 压缩质量(1-100)

  # OCR 配置(针对截图中的文字识别)
  ocr:
    enabled: true
    engine: "tesseract"          # 支持 tesseract / easyocr
    languages: ["eng", "chi_sim"]

代码截图识别与处理

一个特别实用的场景是代码截图识别。开发者可以将代码截图发送给 Agent,由 Agent 识别并处理其中的代码。

# 代码截图处理示例
from hermes.multimodal import CodeScreenshotAnalyzer

analyzer = CodeScreenshotAnalyzer()

async def handle_code_screenshot(image_path: str):
    # 1. 分析截图
    result = await analyzer.analyze(image_path)

    # 2. 提取代码
    code = result.extracted_code
    language = result.detected_language  # Python/JS/TS 等

    print(f"检测到语言: {language}")
    print(f"提取代码:
{code}")

    # 3. 执行分析
    analysis = await analyzer.analyze_code_quality(
        code=code,
        language=language,
        checks=["bugs", "style", "security"]
    )

    return analysis
截图类型识别准确率处理时间典型用例
纯代码截图98%1-2s从截图提取可运行代码
含报错信息的截图95%2-3s分析错误堆栈、Debug
UI 设计稿截图85%3-5s将设计图转为前端代码
架构图截图80%3-5s理解系统架构、生成文档
手写代码照片70%4-6s数字化手写代码片段

实际用例:用语音描述需求生成代码

下面是一个完整的实际用例,展示如何通过语音驱动代码生成。

用户语音输入

"帮我创建一个 React 自定义 Hook,用于管理 localStorage 的读写操作,需要支持类型泛型、过期时间设置,并且要监听 storage 变化事件。"

Agent 处理过程

# 语音识别结果
[转录] 帮我创建一个 React 自定义 Hook,用于管理 localStorage
的读写操作,需要支持类型泛型、过期时间设置,并且要监听
storage 变化事件。

# Agent 推理过程
[推理] 理解需求:创建 useLocalStorage Hook
  1. 支持泛型类型参数
  2. 过期时间设置
  3. storage 变化监听
  4. 读写操作封装

生成代码

// Agent 生成的代码
import { useState, useEffect, useCallback } from 'react';

interface StorageItem<T> {
  value: T;
  expiresAt?: number;
}

function useLocalStorage<T>(
  key: string,
  initialValue: T,
  ttl?: number // 过期时间(秒)
): [T, (value: T) => void, () => void] {
  const readValue = useCallback((): T => {
    try {
      const item = localStorage.getItem(key);
      if (!item) return initialValue;

      const parsed: StorageItem<T> = JSON.parse(item);

      // 检查是否过期
      if (parsed.expiresAt && Date.now() > parsed.expiresAt) {
        localStorage.removeItem(key);
        return initialValue;
      }

      return parsed.value;
    } catch {
      return initialValue;
    }
  }, [key, initialValue]);

  const [storedValue, setStoredValue] = useState<T>(readValue);

  const setValue = useCallback((value: T) => {
    try {
      const item: StorageItem<T> = {
        value,
        expiresAt: ttl ? Date.now() + ttl * 1000 : undefined,
      };
      localStorage.setItem(key, JSON.stringify(item));
      setStoredValue(value);
      window.dispatchEvent(new Event('local-storage'));
    } catch (error) {
      console.error('Error saving to localStorage:', error);
    }
  }, [key, ttl]);

  const removeValue = useCallback(() => {
    localStorage.removeItem(key);
    setStoredValue(initialValue);
  }, [key, initialValue]);

  useEffect(() => {
    const handleStorageChange = (e: StorageEvent) => {
      if (e.key === key) {
        setStoredValue(readValue());
      }
    };

    const handleCustomEvent = () => {
      setStoredValue(readValue());
    };

    window.addEventListener('storage', handleStorageChange);
    window.addEventListener('local-storage', handleCustomEvent);

    return () => {
      window.removeEventListener('storage', handleStorageChange);
      window.removeEventListener('local-storage', handleCustomEvent);
    };
  }, [key, readValue]);

  return [storedValue, setValue, removeValue];
}

export default useLocalStorage;

Agent 语音回复

"已创建 useLocalStorage Hook,支持泛型类型参数、可选的过期时间设置,以及跨标签页的 storage 变化监听。使用示例:const [token, setToken, removeToken] = useLocalStorage('auth_token', '', 3600);"

语音 vs 文本输入效率对比

对比维度语音输入文本输入
输入速度150-200 字/分钟60-80 字/分钟
准确率95%(安静环境)100%
适用场景快速描述、移动场景精确代码、复杂逻辑
修改成本需要重新录制直接编辑文本
隐私性低(声音可识别)
环境要求安静环境无特殊要求
多语言混合识别率下降完美支持
学习曲线低(自然交互)无(已成习惯)
疲劳度长时间说话易疲劳长时间打字易疲劳

在实际使用中,推荐采用混合模式:使用语音快速描述需求和设计思路,切换到文本进行精确的代码调整和 Debug。这种结合两种输入方式优势的工作流,可以显著提升开发效率。下一章我们将探讨技能系统与自定义技能开发。