Agentic 语音:VoiceStudio 作为 TTS/STT 提供商¶
VoiceStudio 提供了一个本地语音平台——兼容 OpenAI 的批量音频、带版本化的转录 WebSocket,以及 MCP——因此任何能与 OpenAI 音频端点对接的智能体框架,都可以使用你的本地 VoiceStudio 来完成语音——并且使用你克隆的声音,一切都不会离开你的机器。你提供智能体运行时;VoiceStudio 负责语音。
若要直接口述到 Claude Code、Codex、Pi、Antigravity CLI 或其他专注型 prompt,请使用应用的听写快捷键;流式 API 见本地语音平台。
这是“agentic v1”:VoiceStudio 是提供商,而非编排器。你接入自己的智能体(支持热线、桌面助手、Discord 角色),并将其 TTS/STT 指向 VoiceStudio。
范围。 本页介绍 VoiceStudio 作为提供商的用法。外呼电话是一个单独且推迟的里程碑(它们需要付费运营商——不存在完全本地的 PSTN 路径),并且只在明确的同意护栏之后推出。路线图见
docs/competitive-analysis.md(§R1)。接听来电并播放语音问候可作为可选集成:见 Twilio。
端点¶
VoiceStudio 的服务根地址是 http://localhost:3900(或你的远程后端 URL)。兼容 OpenAI 的客户端使用 http://localhost:3900/v1 作为其基础 URL,而发现端点仍位于服务根地址:http://localhost:3900/.well-known/voicestudio-speech。
| OpenAI 路由 | VoiceStudio 支持 |
|---|---|
POST /v1/audio/speech |
TTS。model 可以是已安装引擎的 id,也可以是 OpenAI 模型 id(tts-1、tts-1-hd、gpt-4o-mini-tts 及其带日期的快照),用于激活的引擎。voice 可以是语音配置文件 id(你的克隆)、语音配置文件名称(不区分大小写;id 始终优先,多个配置文件共享同一名称时返回 409 ambiguous_voice 并列出发送者的 id——重命名其中一个,或传入 id)、引擎预设,或任意大小写的 OpenAI 语音名称(alloy、ash、coral……——引擎的默认语音)。instructions 成为引擎的风格指令;OmniVoice 只保留其语音设计标签(如 female, whisper),忽略其他文本;当两者同时发送时,VoiceStudio 自己的 instruct 优先。speed,以及 stream_format audio(分块字节)或 sse(speech.audio.delta 事件)。 |
POST /v1/audio/transcriptions |
使用激活的语音识别引擎进行 STT;任何 OpenAI 模型 id 都可用,而 VoiceStudio 引擎 id 必须指向激活的引擎(否则返回 400 model_not_active);没有音频流的文件返回 400 no_audio_track。language、prompt 和 temperature 会传递给支持它们的引擎(Whisper 家族)。response_format 支持 json、text、verbose_json(OpenAI 分段,外加 timestamp_granularities[]=word 时的 words)、srt、vtt。不支持 stream=true——请使用下面的 WebSocket。 |
POST /v1/audio/translations |
语音 → 英文文本。需要 Whisper 家族的引擎(faster-whisper、WhisperX、MLX Whisper、PyTorch Whisper)运行多语言检查点,例如 large-v3。Turbo、Distil-Whisper 和仅英文(.en)检查点仅支持转录;与其他引擎一样,它们会返回明确的 400,而不是未翻译的文本。 |
WS /v1/audio/transcriptions/stream |
来自 PCM 或 WebM 的实时部分/最终 STT。 |
GET /v1/models、GET /v1/models/{id} |
OpenAI 模型列表:上述 OpenAI 别名、每个已安装的 TTS 引擎,以及激活的 STT 引擎。 |
GET /.well-known/voicestudio-speech |
机器可读的传输发现。 |
GET /v1/audio/voices |
列出可用语音(VoiceStudio 扩展)。每个语音都有其 voice_id(也作为 id,即 Open WebUI 读取的字段)和 name;addressable_by_name: true 表示该名称可作为 voice 使用。如果配置文件的名称与某个 OpenAI 语音、default 或另一个配置文件的 id 完全相同,则该名称保持原有含义,因此请通过 id 调用。 |
语音 response_format 会精确返回所请求的格式:
| 格式 | 主体 | Content-Type |
|---|---|---|
mp3(默认) |
MP3 | audio/mpeg |
opus |
Ogg 中的 Opus,48 kHz | audio/ogg |
aac |
AAC(ADTS) | audio/aac |
flac / wav |
无损,使用引擎的采样率 | audio/flac / audio/wav |
pcm |
原始 24 kHz 16 位小端单声道,按 OpenAI 规范——从引擎的速率重采样 | audio/pcm |
mp3、opus 和 aac 使用 ffmpeg(随 VoiceStudio 捆绑)编码。如果找不到 ffmpeg,请求会在生成任何音频之前以 400 失败,并指明修复方法;wav、flac 和 pcm 不需要编码器。
这些路由上的错误使用 OpenAI 的错误结构——{"error": {"message", "type", "param", "code"}}——因此 SDK 会抛出带可读消息的类型化异常。与 OpenAI 一样,无效请求返回 400。响应体还会保留现有 VoiceStudio 客户端读取的 detail 字段。
契约测试在 CI 中锁定这一接口:tests/test_agentic_provider_contract.py(pipecat/LiveKit 请求形态)和 tests/test_openai_sdk_contract.py(通过官方 openai SDK 驱动每个路由)。
pipecat(推荐)¶
pipecat(BSD-2)作为 Python 库运行在你自己的进程中——无需额外服务器。将其 OpenAI TTS/STT 服务指向 VoiceStudio:
from pipecat.services.openai.tts import OpenAITTSService
from pipecat.services.openai.stt import OpenAISTTService
tts = OpenAITTSService(
base_url="http://localhost:3900/v1",
api_key="not-needed-locally", # any string; VoiceStudio ignores it unless OMNIVOICE_API_KEY is set
voice="<your-voice-profile-id>", # or its name; see GET /v1/audio/voices, or "default"
model="omnivoice", # or any installed engine id
sample_rate=24000, # matches VoiceStudio's default output
)
stt = OpenAISTTService(
base_url="http://localhost:3900/v1",
api_key="not-needed-locally",
)
将这两个服务放入任何 pipecat 流水线(VAD、轮流发言和 LLM 也都保持在本地)。可运行的最小示例见 examples/agentic/pipecat_minimal.py。
LiveKit Agents¶
LiveKit Agents(Apache-2.0)还需要一个
LiveKit 媒体服务器与它配套,但其 OpenAI 插件接受同样的
base_url:
from livekit.plugins import openai
tts = openai.TTS(base_url="http://localhost:3900/v1", api_key="x", voice="<profile-id>")
stt = openai.STT(base_url="http://localhost:3900/v1", api_key="x")
只有在需要 WebRTC/SIP 这种规模能力时,才选择 LiveKit 而不是 pipecat;对于 单个本地智能体,pipecat 更轻量。
OpenAI Agents SDK¶
OpenAI Agents SDK
的语音管道需要一个 OpenAI 客户端,因此请为它提供一个指向 VoiceStudio 的客户端。
其默认模型(gpt-4o-transcribe、gpt-4o-mini-tts)、默认声音以及
24 kHz PCM 输出都可以原样使用。Integrations 下的 OpenAI Agents 页面
会显示这个代码片段,并已为你填入后端地址:
import os
from agents import Agent, OpenAIChatCompletionsModel, set_tracing_disabled
from agents.voice import (
OpenAIVoiceModelProvider, SingleAgentVoiceWorkflow, STTModelSettings,
TTSModelSettings, VoicePipeline, VoicePipelineConfig,
)
from openai import AsyncOpenAI
set_tracing_disabled(True) # the SDK uploads traces to OpenAI by default
voicestudio = AsyncOpenAI(
base_url="http://localhost:3900/v1",
api_key=os.environ.get("OMNIVOICE_API_KEY", "not-needed-locally"),
)
# The agent's language model: a local OpenAI-compatible server you choose.
llm = AsyncOpenAI(
base_url=os.environ["AGENT_LLM_BASE_URL"], # e.g. Ollama: http://localhost:11434/v1
api_key=os.environ.get("AGENT_LLM_API_KEY", "not-needed-locally"),
)
agent = Agent(
name="Assistant",
instructions="Be brief.",
model=OpenAIChatCompletionsModel(model=os.environ["AGENT_LLM_MODEL"], openai_client=llm),
)
pipeline = VoicePipeline(
workflow=SingleAgentVoiceWorkflow(agent),
stt_model="gpt-4o-transcribe", # VoiceStudio's active speech-recognition engine
tts_model="gpt-4o-mini-tts", # VoiceStudio's active voice engine
config=VoicePipelineConfig(
model_provider=OpenAIVoiceModelProvider(openai_client=voicestudio),
stt_settings=STTModelSettings(language="en"),
tts_settings=TTSModelSettings(voice="alloy"), # or a voice-profile id or name
),
)
SDK 会为 TTSModelSettings.instructions 发送一段默认的自然语言文本;支持
自由文本指令的引擎会遵循它,而 OmniVoice 会忽略它。设置
instructions="female, whisper" 这类标签即可引导 OmniVoice。
智能体的语言模型是显式指定的:将 AGENT_LLM_BASE_URL 和
AGENT_LLM_MODEL 设置为本地 OpenAI 兼容服务器(Ollama、LM Studio、
llama.cpp、vLLM)。如果未设置这些变量,代码片段会快速失败,而不会回退到
OpenAI 的托管模型。输入模式同样由你决定——使用 AudioInput(
录制的语音回合)。StreamedAudioInput 需要 OpenAI 的 Realtime 转录
WebSocket,而 VoiceStudio 没有实现它。
远程后端¶
在远程 GPU 机器上运行 VoiceStudio?请将 /v1 附加到该
后端服务根 URL 的末尾,作为 OpenAI 客户端的 base_url,并把它的
OMNIVOICE_API_KEY 作为 api_key 传入——这也是应用其余部分所使用的同一个 Bearer 令牌。
只应通过 https(例如 Tailscale Serve)发送该密钥;通过普通 http 发送时,
它会以明文在网络中传输。
保留未修改的服务根 URL,以用于 /.well-known/voicestudio-speech
发现,并让后端保持在你的 tailnet 内,而不要暴露到公网。
负责任地使用你的声音¶
当智能体用克隆声音说话时,请优先选择你已标记为 verified own voice (设置 → 声音档案 → Voice ownership)的档案。那道同意锁是在更重量级的 智能体功能陆续落地时用于控制访问的机制,也是“有一个 AI 正在以我的身份说话”时 诚实合理的默认要求。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 om/VoiceStudio