Files
paseo/public-docs/voice.zh-CN.md
Mohamed Boudra bd15e40e94 Serve paseo.sh in Simplified Chinese (#7373)
* feat(website): serve paseo.sh in Simplified Chinese

Every page of the website now has a Simplified Chinese version under
/zh-CN: the interface, docs, blog posts, comparison pages, legal pages,
all changelog releases and the homepage mockup. English URLs are unchanged.

The URL alone decides the language. There is no browser-language redirect
and no stored preference, because either would have to redirect the
unprefixed English URLs that people share and search engines index.
Internal links carry the page's language instead, and hreflang alternates
point Chinese search results at /zh-CN.

Translated headings pin the English anchor with {#id}, so section links
work in both languages. content-translations.test.ts fails when a page
has no translation or a translation's headings drift from the English.
Changelog releases and plugin listings without a translation render
whole in English under a notice, so a release never waits on one.

Plugin manifests and the registry gain optional translations and
OVERVIEW.zh-CN.md fields; older clients and registries ignore them.

* feat(website): replace the native language select with an EN/ZH menu

The header showed an OS-native select whose popup did not match the site.
The trigger now shows the language abbreviated (EN, ZH) and opens a menu in
the app's dropdown style that names each language in itself, with its name
in the page language underneath. Rows are real links to the same page in
that language; arrows, Escape, outside presses and taps behave as a menu
button, and the menu keeps itself on screen when a narrow header pushes the
trigger toward an edge.

Also drops the stray space after the full-width comma in the Chinese
homepage subtitle.

* docs(website): translate main's new docs and 0.12.0 release notes

Main added Keep run workspaces to the schedules docs, rewrote plugin icons
around inline SVG, and promoted 0.12.0 with new entries. Bring the Chinese
pages and changelog in line so no section falls back to English.

* fix(server): leave plugin listing translations to the registry

The daemon rejected manifests whose translations the registry would refuse,
so a plugin main installs could fail to load here. Paseo never reads
translations; the registry validates them at publish. Docs now say which
checks are automated at publish and which are human review.

* docs(plugins): describe the registry's final overview translation discovery

* style(server): format manifest test

* test(app): measure sidebar rows one at a time

After a reload the developer error toast appears while expectVerticalOrder
measures every row at once. Each concurrent boundingBox runs the toast
locator handler, and only one of them resumes, so the poll timed out on
every attempt since #7424. Measuring sequentially keeps one action in flight.

* test(app): return sidebar row measuring to main

#7480 hides the developer toast instead of running a locator handler, so
measuring the rows concurrently no longer races it. Reverts 41ac23016.

* test(app): wait for the compact shell before opening compact Changes

The shell survives the breakpoint, so right after the resize the wide
Explorer could still be visible: the test skipped the Explorer toggle and
the tab then disappeared, or toggled at the wrong time. Wait for the
compact-shell marker, as the composer helpers do since #7424.

* docs(website): translate main's plugin file panel docs

* test(app): edit the code font size after the font family remount

A committed appearance change remounts the settings screen through
AppearanceStyleBoundary, and the new form starts from the stored size.
Filling the size before that remount lost the edit in CI.

* docs(website): translate main's client/ui import docs

Follows #7474: one /client/ui entry, StreamedText instead of useRevealedText,
SettingsGroup dropped from the settings table, and the new
'UI imports in v0.13' migration section.

* test(app): wait for the previous layout's file panel picker to leave

After a resize the old layout's picker animates out while the new one is
already mounted, so the Use button matched two elements and the strict
locator failed. Wait for the shell's layout and a single picker first.
2026-10-21 13:13:03 +07:00

6.4 KiB
Raw Permalink Blame History

title, description, nav
title description nav
语音 Paseo 的语音架构、本地优先的模型执行以及 Provider 配置。 语音

语音

Paseo 对语音提供一流的支持,可用于口述输入,以及与编程环境进行语音模式对话。

设计理念

语音以本地优先。你可以完全在设备上运行语音功能,也可以为语音功能选择 OpenAI。对于语音推理和编排,Paseo 复用你机器上已安装并完成认证的 Agent Provider。

这让凭据和执行都留在你的环境中,也避免了引入一套独立的、只能在云端运行的语音系统。

架构

  • 语音输入输出:每个功能各自的 STT 和 TTS Provider(local 或 openai)
  • 本地语音运行时:默认在 CPU 上执行的 ONNX 模型
  • 语音 LLM 编排:使用你配置的 Provider(claude、codex 或 opencode)的隐藏 Agent 会话
  • 工具路径:用于语音工具和 Agent 控制的 MCP stdio 桥

本地语音

本地语音默认使用模型 ID parakeet-tdt-0.6b-v2-int8(STT)和 kokoro-en-v0_19(TTS,speaker 0 / voice 00)。

缺失的模型会在 daemon 启动时下载到 $PASEO_HOME/models/local-speech。只会下载缺失的文件。

本地 STT 模型与语言支持

模型 ID 语言
parakeet-tdt-0.6b-v2-int8 仅英语(默认)。包含标点和大小写。
parakeet-tdt-0.6b-v3-int8 25 种欧洲语言,自动检测:保加利亚语、克罗地亚语、捷克语、丹麦语、荷兰语、英语、爱沙尼亚语、芬兰语、法语、德语、希腊语、匈牙利语、意大利语、拉脱维亚语、立陶宛语、马耳他语、波兰语、葡萄牙语、罗马尼亚语、俄语、斯洛伐克语、斯洛文尼亚语、西班牙语、瑞典语、乌克兰语。

要使用英语以外的语言,请把本地 STT 模型切换为 parakeet-tdt-0.6b-v3-int8。 v3 会自动检测说话的语言,没有针对单个语言的设置。下面的 language 字段不会影响本地 Parakeet 模型(v2 仅支持英语,v3 自动检测);它只适用于 OpenAI STT Provider。

{
  "version": 1,
  "features": {
    "dictation": {
      "stt": { "provider": "local", "model": "parakeet-tdt-0.6b-v2-int8", "language": "en" }
    },
    "voiceMode": {
      "llm": { "provider": "claude", "model": "haiku" },
      "stt": { "provider": "local", "model": "parakeet-tdt-0.6b-v2-int8", "language": "en" },
      "tts": { "provider": "local", "model": "kokoro-en-v0_19", "speakerId": 0 }
    }
  },
  "providers": {
    "local": {
      "modelsDir": "~/.paseo/models/local-speech"
    }
  }
}

对于多语言的本地口述,请把模型设置为 v3。它会自动检测语言,因此不需要 language 字段:

{
  "version": 1,
  "features": {
    "dictation": {
      "stt": { "provider": "local", "model": "parakeet-tdt-0.6b-v3-int8" }
    }
  }
}

language 字段只适用于 OpenAI STT Provider:口述使用 features.dictation.stt.language,语音模式使用 features.voiceMode.stt.language。如果省略语音语言,Paseo 会先使用口述语言,再退回到 en。它对本地 Parakeet 模型没有任何作用。

OpenAI 语音选项

把 Provider 字段设置为 openai 并提供 OpenAI 凭据,即可把口述、语音 STT 和语音 TTS 切换到 OpenAI。

{
  "version": 1,
  "features": {
    "dictation": { "stt": { "provider": "openai" } },
    "voiceMode": {
      "stt": { "provider": "openai" },
      "tts": { "provider": "openai" }
    }
  },
  "providers": {
    "openai": {
      "stt": {
        "apiKey": "...",
        "baseUrl": "https://api.openai.com/v1"
      },
      "tts": {
        "apiKey": "...",
        "baseUrl": "https://api.openai.com/v1"
      }
    }
  }
}

providers.openai.stt 用于口述和语音模式的语音转文字,providers.openai.tts 用于语音模式的文字转语音。由于两者独立解析,你可以把 STT 和 TTS 指向不同的端点。未设置时,各自先退回到 providers.openai.apiKey/baseUrl,再退回到 OPENAI_API_KEY/OPENAI_BASE_URL。这些设置只配置 Paseo 的 OpenAI 语音流量,不会改变 Codex 或其他基于 OpenAI 的工具。

Paseo 在配置的 OpenAI base URL 下使用以下路径:

  • 口述 STT:/v1/audio/transcriptions
  • 语音模式 STT:/v1/audio/transcriptions
  • 语音模式 TTS:/v1/audio/speech

环境变量

  • PASEO_VOICE_LLM_PROVIDER:覆盖语音 Agent 的 Provider
  • PASEO_DICTATION_STT_PROVIDER、PASEO_VOICE_STT_PROVIDER、PASEO_VOICE_TTS_PROVIDER:选择语音 Provider(local 或 openai)
  • OPENAI_STT_API_KEY、OPENAI_STT_BASE_URL:OpenAI 语音转文字端点(口述 + 语音模式 STT)
  • OPENAI_TTS_API_KEY、OPENAI_TTS_BASE_URL:OpenAI 文字转语音端点(语音模式 TTS)
  • PASEO_LOCAL_MODELS_DIR:本地模型存储目录
  • PASEO_DICTATION_LOCAL_STT_MODEL:本地口述 STT 模型 ID
  • PASEO_VOICE_LOCAL_STT_MODEL、PASEO_VOICE_LOCAL_TTS_MODEL:本地语音 STT/TTS 模型 ID
  • PASEO_DICTATION_LANGUAGE:口述 STT 语言(仅限 OpenAI STT;本地 Parakeet 会忽略)
  • PASEO_VOICE_LANGUAGE:语音模式 STT 语言;未设置时退回到 PASEO_DICTATION_LANGUAGE(仅限 OpenAI STT;本地 Parakeet 会忽略)
  • PASEO_VOICE_LOCAL_TTS_SPEAKER_ID、PASEO_VOICE_LOCAL_TTS_SPEED:可选的本地语音 TTS 调优

使用须知

语音模式可以启动和控制 Agent。请像对待直接的 Agent 指令一样谨慎对待语音提示词,尤其是在指定工作目录或执行破坏性操作时。