diff --git a/CHANGELOG.md b/CHANGELOG.md index f508abe..1f5e210 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- **App Store download badges**: official badges on bilingual READMEs (hero + Get sections) and the website, with China-store `/cn/` links for Chinese and regionless App Store links for English. / **App Store 下载徽章**:中英文 README(顶部与获取区)与官网挂载官方徽章;中文链 `/cn/`,英文用无地区链接。 +- **Website SEO & AI discovery**: richer meta/JSON-LD/FAQ, `llms.txt`, expanded sitemap, English landing, plus install / compare / Mac-dictation content pages. / **官网 SEO 与 AI 发现**:强化 meta/JSON-LD/FAQ、`llms.txt`、sitemap,并新增英文落地页与安装 / 对比 / Mac 听写专题页。 - **Context-aware polish safeguards**: polish can use a redacted cursor-neighborhood snapshot for natural continuation, validates protected terms and identifiers, retries once, and falls back to a conservative local cleanup when needed. / **上下文润色护栏**:润色可使用经截断脱敏的光标附近文字自然衔接,并校验受保护词与标识符;失败时重试一次,仍不合格则降级为本地保守清理。 - **Pause-aware chunk polish**: chunked ASR carries detected silence boundaries into the polish request while keeping previews and final output marker-free. / **分块停顿感知润色**:分块 ASR 将检测到的静音边界传入润色请求,实时预览与最终输出均不会显示内部标记。 - **True streaming cloud ASR**: Bailian, Volcengine, and OpenAI Realtime use one utterance-level WebSocket with live partials; Volcengine enables official two-pass (`enable_nonstream`) so interim text stays on-screen while definite ASR feeds polish. / **真流式云端 ASR**:百炼、火山与 OpenAI Realtime 按整句长连接推流并实时上屏;火山开启官方二遍识别(`enable_nonstream`),interim 仅上屏,definite 再送润色。 diff --git a/README.en.md b/README.en.md index 98513c6..4379914 100644 --- a/README.en.md +++ b/README.en.md @@ -12,6 +12,12 @@ Voice input for iPhone, iPad, and Mac. Speak in any app — polished text lands [Website](https://hkgood.github.io/OSGKeyboard/) · [中文 README](./README.md) · [Privacy Policy](https://hkgood.github.io/OSGKeyboard/privacy/) +

+ + Download on the App Store + +

+ --- ## Why OSGKeyboard @@ -52,6 +58,14 @@ Speech is transcribed on-device by default. Polish sends **text only** — the t --- +## Get the app + +**App Store (recommended)** + + + Download on the App Store + + ## Build from source Requires macOS with **Xcode 26** and [XcodeGen](https://github.com/yonaskolb/XcodeGen). diff --git a/README.md b/README.md index f245d1b..b732f11 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,12 @@ [官网](https://hkgood.github.io/OSGKeyboard/) · [English](./README.en.md) · [隐私政策](https://hkgood.github.io/OSGKeyboard/privacy/) +

+ + 在 App Store 下载 + +

+ --- ## 为什么用它 @@ -59,6 +65,12 @@ ## 获取 +**App Store(推荐)** + + + 在 App Store 下载 + + **从源码构建**(需 macOS + Xcode 26): ```bash diff --git a/docs/assets/badges/appstore-en.svg b/docs/assets/badges/appstore-en.svg new file mode 100644 index 0000000..072b425 --- /dev/null +++ b/docs/assets/badges/appstore-en.svg @@ -0,0 +1,46 @@ + + Download_on_the_App_Store_Badge_US-UK_RGB_blk_4SVG_092917 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/badges/appstore-zh.svg b/docs/assets/badges/appstore-zh.svg new file mode 100644 index 0000000..e3f29cd --- /dev/null +++ b/docs/assets/badges/appstore-zh.svg @@ -0,0 +1,29 @@ + + Download_on_the_App_Store_Badge_CNSC_RGB_blk_092917 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/site-pages.css b/docs/assets/site-pages.css new file mode 100644 index 0000000..3b94f5d --- /dev/null +++ b/docs/assets/site-pages.css @@ -0,0 +1,117 @@ +:root { + --bg: #f7f7f5; + --bg-elevated: #ffffff; + --bg-soft: #efefec; + --text: #121214; + --text-2: #5a5a62; + --text-3: #8e8e96; + --line: rgba(18, 18, 20, 0.10); + --accent: #2f9a52; + --nav: rgba(247, 247, 245, 0.9); + --max: 760px; + --font: "Outfit", -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Hiragino Sans GB", "Noto Sans SC", sans-serif; +} +@media (prefers-color-scheme: dark) { + :root { + --bg: #0a0a0b; + --bg-elevated: #131316; + --bg-soft: #18181b; + --text: #f4f4f2; + --text-2: #a8a8b0; + --text-3: #6f6f78; + --line: rgba(255, 255, 255, 0.09); + --accent: #4cc46e; + --nav: rgba(10, 10, 11, 0.9); + } +} +* { box-sizing: border-box; } +html { scroll-behavior: smooth; } +body { + margin: 0; + font-family: var(--font); + background: var(--bg); + color: var(--text); + line-height: 1.65; + -webkit-font-smoothing: antialiased; +} +a { color: var(--accent); text-decoration: none; } +a:hover { text-decoration: underline; } +.wrap { width: min(100% - 2rem, var(--max)); margin-inline: auto; } +.nav { + position: sticky; top: 0; z-index: 20; + backdrop-filter: blur(14px); + background: var(--nav); + border-bottom: 1px solid var(--line); +} +.nav-inner { + display: flex; align-items: center; justify-content: space-between; + gap: 1rem; padding: 0.85rem 0; width: min(100% - 2rem, 1120px); margin-inline: auto; +} +.brand { display: inline-flex; align-items: center; gap: 0.55rem; color: var(--text); font-weight: 700; text-decoration: none; } +.brand img { width: 28px; height: 28px; border-radius: 7px; } +.nav-links { display: flex; flex-wrap: wrap; gap: 0.85rem 1.1rem; font-size: 0.9rem; font-weight: 500; } +.nav-links a { color: var(--text-2); text-decoration: none; } +.nav-links a:hover { color: var(--text); } +main { padding: 2.5rem 0 4rem; } +.eyebrow { + display: inline-flex; align-items: center; gap: 0.35rem; + margin: 0 0 0.75rem; font-size: 0.8rem; font-weight: 600; + letter-spacing: 0.04em; text-transform: uppercase; color: var(--accent); +} +h1 { + margin: 0 0 0.85rem; + font-size: clamp(1.9rem, 5vw, 2.75rem); + line-height: 1.15; letter-spacing: -0.03em; +} +.lead { margin: 0 0 1.5rem; color: var(--text-2); font-size: 1.08rem; } +.store-badge { display: inline-flex; line-height: 0; margin: 0.25rem 0 1.5rem; } +.store-badge img { height: 44px; width: auto; display: block; } +.store-badge:hover { opacity: 0.9; } +h2 { margin: 2.25rem 0 0.75rem; font-size: 1.35rem; letter-spacing: -0.02em; } +h3 { margin: 1.4rem 0 0.45rem; font-size: 1.08rem; } +p, li { color: var(--text-2); } +ul, ol { padding-left: 1.2rem; } +li { margin: 0.35rem 0; } +.card { + background: var(--bg-elevated); + border: 1px solid var(--line); + border-radius: 16px; + padding: 1.1rem 1.2rem; + margin: 1rem 0; +} +.card strong { color: var(--text); } +table { + width: 100%; border-collapse: collapse; font-size: 0.92rem; + margin: 1rem 0 0.5rem; background: var(--bg-elevated); + border: 1px solid var(--line); border-radius: 12px; overflow: hidden; +} +th, td { padding: 0.7rem 0.75rem; border-bottom: 1px solid var(--line); text-align: left; vertical-align: top; } +th { background: var(--bg-soft); color: var(--text); font-weight: 600; } +tr:last-child td { border-bottom: none; } +.note { font-size: 0.88rem; color: var(--text-3); } +.cta-row { display: flex; flex-wrap: wrap; gap: 0.75rem 1rem; align-items: center; margin: 1.25rem 0; } +.btn { + display: inline-flex; align-items: center; gap: 0.35rem; + padding: 0.65rem 1rem; border-radius: 999px; font-weight: 600; + font-size: 0.92rem; text-decoration: none; border: 1px solid var(--line); + color: var(--text); background: var(--bg-elevated); +} +.btn:hover { text-decoration: none; background: var(--bg-soft); } +.btn-primary { background: var(--accent); color: #fff; border-color: transparent; } +.btn-primary:hover { opacity: 0.92; background: var(--accent); } +footer { + border-top: 1px solid var(--line); + padding: 1.4rem 0 2rem; + color: var(--text-3); + font-size: 0.88rem; +} +.footer-inner { + width: min(100% - 2rem, 1120px); margin-inline: auto; + display: flex; flex-wrap: wrap; gap: 0.75rem 1.25rem; + justify-content: space-between; align-items: center; +} +.footer-links { display: flex; flex-wrap: wrap; gap: 0.75rem 1rem; } +.footer-links a { color: var(--text-2); text-decoration: none; } +.footer-links a:hover { color: var(--text); } +.lang-switch { font-size: 0.9rem; margin-bottom: 1rem; color: var(--text-3); } +.lang-switch a { margin-right: 0.75rem; } diff --git a/docs/compare/index.html b/docs/compare/index.html new file mode 100644 index 0000000..6c3b8ff --- /dev/null +++ b/docs/compare/index.html @@ -0,0 +1,172 @@ + + + + + + OSGKeyboard vs Typeless vs Superwhisper · 开源听写对比 + + + + + + + + + + + + + + + + + + + +
+
+

中文English

+ +
+

产品对比

+

OSGKeyboard 和常见听写工具比什么?

+

如果你在找 Typeless 替代Superwhisper 平替,或想要「本地免费 + 自带 Key 润色」的开源方案,下面按维度对照。

+ + + 在 App Store 下载 + + +
+ + + + + + + + + + + + + + + + + + + +
维度TypelessSuperwhisperOpenlessOSGKeyboard
开源
付费免费额度有限;Pro 订阅不便宜免费档有限;Pro / 买断App 免费;按 Key 计费本地完全免费;云端 Key 自付
可本地识别
BYOK部分(Pro)
Mac
iPhone / iPad
Windows
+
+

价格与功能据各产品公开说明整理,可能更新,以官方为准。

+ +

什么时候选 OSGKeyboard

+
    +
  • 不想再开一份「听写订阅」,已有 DeepSeek / OpenAI 等额度
  • +
  • 默认希望录音留在设备上,隐私路径可审计(开源)
  • +
  • 同时需要 iPhone 键盘Mac 全局听写
  • +
  • 接受源码可见许可(个人学习 / 非商用本地使用;商用需授权)
  • +
+ +

什么时候可能不适合

+
    +
  • 需要 Windows 客户端
  • +
  • 希望完全托管、零配置云端识别(闭源 SaaS 更省心)
  • +
  • 商用分发但未取得商业许可
  • +
+ + +
+ +
+ +
+

Compare

+

OSGKeyboard vs Typeless, Superwhisper, Openless

+

Looking for a Typeless alternative or Superwhisper alternative that is open, free locally, and BYOK-friendly? Here is a straight comparison.

+ + + Download on the App Store + + +
+ + + + + + + + + + + + + + + + + + + +
TypelessSuperwhisperOpenlessOSGKeyboard
Open source
PricingLimited free tier; Pro subscriptionLimited free; Pro / lifetimeFree app; billed to your keyLocal free; cloud on your key
On-device ASR
BYOKPartial (Pro)
Mac
iPhone / iPad
Windows
+
+

Features and prices from public pages; verify with each vendor.

+ +

Choose OSGKeyboard when you want

+
    +
  • No second dictation subscription — reuse LLM credits you already buy
  • +
  • On-device audio by default and auditable source
  • +
  • Both an iOS keyboard and Mac global hotkey
  • +
+ +

Maybe not if you need

+
    +
  • Windows
  • +
  • Fully managed cloud ASR with zero setup
  • +
  • Commercial redistribution without a license
  • +
+
+
+
+ + + + diff --git a/docs/en/index.html b/docs/en/index.html new file mode 100644 index 0000000..887d78d --- /dev/null +++ b/docs/en/index.html @@ -0,0 +1,130 @@ + + + + + + OSGKeyboard — Free Open-Source Voice Keyboard for iPhone, iPad & Mac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Free · Open · Cross-platform

+

Speak it. It's typed.

+

OSGKeyboard is a free, open-source voice keyboard for iPhone, iPad, and Mac. Dictate in any app; on-device recognition stays private by default. Bring your own API key for AI polish — skip another dictation subscription.

+ + + Download on the App Store + + + + + OSGKeyboard on iPad, Mac, and iPhone + +

Why people switch to OSGKeyboard

+
+
Works everywhere

Messages, Notes, Notion, Cursor, Mail, WeChat — wherever the cursor is.

+
On-device by default

Local ASR on iOS; optional local models on Mac. Cloud only when you opt in.

+
BYOK polish

Use DeepSeek, OpenAI, Anthropic, OpenRouter, or any compatible endpoint.

+
Phone + Mac

Custom keyboard on iOS/iPadOS; hold Option for global Mac dictation.

+
+ +

Who it is for

+ + +

Get started

+
    +
  1. Install from the App Store.
  2. +
  3. On iOS: enable the keyboard and Full Access. On Mac: grant Microphone + Accessibility.
  4. +
  5. Speak — text lands at the cursor. Add an API key only if you want AI polish.
  6. +
+

Full steps: Install guide. Feature deep-dive: Mac global dictation. Side-by-side: Compare products.

+ +

Download

+ + Download on the App Store + +
+
+ + + + diff --git a/docs/google6f435ae7291170cf.html b/docs/google6f435ae7291170cf.html new file mode 100644 index 0000000..b909446 --- /dev/null +++ b/docs/google6f435ae7291170cf.html @@ -0,0 +1 @@ +google-site-verification: google6f435ae7291170cf.html diff --git a/docs/index.html b/docs/index.html index 6d8e087..f2f0cb2 100644 --- a/docs/index.html +++ b/docs/index.html @@ -3,34 +3,130 @@ - OSGKeyboard — 开口即文字 · iOS & Mac 语音输入 - - + OSGKeyboard — 开口即文字 · iOS & Mac 语音输入 / 听写键盘 + + + + + + + - - + + + + + + + + + @@ -261,10 +357,68 @@ .hero-cta { display: flex; flex-wrap: wrap; + align-items: center; justify-content: center; gap: 0.7rem; margin-bottom: 1.4rem; } + .store-badge { + display: inline-flex; + line-height: 0; + border-radius: 8px; + transition: opacity 0.15s ease, transform 0.15s ease; + } + .store-badge:hover { opacity: 0.9; transform: translateY(-1px); } + .store-badge img { + height: 44px; + width: auto; + display: block; + } + .download-block { + text-align: center; + padding: 3.5rem 0 1rem; + } + .download-block .store-badge { margin: 0.4rem 0 1rem; } + .download-block .store-badge img { height: 52px; } + .faq-list { + max-width: 720px; + margin: 0 auto; + display: grid; + gap: 0.85rem; + } + .faq-item { + background: var(--bg-elevated); + border: 1px solid var(--line); + border-radius: 16px; + padding: 1.05rem 1.2rem; + } + .faq-item h3 { + margin: 0 0 0.45rem; + font-size: 1.02rem; + font-weight: 600; + } + .faq-item p { + margin: 0; + color: var(--text-2); + font-size: 0.95rem; + } + .resource-links { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 0.75rem 1.25rem; + margin-top: 1.25rem; + font-size: 0.92rem; + } + .resource-links a { color: var(--accent); font-weight: 500; } + .resource-links a:hover { text-decoration: underline; } + .nav-link-text { + color: var(--text-2); + font-size: 0.9rem; + font-weight: 500; + text-decoration: none; + } + .nav-link-text:hover { color: var(--text); } .hero-meta { display: flex; flex-wrap: wrap; @@ -671,6 +825,8 @@ + 安装 + 对比 GitHub @@ -691,9 +847,8 @@

开口即文字

免费开源的跨端语音输入。本地识别,自带 API Key 润色,避免重复订阅。iPhone、iPad、Mac — 说完即落字。

- - - 立即获取 + + 在 App Store 下载 @@ -978,12 +1133,66 @@
+ +
+
+
+

常见问题

+

关于免费、隐私、设备和替代方案的短答。

+
+
+
+

OSGKeyboard 是免费的吗?

+

是。本地识别与核心听写免费。云端 AI 润色用你自己的 API Key(BYOK),不另收听写订阅。

+
+
+

语音会上传到你们的服务器吗?

+

默认不会。iOS 走端侧识别;只有你主动开云端引擎时,音频才发往你配置的服务商。润色默认只发文字。

+
+
+

支持哪些设备?

+

iPhone / iPad 自定义键盘,以及 Mac 菜单栏全局听写(按住 Option)。需 iOS / iPadOS / macOS 26+。

+
+
+

和 Typeless、Superwhisper 有什么不同?

+

开源、本地免费、手机+Mac 都有,并用 BYOK 复用已有 LLM 额度。详见对比页。

+
+
+
+
+
+ + +
+
+
+

立即下载

+

App Store 一键安装;也可从源码自行构建。

+
+ + 在 App Store 下载 + + +
+
+