Skip to content

STT Library Research #288

@TheShigure7

Description

@TheShigure7

STT 库调研与 AnyClaw 适配建议

1. 目标

本文档聚焦 Speech-to-Text,回答 4 个问题:

  1. anyclaw1.2 当前的 STT 是怎么实现的。
  2. 现成成熟方案有哪些。
  3. 这些方案的典型使用方法是什么。
  4. AnyClaw 哪些部分该保留自研,哪些部分可以收缩或替换。

2. AnyClaw1.2 当前现状

anyclaw1.2 当前 STT 主要位于:

  • anyclaw1.2/anyclaw/pkg/speech/stt_provider.go
  • anyclaw1.2/anyclaw/pkg/speech/stt_manager.go
  • anyclaw1.2/anyclaw/pkg/speech/stt_whisper.go
  • anyclaw1.2/anyclaw/pkg/speech/stt_google.go
  • anyclaw1.2/anyclaw/pkg/speech/stt_whispercpp.go
  • anyclaw1.2/anyclaw/pkg/gateway/gateway_speech_stt.go

从代码结构看,当前做法不是简单“调用一个现成 SDK”:

  • 自己定义了 provider 抽象
  • 自己实现了 manager
  • 自己实现了 pipeline / integration
  • 自己写了 OpenAI 和 Google 的 HTTP 调用层
  • 本地 whisper.cpp 也包了一层进程执行器

这意味着:

  • 不是自己造了 STT 模型
  • 但确实自己造了一套 多供应商接入层 + 编排层

3. 方案一:OpenAI Speech-to-Text

3.1 定位

OpenAI 官方已经提供成熟的 Speech-to-Text 能力,适合:

  • 文件转写
  • 流式转写
  • 实时转写
  • 与语音 Agent 联动

3.2 官方能力形态

官方资料明确给出几种典型方式:

  1. 文件上传,阻塞式转写
  2. 文件上传,流式返回结果
  3. Realtime WebSocket / WebRTC 实时转写
  4. Agents SDK VoicePipeline

这说明如果团队目标只是接入 OpenAI 转写,底层并不需要自己再造一层复杂客户端。

3.3 典型使用方法

Python 文件转写:

from openai import OpenAI

client = OpenAI()

with open("speech.mp3", "rb") as f:
    transcript = client.audio.transcriptions.create(
        file=f,
        model="gpt-4o-transcribe",
        response_format="text",
    )

print(transcript)

文件流式转写:

from openai import OpenAI

client = OpenAI()

with open("speech.mp3", "rb") as f:
    stream = client.audio.transcriptions.create(
        file=f,
        model="gpt-4o-transcribe",
        response_format="text",
        stream=True,
    )

for event in stream:
    print(event)

实时转写则走 Realtime transcription session,通过 WebSocketsWebRTC 建立转写会话。

3.4 对 AnyClaw 的意义

AnyClaw 当前 stt_whisper.go 是手写 multipart 和 endpoint 的方式,这种写法能工作,但维护上会重复承担:

  • 请求封装
  • 错误解析
  • 兼容性维护

如果未来主要支持 OpenAI,建议:

  • 保留 AnyClaw 的 provider manager / pipeline / gateway wiring
  • 尽量减少手写 API 客户端细节

3.5 优缺点

优点:

  • 官方能力成熟
  • 支持文件、流式、实时多场景
  • 与后续语音 Agent 路线一致

缺点:

  • 依赖云端
  • 成本可变
  • 对网络质量敏感

3.6 参考资料


4. 方案二:Google Cloud Speech-to-Text

4.1 定位

Google Cloud Speech-to-Text 是成熟云转写方案,适合:

  • 企业级云语音识别
  • 批量文件转写
  • 流式转写
  • 需要官方 Go client 的场景

4.2 核心特点

Google 不只是提供 REST API,还提供官方客户端库,包括 Go client。

这点和 AnyClaw 当前 stt_google.go 的手写 REST 调用形成鲜明对比。

4.3 典型使用方法

安装 Go client:

go get cloud.google.com/go/speech

创建客户端:

ctx := context.Background()
client, err := speech.NewClient(ctx)
if err != nil {
    // handle error
}
defer client.Close()

在 Google Cloud 文档里,Speech-to-Text client library 用于直接构造识别请求,而不是自己手写 JSON 和 HTTP 请求。

另外,流式识别还支持:

  • enable_voice_activity_events
  • SPEECH_ACTIVITY_BEGIN
  • SPEECH_ACTIVITY_END

4.4 对 AnyClaw 的意义

如果 AnyClaw 要继续保留 Google STT 支持,更建议:

  • 上层继续保留 provider 抽象
  • 下层优先切官方 Go client

这样可以减少:

  • 手写 REST 细节
  • 自己维护协议字段
  • 自己维护兼容性

4.5 优缺点

优点:

  • 官方 Go client 完整
  • 支持云端流式识别
  • 支持语音活动事件

缺点:

  • 依赖 Google Cloud
  • 配置和认证相对更重
  • 不适合纯离线本地场景

4.6 参考资料


5. 方案三:whisper.cpp

5.1 定位

whisper.cpp 是最成熟的本地离线 Whisper 运行方案之一,适合:

  • 本地离线转写
  • 边缘设备
  • 隐私要求高
  • 不想依赖云服务

5.2 核心特点

官方仓库强调:

  • C/C++ 实现
  • 支持 CPU-only
  • 支持多种硬件加速
  • 支持量化模型
  • 适合作为本地 ASR 引擎

5.3 典型使用方法

官方 quick start:

git clone https://github.com/ggml-org/whisper.cpp.git
cd whisper.cpp
sh ./models/download-ggml-model.sh base.en
cmake -B build
cmake --build build -j --config Release

然后使用 whisper-cli 转写音频文件。

AnyClaw 当前的接法本质上就是这条路线:

  1. 准备模型文件
  2. 通过 binaryPath 定位本地可执行文件
  3. 把音频写成临时文件
  4. exec 调起 whisper.cpp
  5. 解析文本或 JSON 输出

5.4 对 AnyClaw 的意义

和 OpenAI / Google 不同,whisper.cpp 本来就是一个本地二进制/库路线,所以 AnyClaw 外面包一层 Go 封装是合理的。

这一块更像:

  • 不是重复造轮子
  • 而是给成熟本地引擎写集成层

5.5 优缺点

优点:

  • 本地离线
  • 数据不出本机
  • 成本稳定
  • 适合私有化环境

缺点:

  • 要管理模型文件
  • CPU/GPU 资源占用明显
  • 识别能力依赖本地硬件

5.6 参考资料


6. 对比总结

方案 类型 延迟 本地/云端 接入复杂度 适合 AnyClaw 的场景
OpenAI STT 官方云 API 低到中 云端 OpenAI 语音 Agent 路线
Google Cloud STT 官方云 API + Go client 低到中 云端 企业级云识别与流式识别
whisper.cpp 本地离线引擎 本地 隐私优先、离线场景
当前自研上层编排 自研 orchestration 取决于底座 混合 已有 多供应商统一接入

7. AnyClaw 哪些该保留自研,哪些可收缩

7.1 建议保留自研的部分

这些更接近 AnyClaw 的平台价值:

  • provider 抽象
  • manager
  • pipeline
  • integration
  • gateway wiring
  • 与任务、会话、路由、审批的结合

7.2 建议收缩的部分

这些更像通用接入细节:

  • OpenAI 底层 HTTP 手写客户端
  • Google 底层 REST 手写客户端
  • 对单一供应商字段的重复封装

如果项目未来会长期维护语音能力,建议尽量:

  • 对 OpenAI 走官方支持方式
  • 对 Google 优先走官方 Go client

7.3 whisper.cpp 的例外

whisper.cpp 不属于“手写云 API 客户端”范畴,它本身就是本地引擎,因此 AnyClaw 写一层本地集成封装是合理的。


8. 对 AnyClaw 的建议

8.1 短期建议

短期最实用的做法:

  • 保留现有 STT 上层架构
  • 不急着重写 manager / pipeline
  • 优先梳理 OpenAI / Google 底层客户端是否要收缩

8.2 中期建议

中期建议形成“三轨制”:

  1. OpenAI STT
    • 面向语音 Agent、实时体验
  2. Google Cloud STT
    • 面向企业云识别与流式场景
  3. whisper.cpp
    • 面向离线、本地、私有化

上层统一用 AnyClaw 的 provider 抽象屏蔽差异。

8.3 结构建议

建议把 STT 层分为两层:

  • 底层引擎层
    • OpenAI
    • Google
    • whisper.cpp
  • 平台编排层
    • provider manager
    • pipeline
    • routing / session / task integration

这样更清楚地区分:

  • 哪些是“可替换底座”
  • 哪些是“AnyClaw 的平台价值”

9. 最终结论

anyclaw1.2 来说:

  • OpenAI STTGoogle Cloud STT 本来就有成熟官方能力。
  • 当前项目主要是自己造了统一接入层和底层 HTTP 适配层。
  • whisper.cpp 则更像是合理地复用成熟本地引擎,并在外部包了一层 AnyClaw 集成。

一句话总结:

AnyClaw 的 STT 不是“自己造模型”,而是“在成熟服务和成熟本地引擎之上,自建了一套多供应商接入与编排层”;其中最值得收缩的是云厂商底层客户端细节,最值得保留的是平台级编排能力。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions