feat(app): add resilient Flow recovery and privacy-safe analytics
Unify PiP recovery across startup and foreground transitions, surface actionable status, and add privacy-safe analytics plus the refreshed onboarding and account experience. Update documentation assets and advance the release build to 84.
This commit is contained in:
@@ -71,7 +71,11 @@ TYPING
|
||||
|
||||
PRIVACY
|
||||
|
||||
• No advertising, analytics, or tracking SDKs.
|
||||
• Limited first-party product analytics; no third-party analytics,
|
||||
advertising, tracking SDKs, ATT, or IDFA.
|
||||
• Product analytics never includes keyboard input, audio, transcripts,
|
||||
prompts, model output, credentials, or personal identifiers. It can be
|
||||
disabled in Settings, which deletes queued events.
|
||||
• Local recognition does not upload audio.
|
||||
• User-configured cloud requests go directly to that provider. Managed-credit
|
||||
requests go through OSGKeyboard's managed gateway to the managed provider.
|
||||
@@ -157,6 +161,9 @@ OSGKeyboard is a custom keyboard for iOS/iPadOS 26.
|
||||
Clipboard, then return to the keyboard. Secure fields hide the clipboard
|
||||
entry point. Turning History off preserves saved items; use the separate
|
||||
confirmed clear action to delete them.
|
||||
10. First-party Product Analytics is enabled by default under Settings →
|
||||
About → Privacy. Turning it off deletes queued events. It does not collect
|
||||
keyboard input, audio, transcripts, prompts, model output, or credentials.
|
||||
|
||||
Privacy policy:
|
||||
https://hkgood.github.io/OSGKeyboard/privacy/
|
||||
@@ -230,9 +237,41 @@ This covers the pseudonymous OSGKeyboard account identifier and scoped
|
||||
managed-service grant identifiers. Core use remains available without an
|
||||
OSGKeyboard account.
|
||||
|
||||
### Identifiers → Device ID
|
||||
|
||||
- Collected: Yes
|
||||
- Purpose: Analytics
|
||||
- Linked to the user: Yes
|
||||
- Used for tracking: No
|
||||
|
||||
This is an app-scoped random installation identifier. It rotates when analytics
|
||||
is re-enabled, after account deletion, or when a different account signs in. It
|
||||
is not IDFA and is not used across apps.
|
||||
|
||||
### Usage Data → Product Interaction
|
||||
|
||||
- Collected: Yes
|
||||
- Purpose: Analytics
|
||||
- Linked to the user: Yes
|
||||
- Used for tracking: No
|
||||
|
||||
This covers fixed event names for app and keyboard sessions, purchase-page
|
||||
interactions, and invitation actions. It contains no free-form properties.
|
||||
|
||||
### Usage Data → Other Usage Data
|
||||
|
||||
- Collected: Yes
|
||||
- Purpose: Analytics
|
||||
- Linked to the user: Yes
|
||||
- Used for tracking: No
|
||||
|
||||
This covers fixed AI feature categories, execution modes, outcome categories,
|
||||
and coarse duration buckets. It does not include prompts, transcripts, model
|
||||
output, audio, or keyboard content.
|
||||
|
||||
### Do not select
|
||||
|
||||
- Advertising, marketing, analytics, product personalization, or tracking
|
||||
- Advertising, marketing, product personalization, or tracking
|
||||
- Email address, phone number, physical address, location, contacts, photos,
|
||||
browsing history, or search history
|
||||
- Usage data or diagnostics stored only locally or in the user's private iCloud
|
||||
@@ -249,6 +288,8 @@ standard HTTPS. Re-evaluate this answer if non-exempt cryptography is added.
|
||||
- [ ] Run the release build and test suites on macOS with Xcode 26
|
||||
- [ ] Replace screenshots with captures from the submitted build
|
||||
- [ ] Verify the privacy answers against the submitted provider features
|
||||
- [ ] In App Store Connect, add Device ID, Product Interaction, and Other
|
||||
Usage Data for Analytics; linked to the user, not used for tracking
|
||||
- [ ] Confirm `500tks`, `1500tks`, and `3000tks` are approved, consumable,
|
||||
and mapped to the server credit catalog
|
||||
- [ ] Confirm `ByRockyACoffee` remains an optional consumable tip and unlocks
|
||||
|
||||
+62
-169
@@ -6,7 +6,7 @@
|
||||
--surface-strong: #e5eaf0;
|
||||
--ink: #111416;
|
||||
--ink-secondary: #5f676e;
|
||||
--ink-tertiary: #8b949c;
|
||||
--ink-tertiary: #626c74;
|
||||
--line: rgba(17, 20, 22, 0.1);
|
||||
--line-strong: rgba(17, 20, 22, 0.18);
|
||||
--accent: #2d8a57;
|
||||
@@ -28,7 +28,7 @@ html[data-theme="dark"] {
|
||||
--surface-strong: #2b3033;
|
||||
--ink: #f2f4f3;
|
||||
--ink-secondary: #aab0ac;
|
||||
--ink-tertiary: #737a75;
|
||||
--ink-tertiary: #969e98;
|
||||
--line: rgba(255, 255, 255, 0.09);
|
||||
--line-strong: rgba(255, 255, 255, 0.16);
|
||||
--accent: #6fbd8a;
|
||||
@@ -97,6 +97,13 @@ h3 {
|
||||
text-wrap: balance;
|
||||
}
|
||||
|
||||
html[data-lang="zh"] h1,
|
||||
html[data-lang="zh"] h2,
|
||||
html[data-lang="zh"] h3 {
|
||||
overflow-wrap: normal;
|
||||
word-break: keep-all;
|
||||
}
|
||||
|
||||
.skip-link {
|
||||
position: fixed;
|
||||
z-index: 100;
|
||||
@@ -300,27 +307,6 @@ html[data-theme="dark"] #themeToggle::before {
|
||||
height: 22px;
|
||||
}
|
||||
|
||||
.assistant-tabs > .material-symbols-rounded::before {
|
||||
content: "•••";
|
||||
font-size: 0.72rem;
|
||||
letter-spacing: 0.08em;
|
||||
}
|
||||
|
||||
.round-control:first-child .material-symbols-rounded::before {
|
||||
content: "↶";
|
||||
font-size: 1.15rem;
|
||||
}
|
||||
|
||||
.round-control:last-child .material-symbols-rounded::before {
|
||||
content: "↑";
|
||||
font-size: 1.05rem;
|
||||
}
|
||||
|
||||
.mic-control .material-symbols-rounded::before {
|
||||
content: "●";
|
||||
font-size: 0.72rem;
|
||||
}
|
||||
|
||||
.gesture-grid .material-symbols-rounded,
|
||||
.skill-actions .material-symbols-rounded {
|
||||
display: none;
|
||||
@@ -341,16 +327,6 @@ html[data-theme="dark"] #themeToggle::before {
|
||||
font-size: 1.55rem;
|
||||
}
|
||||
|
||||
.ios-symbol .material-symbols-rounded::before {
|
||||
content: "⌨";
|
||||
font-size: 2.25rem;
|
||||
}
|
||||
|
||||
.ios-symbol .material-symbols-rounded {
|
||||
width: 46px;
|
||||
height: 46px;
|
||||
}
|
||||
|
||||
.outline-action .material-symbols-rounded::before {
|
||||
content: "⌘";
|
||||
font-size: 1rem;
|
||||
@@ -467,6 +443,14 @@ html[data-lang="zh"] .hero h1 {
|
||||
height: 48px;
|
||||
}
|
||||
|
||||
html[data-theme="light"] .store-badge img {
|
||||
filter: invert(1);
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .store-badge img {
|
||||
filter: none;
|
||||
}
|
||||
|
||||
.store-badge:hover,
|
||||
.store-badge:focus-visible {
|
||||
opacity: 0.86;
|
||||
@@ -718,103 +702,37 @@ html[data-theme="dark"] .message-bubble {
|
||||
bottom: 24px;
|
||||
}
|
||||
|
||||
.keyboard-demo {
|
||||
display: flex;
|
||||
.keyboard-capture {
|
||||
position: relative;
|
||||
align-self: center;
|
||||
min-width: 0;
|
||||
aspect-ratio: 1.18;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
background: var(--surface-strong);
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.assistant-tabs {
|
||||
display: grid;
|
||||
grid-template-columns: 46px repeat(3, auto) 1fr;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
padding: 16px 18px;
|
||||
border-bottom: 1px solid var(--line);
|
||||
.keyboard-capture img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
object-position: center bottom;
|
||||
}
|
||||
|
||||
.assistant-logo {
|
||||
display: grid;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
border-radius: 11px;
|
||||
background: var(--accent);
|
||||
color: #fff;
|
||||
font-size: 0.66rem;
|
||||
font-weight: 800;
|
||||
place-items: center;
|
||||
}
|
||||
|
||||
.assistant-tab {
|
||||
padding: 6px 9px;
|
||||
.keyboard-capture figcaption {
|
||||
position: absolute;
|
||||
top: 16px;
|
||||
left: 16px;
|
||||
padding: 7px 10px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.22);
|
||||
border-radius: 999px;
|
||||
color: var(--ink-tertiary);
|
||||
font-size: 0.72rem;
|
||||
background: rgba(17, 20, 22, 0.68);
|
||||
color: #ffffff;
|
||||
font-size: 0.68rem;
|
||||
font-weight: 650;
|
||||
}
|
||||
|
||||
.assistant-tab.active {
|
||||
background: var(--surface);
|
||||
color: var(--ink);
|
||||
}
|
||||
|
||||
.assistant-tabs > .material-symbols-rounded {
|
||||
justify-self: end;
|
||||
color: var(--ink-tertiary);
|
||||
}
|
||||
|
||||
.keyboard-keys {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(10, 1fr);
|
||||
gap: 7px;
|
||||
padding: clamp(42px, 6vw, 80px) 18px 20px;
|
||||
}
|
||||
|
||||
.keyboard-keys span {
|
||||
display: grid;
|
||||
min-width: 0;
|
||||
height: 42px;
|
||||
border-bottom: 2px solid var(--line-strong);
|
||||
color: var(--ink-secondary);
|
||||
font-size: 0.75rem;
|
||||
place-items: center;
|
||||
}
|
||||
|
||||
.keyboard-keys span:nth-child(n + 11) {
|
||||
transform: translateX(50%);
|
||||
}
|
||||
|
||||
.assistant-controls {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto 1fr;
|
||||
align-items: center;
|
||||
margin-top: auto;
|
||||
padding: 22px 24px 26px;
|
||||
border-top: 1px solid var(--line);
|
||||
}
|
||||
|
||||
.round-control,
|
||||
.mic-control {
|
||||
display: grid;
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
border-radius: 50%;
|
||||
background: var(--surface);
|
||||
color: var(--ink-secondary);
|
||||
place-items: center;
|
||||
}
|
||||
|
||||
.round-control:last-child {
|
||||
justify-self: end;
|
||||
}
|
||||
|
||||
.mic-control {
|
||||
width: 58px;
|
||||
height: 58px;
|
||||
background: var(--accent);
|
||||
color: #fff;
|
||||
box-shadow: 0 10px 24px color-mix(in srgb, var(--accent) 26%, transparent);
|
||||
backdrop-filter: blur(12px);
|
||||
-webkit-backdrop-filter: blur(12px);
|
||||
}
|
||||
|
||||
.gesture-grid {
|
||||
@@ -1417,29 +1335,28 @@ html[data-theme="dark"] .privacy-section {
|
||||
|
||||
.platform-symbol {
|
||||
display: grid;
|
||||
width: 110px;
|
||||
height: 150px;
|
||||
width: 104px;
|
||||
height: 104px;
|
||||
align-self: start;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 28px;
|
||||
border-radius: 24px;
|
||||
background: var(--surface-soft);
|
||||
color: var(--ink-secondary);
|
||||
place-items: center;
|
||||
}
|
||||
|
||||
.platform-symbol .material-symbols-rounded {
|
||||
font-size: 42px;
|
||||
.platform-symbol svg {
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
fill: none;
|
||||
stroke: currentColor;
|
||||
stroke-linecap: round;
|
||||
stroke-linejoin: round;
|
||||
stroke-width: 2.6;
|
||||
}
|
||||
|
||||
.mac-symbol {
|
||||
width: 116px;
|
||||
height: 96px;
|
||||
border-radius: 18px;
|
||||
}
|
||||
|
||||
.option-key {
|
||||
font-size: 2.4rem;
|
||||
font-weight: 500;
|
||||
border-radius: 24px;
|
||||
}
|
||||
|
||||
.platform-stories h3 {
|
||||
@@ -1795,10 +1712,6 @@ html[data-lang="zh"] .download-panel h2 {
|
||||
border-bottom: 1px solid var(--line);
|
||||
}
|
||||
|
||||
.keyboard-demo {
|
||||
min-height: 430px;
|
||||
}
|
||||
|
||||
.scene-copy {
|
||||
max-width: 690px;
|
||||
}
|
||||
@@ -1926,7 +1839,7 @@ html[data-lang="zh"] .download-panel h2 {
|
||||
font-size: clamp(2rem, 9vw, 2.2rem);
|
||||
}
|
||||
|
||||
.hero h1 > span {
|
||||
html[data-lang="zh"] .hero h1 > span {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
@@ -1987,30 +1900,6 @@ html[data-lang="zh"] .download-panel h2 {
|
||||
padding: 18px;
|
||||
}
|
||||
|
||||
.keyboard-demo {
|
||||
min-height: 360px;
|
||||
}
|
||||
|
||||
.assistant-tabs {
|
||||
grid-template-columns: 42px repeat(3, auto) 1fr;
|
||||
gap: 3px;
|
||||
padding: 13px 10px;
|
||||
}
|
||||
|
||||
.assistant-tab {
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
.keyboard-keys {
|
||||
gap: 4px;
|
||||
padding: 45px 10px 16px;
|
||||
}
|
||||
|
||||
.keyboard-keys span {
|
||||
height: 36px;
|
||||
font-size: 0.65rem;
|
||||
}
|
||||
|
||||
.gesture-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
@@ -2094,14 +1983,18 @@ html[data-lang="zh"] .download-panel h2 {
|
||||
}
|
||||
|
||||
.platform-symbol {
|
||||
width: 92px;
|
||||
height: 122px;
|
||||
border-radius: 23px;
|
||||
width: 88px;
|
||||
height: 88px;
|
||||
border-radius: 21px;
|
||||
}
|
||||
|
||||
.mac-symbol {
|
||||
height: 76px;
|
||||
border-radius: 16px;
|
||||
border-radius: 21px;
|
||||
}
|
||||
|
||||
.platform-symbol svg {
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
}
|
||||
|
||||
.setup-steps {
|
||||
|
||||
+13
-3
@@ -58,15 +58,20 @@
|
||||
element.setAttribute("content", element.dataset[`${lang}Content`] || "");
|
||||
});
|
||||
|
||||
document.querySelectorAll("[data-shot]").forEach((image) => {
|
||||
const theme = root.dataset.theme || "light";
|
||||
image.src = `assets/screenshots/${lang}/${theme}/${image.dataset.shot}`;
|
||||
});
|
||||
|
||||
document.title = lang === "zh"
|
||||
? "OSGKeyboard — 语音、打字与 AI 助手键盘"
|
||||
: "OSGKeyboard — Voice, typing, and an AI assistant keyboard";
|
||||
? "OSGKeyboard — 语音输入、中英打字与 AI 助手"
|
||||
: "OSGKeyboard — Voice input, bilingual typing, and an AI assistant";
|
||||
|
||||
if (languageButton) {
|
||||
languageButton.textContent = lang === "zh" ? "EN" : "中文";
|
||||
languageButton.setAttribute(
|
||||
"aria-label",
|
||||
lang === "zh" ? "Switch to English" : "切换到中文"
|
||||
lang === "zh" ? "切换到英文" : "Switch to Chinese"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -131,6 +136,11 @@
|
||||
|
||||
themeColor?.setAttribute("content", resolved === "dark" ? "#0c0e0f" : "#eef2f6");
|
||||
|
||||
document.querySelectorAll("[data-shot]").forEach((image) => {
|
||||
const lang = root.dataset.lang || "zh";
|
||||
image.src = `assets/screenshots/${lang}/${resolved}/${image.dataset.shot}`;
|
||||
});
|
||||
|
||||
if (persist) localStorage.setItem("osg-site-theme", resolved);
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 74 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 63 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 61 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 54 KiB |
+149
-141
@@ -3,12 +3,12 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||
<title>OSGKeyboard — 语音、打字与 AI 助手键盘</title>
|
||||
<title>OSGKeyboard — 语音输入、中英打字与 AI 助手</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="OSGKeyboard 是适用于 iPhone、iPad 和 Mac 的语音输入工具。iOS 键盘集成语音听写、中英打字、AI 助手、剪贴板技能与可选托管积分;默认使用端侧识别。"
|
||||
data-zh-content="OSGKeyboard 是适用于 iPhone、iPad 和 Mac 的语音输入工具。iOS 键盘集成语音听写、中英打字、AI 助手、剪贴板技能与可选托管积分;默认使用端侧识别。"
|
||||
data-en-content="OSGKeyboard brings voice input to iPhone, iPad, and Mac. Its iOS keyboard combines dictation, Chinese and English typing, an AI assistant, clipboard skills, and optional managed credits—with on-device recognition by default."
|
||||
content="OSGKeyboard 是一款适用于 iPhone、iPad 和 Mac 的语音与双语输入工具。iOS、iPadOS 版集成听写、中英输入、AI 助手、剪贴板技能和可选的托管积分服务,并默认使用端侧语音识别。"
|
||||
data-zh-content="OSGKeyboard 是一款适用于 iPhone、iPad 和 Mac 的语音与双语输入工具。iOS、iPadOS 版集成听写、中英输入、AI 助手、剪贴板技能和可选的托管积分服务,并默认使用端侧语音识别。"
|
||||
data-en-content="OSGKeyboard brings voice and bilingual input to iPhone, iPad, and Mac. Its custom keyboard for iOS and iPadOS combines dictation, Chinese and English typing, an AI assistant, clipboard skills, and optional managed credits—with on-device recognition by default."
|
||||
>
|
||||
<meta name="robots" content="index, follow">
|
||||
<meta name="theme-color" content="#eef2f6">
|
||||
@@ -25,13 +25,13 @@
|
||||
property="og:title"
|
||||
content="OSGKeyboard — 开口即文字"
|
||||
data-zh-content="OSGKeyboard — 开口即文字"
|
||||
data-en-content="OSGKeyboard — Speak it. It's typed."
|
||||
data-en-content="OSGKeyboard — Say it. It’s typed."
|
||||
>
|
||||
<meta
|
||||
property="og:description"
|
||||
content="一个键盘,完成听写、中英打字、AI 问答与剪贴板技能。默认端侧识别,也支持 BYOK 和可选托管积分。"
|
||||
data-zh-content="一个键盘,完成听写、中英打字、AI 问答与剪贴板技能。默认端侧识别,也支持 BYOK 和可选托管积分。"
|
||||
data-en-content="One keyboard for dictation, Chinese and English typing, AI answers, and clipboard skills. On-device by default, with BYOK and optional managed credits."
|
||||
content="用一把键盘完成听写、中英输入、AI 问答和剪贴板技能。默认使用端侧识别,也可配置自己的 API 密钥或使用托管积分服务。"
|
||||
data-zh-content="用一把键盘完成听写、中英输入、AI 问答和剪贴板技能。默认使用端侧识别,也可配置自己的 API 密钥或使用托管积分服务。"
|
||||
data-en-content="One keyboard for dictation, Chinese and English typing, AI answers, and clipboard skills. On-device by default, with your own API key or optional managed credits."
|
||||
>
|
||||
<meta property="og:image" content="https://hkgood.github.io/OSGKeyboard/assets/app-icon.png">
|
||||
<meta name="twitter:card" content="summary">
|
||||
@@ -56,7 +56,7 @@
|
||||
"operatingSystem": "iOS 26, iPadOS 26, macOS 15",
|
||||
"applicationCategory": "UtilitiesApplication",
|
||||
"softwareVersion": "2.0.0",
|
||||
"description": "A source-available voice and typing keyboard with on-device speech recognition by default, Chinese and English typing, an AI assistant, clipboard skills, BYOK providers, and optional managed credits.",
|
||||
"description": "A source-available voice and typing keyboard with on-device speech recognition by default, Chinese and English typing, an AI assistant, clipboard skills, providers configured with your own API key, and optional managed credits.",
|
||||
"downloadUrl": "https://apps.apple.com/app/osgkeyboard/id6781553267",
|
||||
"url": "https://hkgood.github.io/OSGKeyboard/",
|
||||
"offers": {
|
||||
@@ -71,8 +71,8 @@
|
||||
"Unified dictation and AI assistant keyboard",
|
||||
"Clipboard history and AI skills",
|
||||
"Voice editing of the last verified insertion",
|
||||
"Optional Sign in with Apple and managed credits on iOS",
|
||||
"Bring-your-own-key cloud speech and AI",
|
||||
"Optional Sign in with Apple and managed credits on iOS and iPadOS",
|
||||
"Cloud speech and AI with your own API key",
|
||||
"Mac Option-key global dictation with local Qwen3 MLX on Apple Silicon",
|
||||
"Personal dictionary and optional iCloud sync"
|
||||
],
|
||||
@@ -86,7 +86,7 @@
|
||||
"name": "Does OSGKeyboard require an account?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "No account is required for local dictation or providers you configure yourself. Sign in with Apple is optional and is used for managed credits, purchases, and referrals."
|
||||
"text": "You do not need an OSG account for on-device dictation or when using providers you configure yourself. Sign in with Apple is optional and is used for managed credits, purchases, and referrals."
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -94,7 +94,7 @@
|
||||
"name": "Does OSGKeyboard upload recordings?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Local recognition keeps audio on the device. Audio leaves the device only after you explicitly choose a user-configured cloud engine or the managed-credit cloud path."
|
||||
"text": "On-device recognition keeps audio on your device. Audio leaves it only when you explicitly choose a cloud speech-recognition provider configured with your own API key or cloud recognition paid for with managed credits."
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -102,7 +102,7 @@
|
||||
"name": "Is OSGKeyboard open source?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "The code is source available for audit and personal, non-commercial local use. It is not an open-source or MIT license."
|
||||
"text": "The code is source available under a non-open-source license for audit and personal, non-commercial local use; it is not licensed under the MIT License."
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -120,7 +120,7 @@
|
||||
>跳到主要内容</a>
|
||||
|
||||
<header class="site-nav">
|
||||
<nav class="nav-shell" aria-label="Primary">
|
||||
<nav class="nav-shell" aria-label="主导航" data-zh-label="主导航" data-en-label="Primary navigation">
|
||||
<a class="brand" href="#top" aria-label="OSGKeyboard">
|
||||
<img src="assets/app-icon.png" width="30" height="30" alt="">
|
||||
<span>OSGKeyboard</span>
|
||||
@@ -144,13 +144,13 @@
|
||||
>
|
||||
<span class="material-symbols-rounded" aria-hidden="true">menu</span>
|
||||
</button>
|
||||
<button class="language-button" id="languageToggle" type="button" aria-label="Switch to English">EN</button>
|
||||
<button class="language-button" id="languageToggle" type="button" aria-label="切换到英文">EN</button>
|
||||
<button class="icon-button" id="themeToggle" type="button" aria-label="切换到深色模式">
|
||||
<span class="material-symbols-rounded" aria-hidden="true">dark_mode</span>
|
||||
</button>
|
||||
</div>
|
||||
</nav>
|
||||
<nav class="mobile-nav" id="mobileNav" aria-label="Mobile" hidden>
|
||||
<nav class="mobile-nav" id="mobileNav" aria-label="移动端导航" data-zh-label="移动端导航" data-en-label="Mobile navigation" hidden>
|
||||
<a href="#assistant" data-zh="体验" data-en="Experience">体验</a>
|
||||
<a href="#typing" data-zh="输入" data-en="Typing">输入</a>
|
||||
<a href="#privacy" data-zh="隐私" data-en="Privacy">隐私</a>
|
||||
@@ -165,19 +165,19 @@
|
||||
<div class="hero-inner">
|
||||
<p class="launch-pill">
|
||||
<span class="launch-dot" aria-hidden="true"></span>
|
||||
<span data-zh="OSGKeyboard 2.0 · 为 iOS 26 而生" data-en="OSGKeyboard 2.0 · Built for iOS 26">
|
||||
OSGKeyboard 2.0 · 为 iOS 26 而生
|
||||
<span data-zh="OSGKeyboard 2.0 · 适配 iOS / iPadOS 26" data-en="OSGKeyboard 2.0 · Built for iOS and iPadOS 26">
|
||||
OSGKeyboard 2.0 · 适配 iOS / iPadOS 26
|
||||
</span>
|
||||
</p>
|
||||
<h1>
|
||||
<span data-zh="声音,直达输入框。" data-en="From voice to text.">声音,直达输入框。</span>
|
||||
<span class="hero-muted" data-zh="不用离开正在做的事。" data-en="Right where you type.">不用离开正在做的事。</span>
|
||||
<span data-zh="开口,文字直达输入框。" data-en="From voice to text.">开口,文字直达输入框。</span>
|
||||
<span class="hero-muted" data-zh="无需离开当前 App。" data-en="Without leaving your current app.">无需离开当前 App。</span>
|
||||
</h1>
|
||||
<p
|
||||
class="hero-copy"
|
||||
data-zh="在任意 App 里听写、打字、提问和编辑。OSGKeyboard 把语音识别、中英输入与 AI 助手放进同一个键盘。"
|
||||
data-en="Dictate, type, ask, and edit in any app. OSGKeyboard brings voice recognition, bilingual typing, and an AI assistant into one keyboard."
|
||||
>在任意 App 里听写、打字、提问和编辑。OSGKeyboard 把语音识别、中英输入与 AI 助手放进同一个键盘。</p>
|
||||
data-zh="在支持第三方键盘的输入框里听写、打字、提问和编辑。OSGKeyboard 把语音识别、中英输入与 AI 助手放进同一个键盘。"
|
||||
data-en="Dictate, type, ask, and edit in text fields that support custom keyboards. OSGKeyboard brings voice recognition, bilingual typing, and an AI assistant into one keyboard."
|
||||
>在支持第三方键盘的输入框里听写、打字、提问和编辑。OSGKeyboard 把语音识别、中英输入与 AI 助手放进同一个键盘。</p>
|
||||
<div class="hero-actions">
|
||||
<a
|
||||
class="store-badge"
|
||||
@@ -190,9 +190,9 @@
|
||||
src="assets/badges/ios-zh.svg"
|
||||
data-zh-src="assets/badges/ios-zh.svg"
|
||||
data-en-src="assets/badges/ios-en.svg"
|
||||
data-zh-alt="立即下载 App Store 版"
|
||||
data-zh-alt="在 App Store 下载 OSGKeyboard"
|
||||
data-en-alt="Download on the App Store"
|
||||
alt="立即下载 App Store 版"
|
||||
alt="在 App Store 下载 OSGKeyboard"
|
||||
width="171"
|
||||
height="48"
|
||||
>
|
||||
@@ -207,10 +207,16 @@
|
||||
<p
|
||||
class="hero-note"
|
||||
data-zh="iOS / iPadOS 26+ · 核心功能无需 OSG 账号 · 默认端侧识别"
|
||||
data-en="iOS / iPadOS 26+ · No OSG account for core features · On-device by default"
|
||||
data-en="iOS and iPadOS 26+ · No OSG account required for core features · On-device recognition by default"
|
||||
>iOS / iPadOS 26+ · 核心功能无需 OSG 账号 · 默认端侧识别</p>
|
||||
</div>
|
||||
<a class="scroll-cue" href="#assistant" aria-label="Explore">
|
||||
<a
|
||||
class="scroll-cue"
|
||||
href="#assistant"
|
||||
aria-label="看看它如何工作"
|
||||
data-zh-label="看看它如何工作"
|
||||
data-en-label="See how it works"
|
||||
>
|
||||
<span data-zh="看看它如何工作" data-en="See how it works">看看它如何工作</span>
|
||||
<span class="material-symbols-rounded" aria-hidden="true">south</span>
|
||||
</a>
|
||||
@@ -220,18 +226,18 @@
|
||||
<section class="section product-section" id="assistant">
|
||||
<div class="section-inner">
|
||||
<div class="center-heading">
|
||||
<p class="eyebrow" data-zh="统一助手键盘" data-en="Unified assistant keyboard">统一助手键盘</p>
|
||||
<h2 data-zh="一句话,从想法直接到输入框。" data-en="One thought. Ready to use where you are.">一句话,从想法直接到输入框。</h2>
|
||||
<p class="eyebrow" data-zh="语音与 AI 助手" data-en="Voice and AI assistant">语音与 AI 助手</p>
|
||||
<h2 data-zh="说出想法,预览后再插入。" data-en="Speak your thought, preview the result, then insert it.">说出想法,预览后再插入。</h2>
|
||||
<p
|
||||
data-zh="轻点麦克风开始听写,长按直接向 AI 提问。结果先显示、后插入,让每一步都可见、可控。"
|
||||
data-en="Tap the microphone to dictate, or hold it to ask AI. Results appear before insertion, so every step stays visible and under your control."
|
||||
>轻点麦克风开始听写,长按直接向 AI 提问。结果先显示、后插入,让每一步都可见、可控。</p>
|
||||
data-zh="轻点麦克风开始听写,长按直接向 AI 提问。结果会先供你预览,确认后再插入,让每一步都清晰可控。"
|
||||
data-en="Tap the microphone to dictate, or hold it to ask AI. Preview the result before inserting it, so every step stays clear and under your control."
|
||||
>轻点麦克风开始听写,长按直接向 AI 提问。结果会先供你预览,确认后再插入,让每一步都清晰可控。</p>
|
||||
</div>
|
||||
|
||||
<div class="product-stage">
|
||||
<div class="stage-bar">
|
||||
<span class="stage-dots" aria-hidden="true"><i></i><i></i><i></i></span>
|
||||
<span data-zh="任意 App · 功能示意" data-en="Any app · Product illustration">任意 App · 功能示意</span>
|
||||
<span data-zh="支持第三方键盘的 App · 交互示意与实机画面" data-en="App with custom-keyboard support · Interaction illustration and real keyboard screenshot">支持第三方键盘的 App · 交互示意与实机画面</span>
|
||||
<span class="stage-status" data-zh="本地优先" data-en="Local first">本地优先</span>
|
||||
</div>
|
||||
<div class="stage-content">
|
||||
@@ -245,30 +251,27 @@
|
||||
<div class="insert-preview">
|
||||
<span class="preview-kicker" data-zh="准备插入" data-en="Ready to insert">准备插入</span>
|
||||
<p
|
||||
data-zh="内容已经整理得更清楚,同时保留了原本的表达方式。"
|
||||
data-zh="已理清内容,同时保留原有语气。"
|
||||
data-en="The message is clearer while preserving your original tone."
|
||||
>内容已经整理得更清楚,同时保留了原本的表达方式。</p>
|
||||
>已理清内容,同时保留原有语气。</p>
|
||||
<span class="text-cursor" aria-hidden="true"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="keyboard-demo" aria-hidden="true">
|
||||
<div class="assistant-tabs">
|
||||
<span class="assistant-logo">OSG</span>
|
||||
<span class="assistant-tab active" data-zh="助手" data-en="Assistant">助手</span>
|
||||
<span class="assistant-tab">中文</span>
|
||||
<span class="assistant-tab">EN</span>
|
||||
<span class="material-symbols-rounded">more_horiz</span>
|
||||
</div>
|
||||
<div class="keyboard-keys">
|
||||
<span>Q</span><span>W</span><span>E</span><span>R</span><span>T</span><span>Y</span><span>U</span><span>I</span><span>O</span><span>P</span>
|
||||
<span>A</span><span>S</span><span>D</span><span>F</span><span>G</span><span>H</span><span>J</span><span>K</span><span>L</span>
|
||||
</div>
|
||||
<div class="assistant-controls">
|
||||
<span class="round-control"><span class="material-symbols-rounded">undo</span></span>
|
||||
<span class="mic-control"><span class="material-symbols-rounded">mic</span></span>
|
||||
<span class="round-control"><span class="material-symbols-rounded">arrow_upward</span></span>
|
||||
</div>
|
||||
</div>
|
||||
<figure
|
||||
class="keyboard-capture"
|
||||
aria-label="OSGKeyboard 自定义键盘实机画面"
|
||||
data-zh-label="OSGKeyboard 自定义键盘实机画面"
|
||||
data-en-label="Actual OSGKeyboard custom keyboard"
|
||||
>
|
||||
<img
|
||||
src="assets/screenshots/zh/light/iphone-keyboard_recording.png"
|
||||
data-shot="iphone-keyboard_recording.png"
|
||||
data-zh-alt="OSGKeyboard 在 iPhone 输入框中进行语音输入"
|
||||
data-en-alt="OSGKeyboard dictating into an iPhone text field"
|
||||
alt="OSGKeyboard 在 iPhone 输入框中进行语音输入"
|
||||
>
|
||||
<figcaption data-zh="iPhone 实机键盘画面" data-en="Actual OSGKeyboard on iPhone">iPhone 实机键盘画面</figcaption>
|
||||
</figure>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -276,20 +279,20 @@
|
||||
<article>
|
||||
<span class="gesture-number">01</span>
|
||||
<span class="material-symbols-rounded" aria-hidden="true">mic</span>
|
||||
<h3 data-zh="说出意图" data-en="Express intent">说出意图</h3>
|
||||
<h3 data-zh="说出需求" data-en="Say what you need">说出需求</h3>
|
||||
<p data-zh="轻点听写,长按提问。" data-en="Tap to dictate, hold to ask.">轻点听写,长按提问。</p>
|
||||
</article>
|
||||
<article>
|
||||
<span class="gesture-number">02</span>
|
||||
<span class="material-symbols-rounded" aria-hidden="true">auto_fix_high</span>
|
||||
<h3 data-zh="理解并处理" data-en="Understand and process">理解并处理</h3>
|
||||
<p data-zh="润色、问答或编辑上次输入。" data-en="Polish, answer, or edit the last input.">润色、问答或编辑上次输入。</p>
|
||||
<p data-zh="润色文字、回答问题,或修改上次输入。" data-en="Polish text, answer a question, or revise the last input.">润色文字、回答问题,或修改上次输入。</p>
|
||||
</article>
|
||||
<article>
|
||||
<span class="gesture-number">03</span>
|
||||
<span class="material-symbols-rounded" aria-hidden="true">text_fields</span>
|
||||
<h3 data-zh="确认后插入" data-en="Preview, then insert">确认后插入</h3>
|
||||
<p data-zh="只有光标和上下文匹配时才自动上屏。" data-en="Auto-insert only when cursor context still matches.">只有光标和上下文匹配时才自动上屏。</p>
|
||||
<p data-zh="仅当光标位置和输入上下文未变化时,才会自动插入。" data-en="Auto-insert only if the cursor position and surrounding context have not changed.">仅当光标位置和输入上下文未变化时,才会自动插入。</p>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
@@ -302,29 +305,29 @@
|
||||
<p class="eyebrow" data-zh="语音输入" data-en="Voice input">语音输入</p>
|
||||
<h2 data-zh="开口即文字,不打断思路。" data-en="Speak naturally. Keep your train of thought.">开口即文字,不打断思路。</h2>
|
||||
<p
|
||||
data-zh="本地识别可以直接开始。热词、个人词典与上下文补偿,让名字、术语和常用表达更准确。"
|
||||
data-en="Start immediately with local recognition. Hotwords, a personal dictionary, and context compensation improve names, terminology, and phrases you use often."
|
||||
>本地识别可以直接开始。热词、个人词典与上下文补偿,让名字、术语和常用表达更准确。</p>
|
||||
data-zh="完成系统授权后即可使用端侧识别。个人词典与上下文词语提示有助于提高名字、术语和常用表达的识别准确率。"
|
||||
data-en="Start with on-device recognition—no account or cloud setup required. Hotwords, a personal dictionary, and contextual corrections improve recognition of names, terminology, and phrases you use often."
|
||||
>完成系统授权后即可使用端侧识别。个人词典与上下文词语提示有助于提高名字、术语和常用表达的识别准确率。</p>
|
||||
<ul class="quiet-list">
|
||||
<li data-zh="默认使用 Apple 端侧语音识别" data-en="Apple on-device recognition by default">默认使用 Apple 端侧语音识别</li>
|
||||
<li data-zh="云端识别和 AI 润色始终由你选择" data-en="Cloud recognition and AI polish are always your choice">云端识别和 AI 润色始终由你选择</li>
|
||||
<li data-zh="可用语音重写上一次已验证输入" data-en="Rewrite the last verified insertion by voice">可用语音重写上一次已验证输入</li>
|
||||
<li data-zh="云端识别与 AI 润色均为可选" data-en="Cloud recognition and AI polishing are always optional">云端识别与 AI 润色均为可选</li>
|
||||
<li data-zh="可用语音修改最近一次由 OSGKeyboard 插入的文字" data-en="Revise the most recent text inserted by OSGKeyboard using your voice">可用语音修改最近一次由 OSGKeyboard 插入的文字</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="voice-stage">
|
||||
<div class="voice-meta">
|
||||
<span data-zh="本地 · Apple 语音识别" data-en="Local · Apple Speech">本地 · Apple 语音识别</span>
|
||||
<span data-zh="端侧 · Apple 语音识别" data-en="On-device · Apple Speech Recognition">端侧 · Apple 语音识别</span>
|
||||
<span class="live-indicator"><i></i><span data-zh="听写中" data-en="Listening">听写中</span></span>
|
||||
</div>
|
||||
<div class="transcript-card">
|
||||
<span class="transcript-before" data-zh="今天下午把新版本上线计划" data-en="This afternoon, review the launch plan">今天下午把新版本上线计划</span>
|
||||
<strong data-zh="和产品团队确认一下。" data-en="with the product team.">和产品团队确认一下。</strong>
|
||||
<span class="transcript-before" data-zh="今天下午和产品团队确认一下" data-en="This afternoon, review the launch plan">今天下午和产品团队确认一下</span>
|
||||
<strong data-zh="新版本上线计划。" data-en="with the product team.">新版本上线计划。</strong>
|
||||
</div>
|
||||
<div class="waveform" aria-hidden="true">
|
||||
<i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i>
|
||||
</div>
|
||||
<div class="voice-footer">
|
||||
<span data-zh="已识别 18 个字" data-en="18 words recognized">已识别 18 个字</span>
|
||||
<span data-zh="已识别 20 个字" data-en="10 words recognized">已识别 20 个字</span>
|
||||
<span data-zh="完成" data-en="Done">完成</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -336,12 +339,12 @@
|
||||
<div class="section-inner">
|
||||
<div class="center-heading compact">
|
||||
<p class="eyebrow" data-zh="中文与英文输入" data-en="Chinese and English typing">中文与英文输入</p>
|
||||
<h2 data-zh="不想说时,也是一把完整键盘。" data-en="A complete keyboard when you would rather type.">不想说时,也是一把完整键盘。</h2>
|
||||
<h2 data-zh="不方便说话时,也能顺手打字。" data-en="When speaking is not convenient, typing stays effortless.">不方便说话时,也能顺手打字。</h2>
|
||||
</div>
|
||||
<div class="typing-stories">
|
||||
<article class="typing-story">
|
||||
<div class="typing-visual chinese-visual">
|
||||
<span class="typing-label" data-zh="全拼 / 双拼" data-en="Full / double pinyin">全拼 / 双拼</span>
|
||||
<span class="typing-label" data-zh="全拼 / 双拼" data-en="Full pinyin / double pinyin">全拼 / 双拼</span>
|
||||
<div class="composition-row"><strong>jintian</strong><span class="text-cursor" aria-hidden="true"></span></div>
|
||||
<div class="candidate-row">
|
||||
<span class="selected">今天</span><span>今天的</span><span>近天</span><span>金田</span>
|
||||
@@ -352,11 +355,11 @@
|
||||
</div>
|
||||
<div class="story-copy">
|
||||
<span class="story-index">01</span>
|
||||
<h3 data-zh="中文输入,熟悉而完整。" data-en="Chinese typing that feels complete.">中文输入,熟悉而完整。</h3>
|
||||
<h3 data-zh="全拼、双拼,输入方式由你选。" data-en="Choose full pinyin or double pinyin.">全拼、双拼,输入方式由你选。</h3>
|
||||
<p
|
||||
data-zh="全拼、自然码、小鹤、微软与搜狗双拼;候选分页、数字选词、滑动选词与中英混输一并具备。"
|
||||
data-en="Full pinyin plus Natural Code, Xiaohe, Microsoft, and Sogou double pinyin—with candidate paging, number selection, swiping, and mixed Chinese-English input."
|
||||
>全拼、自然码、小鹤、微软与搜狗双拼;候选分页、数字选词、滑动选词与中英混输一并具备。</p>
|
||||
data-zh="支持全拼、自然码、小鹤、微软与搜狗双拼,同时提供候选分页、数字选词、滑动选词与中英混输。"
|
||||
data-en="Full pinyin plus Ziranma, Xiaohe, Microsoft, and Sogou double pinyin—with candidate paging, number selection, swiping, and mixed Chinese-English input."
|
||||
>支持全拼、自然码、小鹤、微软与搜狗双拼,同时提供候选分页、数字选词、滑动选词与中英混输。</p>
|
||||
</div>
|
||||
</article>
|
||||
<article class="typing-story reverse">
|
||||
@@ -368,11 +371,11 @@
|
||||
</div>
|
||||
<div class="story-copy">
|
||||
<span class="story-index">02</span>
|
||||
<h3 data-zh="英文输入,越用越顺手。" data-en="English typing that gets out of your way.">英文输入,越用越顺手。</h3>
|
||||
<h3 data-zh="英文输入,同样顺手。" data-en="English typing that gets out of your way.">英文输入,同样顺手。</h3>
|
||||
<p
|
||||
data-zh="前缀补全、自动纠错、下一词预测、候选撤销与句首大小写,让双语切换保持同样流畅。"
|
||||
data-zh="支持前缀补全、自动纠错、下一词预测、撤销自动纠错和句首自动大写,中英文切换也能保持流畅。"
|
||||
data-en="Prefix completion, autocorrect, next-word prediction, candidate undo, and sentence capitalization keep bilingual typing fluid."
|
||||
>前缀补全、自动纠错、下一词预测、候选撤销与句首大小写,让双语切换保持同样流畅。</p>
|
||||
>支持前缀补全、自动纠错、下一词预测、撤销自动纠错和句首自动大写,中英文切换也能保持流畅。</p>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
@@ -405,21 +408,21 @@
|
||||
</div>
|
||||
<div class="scene-copy">
|
||||
<p class="eyebrow" data-zh="剪贴板与快捷技能" data-en="Clipboard and quick skills">剪贴板与快捷技能</p>
|
||||
<h2 data-zh="复制之后,直接行动。" data-en="After copy comes action.">复制之后,直接行动。</h2>
|
||||
<h2 data-zh="复制之后,直接行动。" data-en="Copy, then take action.">复制之后,直接行动。</h2>
|
||||
<p
|
||||
data-zh="从剪贴板历史继续工作,把已有文字变成回复、总结、翻译、待办、日程或导航。所有读取都由你主动开启。"
|
||||
data-en="Continue from clipboard history and turn existing text into a reply, summary, translation, task, event, or navigation. Clipboard access remains opt-in."
|
||||
>从剪贴板历史继续工作,把已有文字变成回复、总结、翻译、待办、日程或导航。所有读取都由你主动开启。</p>
|
||||
data-zh="从剪贴板历史中选择内容,生成回复、摘要或译文,也可提取待办、日程和地址并发起导航。剪贴板访问默认关闭,仅在你主动开启后读取。"
|
||||
data-en="Use your clipboard history to draft a reply, summarize or translate text, create a task or event, or get directions. Clipboard access remains opt-in."
|
||||
>从剪贴板历史中选择内容,生成回复、摘要或译文,也可提取待办、日程和地址并发起导航。剪贴板访问默认关闭,仅在你主动开启后读取。</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="styles-strip">
|
||||
<div>
|
||||
<p class="eyebrow" data-zh="个性化润色" data-en="Personalized polish">个性化润色</p>
|
||||
<h3 data-zh="整理表达,但不要改掉你的语气。" data-en="Improve the writing without erasing your voice.">整理表达,但不要改掉你的语气。</h3>
|
||||
<h3 data-zh="表达更清楚,语气还是你的。" data-en="Improve the writing without erasing your voice.">表达更清楚,语气还是你的。</h3>
|
||||
</div>
|
||||
<div class="style-options">
|
||||
<span data-zh="轻度清理" data-en="Light cleanup">轻度清理</span>
|
||||
<span class="selected" data-zh="清晰结构" data-en="Clear structure">清晰结构</span>
|
||||
<span data-zh="轻度润色" data-en="Light polish">轻度润色</span>
|
||||
<span class="selected" data-zh="理清结构" data-en="Clarify structure">理清结构</span>
|
||||
<span data-zh="正式表达" data-en="Formal">正式表达</span>
|
||||
<span data-zh="日常聊天" data-en="Casual">日常聊天</span>
|
||||
</div>
|
||||
@@ -432,46 +435,46 @@
|
||||
<div class="section-inner">
|
||||
<div class="center-heading inverse">
|
||||
<p class="eyebrow" data-zh="隐私与选择" data-en="Privacy and choice">隐私与选择</p>
|
||||
<h2 data-zh="输入路径,由你决定。" data-en="You choose how your input is processed.">输入路径,由你决定。</h2>
|
||||
<h2 data-zh="数据如何处理,由你决定。" data-en="You choose how your data is processed.">数据如何处理,由你决定。</h2>
|
||||
<p
|
||||
data-zh="先使用本地能力。需要更强模型时,再选择自己的 API Key 或可选托管积分。路径透明,决定权始终在你。"
|
||||
data-en="Start locally. When you need a stronger model, choose your own API key or optional managed credits. The path stays explicit, and the decision stays yours."
|
||||
>先使用本地能力。需要更强模型时,再选择自己的 API Key 或可选托管积分。路径透明,决定权始终在你。</p>
|
||||
data-zh="默认优先使用端侧能力。需要云端识别或 AI 功能时,可配置自己的 API 密钥,或选择托管积分服务。每种处理方式都会清晰标示,决定权始终在你。"
|
||||
data-en="On-device processing is the default. For cloud recognition or AI features, provide your own API key or use optional managed credits. The active option is always clearly shown."
|
||||
>默认优先使用端侧能力。需要云端识别或 AI 功能时,可配置自己的 API 密钥,或选择托管积分服务。每种处理方式都会清晰标示,决定权始终在你。</p>
|
||||
</div>
|
||||
<div class="service-paths">
|
||||
<article>
|
||||
<span class="path-number">01</span>
|
||||
<span class="material-symbols-rounded" aria-hidden="true">memory</span>
|
||||
<h3 data-zh="端侧优先" data-en="On-device first">端侧优先</h3>
|
||||
<p data-zh="默认 Apple 本地识别;Mac Apple Silicon 还可使用 Qwen3 MLX。" data-en="Apple local recognition by default; Qwen3 MLX is also available on Apple Silicon Macs.">
|
||||
默认 Apple 本地识别;Mac Apple Silicon 还可使用 Qwen3 MLX。
|
||||
<p data-zh="iOS、iPadOS 默认使用 Apple 设备端语音识别;搭载 Apple 芯片的 Mac 默认使用 Qwen3 MLX,Apple 语音识别作为备用方案。" data-en="iOS and iPadOS use Apple on-device speech recognition by default. Apple Silicon Macs use Qwen3 MLX by default, with Apple Speech Recognition as a fallback.">
|
||||
iOS、iPadOS 默认使用 Apple 设备端语音识别;搭载 Apple 芯片的 Mac 默认使用 Qwen3 MLX,Apple 语音识别作为备用方案。
|
||||
</p>
|
||||
<span class="path-note" data-zh="无需账号 · 音频留在设备" data-en="No account · Audio stays on device">无需账号 · 音频留在设备</span>
|
||||
<span class="path-note" data-zh="无需 OSG 账号 · 音频留在设备" data-en="No OSG account required · Audio stays on device">无需 OSG 账号 · 音频留在设备</span>
|
||||
</article>
|
||||
<article>
|
||||
<span class="path-number">02</span>
|
||||
<span class="material-symbols-rounded" aria-hidden="true">key</span>
|
||||
<h3 data-zh="自备 API Key" data-en="Bring your own key">自备 API Key</h3>
|
||||
<p data-zh="连接你选择的语音或 AI 服务商。凭证保存在 Keychain。" data-en="Connect the speech or AI provider you choose. Credentials stay in Keychain.">
|
||||
连接你选择的语音或 AI 服务商。凭证保存在 Keychain。
|
||||
<h3 data-zh="使用自己的 API 密钥" data-en="Use your own API key">使用自己的 API 密钥</h3>
|
||||
<p data-zh="配置你选择的语音识别或 AI 服务商;凭证存储在系统钥匙串中。" data-en="Configure the speech-recognition or AI provider you choose. Credentials are securely stored in the system Keychain.">
|
||||
配置你选择的语音识别或 AI 服务商;凭证存储在系统钥匙串中。
|
||||
</p>
|
||||
<span class="path-note" data-zh="无需 OSG 账号 · 服务商直接处理" data-en="No OSG account · Provider processes directly">无需 OSG 账号 · 服务商直接处理</span>
|
||||
<span class="path-note" data-zh="无需 OSG 账号 · 请求直达所选服务商" data-en="No OSG account required · Requests go directly to your provider">无需 OSG 账号 · 请求直达所选服务商</span>
|
||||
</article>
|
||||
<article>
|
||||
<span class="path-number">03</span>
|
||||
<span class="material-symbols-rounded" aria-hidden="true">toll</span>
|
||||
<h3 data-zh="托管积分" data-en="Managed credits">托管积分</h3>
|
||||
<p data-zh="iOS / iPadOS 可选 Apple 登录与积分服务,无需自行管理 Key。" data-en="Optional Sign in with Apple and managed credits on iOS / iPadOS, with no key to manage.">
|
||||
iOS / iPadOS 可选 Apple 登录与积分服务,无需自行管理 Key。
|
||||
<p data-zh="在 iOS、iPadOS 上,可通过 Apple 登录使用托管积分服务,无需自行管理 API 密钥。" data-en="On iOS and iPadOS, you can optionally use Sign in with Apple and managed credits without managing an API key.">
|
||||
在 iOS、iPadOS 上,可通过 Apple 登录使用托管积分服务,无需自行管理 API 密钥。
|
||||
</p>
|
||||
<span class="path-note" data-zh="明确同意后使用 · 可注销账号" data-en="Explicit opt-in · Account deletion available">明确同意后使用 · 可注销账号</span>
|
||||
<span class="path-note" data-zh="主动选择后启用 · 可注销账号" data-en="Explicit opt-in · Account deletion available">主动选择后启用 · 可注销账号</span>
|
||||
</article>
|
||||
</div>
|
||||
<div class="privacy-proof">
|
||||
<div>
|
||||
<span class="material-symbols-rounded" aria-hidden="true">shield_lock</span>
|
||||
<h3 data-zh="普通击键不采集,剪贴板需主动开启。" data-en="No ordinary keystroke collection. Clipboard access is opt-in.">
|
||||
普通击键不采集,剪贴板需主动开启。
|
||||
<h3 data-zh="不会采集日常键入内容;剪贴板访问需由你主动开启。" data-en="We do not collect what you type during normal keyboard use. Clipboard access is opt-in.">
|
||||
不会采集日常键入内容;剪贴板访问需由你主动开启。
|
||||
</h3>
|
||||
</div>
|
||||
<a class="inverse-link" href="privacy/">
|
||||
@@ -487,16 +490,19 @@
|
||||
<div class="section-inner">
|
||||
<div class="center-heading compact">
|
||||
<p class="eyebrow" data-zh="跨平台" data-en="Across platforms">跨平台</p>
|
||||
<h2 data-zh="在手机上输入,在 Mac 上继续。" data-en="Type on mobile. Keep going on Mac.">在手机上输入,在 Mac 上继续。</h2>
|
||||
<h2 data-zh="在 iPhone、iPad 上输入,在 Mac 上听写。" data-en="Type on iPhone and iPad. Dictate on Mac.">在 iPhone、iPad 上输入,在 Mac 上听写。</h2>
|
||||
</div>
|
||||
<div class="platform-stories">
|
||||
<article>
|
||||
<div class="platform-symbol ios-symbol" aria-hidden="true">
|
||||
<span class="material-symbols-rounded">keyboard</span>
|
||||
<svg viewBox="0 0 48 48" focusable="false">
|
||||
<rect x="8" y="5" width="32" height="38" rx="7"></rect>
|
||||
<path d="M15 17h3m5 0h3m5 0h3M15 23h3m5 0h3m5 0h3M15 29h18M20 36h8"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<div>
|
||||
<span class="platform-label">iOS / iPadOS 26+</span>
|
||||
<h3 data-zh="系统键盘里的完整输入工作区" data-en="A complete input workspace in the system keyboard">系统键盘里的完整输入工作区</h3>
|
||||
<h3 data-zh="一把键盘,覆盖完整输入流程" data-en="A complete input workspace in a custom keyboard">一把键盘,覆盖完整输入流程</h3>
|
||||
<p data-zh="听写、AI 助手、中文与英文输入、剪贴板技能、个人词典和可选 iCloud 同步。" data-en="Dictation, AI assistant, Chinese and English typing, clipboard skills, personal dictionary, and optional iCloud sync.">
|
||||
听写、AI 助手、中文与英文输入、剪贴板技能、个人词典和可选 iCloud 同步。
|
||||
</p>
|
||||
@@ -504,20 +510,22 @@
|
||||
</article>
|
||||
<article>
|
||||
<div class="platform-symbol mac-symbol" aria-hidden="true">
|
||||
<span class="option-key">⌥</span>
|
||||
<svg viewBox="0 0 48 48" focusable="false">
|
||||
<path d="M7 10h11l17 28h6M26 10h15"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<div>
|
||||
<span class="platform-label">macOS 15+</span>
|
||||
<h3 data-zh="按住 Option,在任何位置开始听写" data-en="Hold Option to dictate anywhere">按住 Option,在任何位置开始听写</h3>
|
||||
<p data-zh="全局热键、底部实时浮层、Apple Speech 回退,以及 Apple Silicon 上的 Qwen3 MLX 本地模型。" data-en="Global hotkey, live bottom overlay, Apple Speech fallback, and a local Qwen3 MLX model on Apple Silicon.">
|
||||
全局热键、底部实时浮层、Apple Speech 回退,以及 Apple Silicon 上的 Qwen3 MLX 本地模型。
|
||||
<h3 data-zh="按住 Option 键,在支持文本输入的位置,开始听写" data-en="Hold Option to start dictation where text input is supported">按住 Option 键,在支持文本输入的位置,开始听写</h3>
|
||||
<p data-zh="支持 Option 全局热键和屏幕底部的实时听写浮窗;搭载 Apple 芯片的 Mac 使用 Qwen3 MLX 本地模型,并以 Apple 语音识别作为备用方案。" data-en="Use the Option hotkey and a live dictation overlay at the bottom of the screen. Apple Silicon Macs use a local Qwen3 MLX model, with Apple Speech Recognition as a fallback.">
|
||||
支持 Option 全局热键和屏幕底部的实时听写浮窗;搭载 Apple 芯片的 Mac 使用 Qwen3 MLX 本地模型,并以 Apple 语音识别作为备用方案。
|
||||
</p>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
<p class="platform-footnote">
|
||||
<span data-zh="公开 Mac DMG 仍为历史版 1.1;最新 Mac 2.0 能力可从源码构建。" data-en="The public Mac DMG remains historical version 1.1; build from source for the latest Mac 2.0 capabilities.">
|
||||
公开 Mac DMG 仍为历史版 1.1;最新 Mac 2.0 能力可从源码构建。
|
||||
<span data-zh="目前公开下载的 Mac 安装包(DMG)仍为 1.1 历史版本;如需 Mac 2.0.0 的最新功能,请从源码构建。" data-en="The publicly available Mac DMG is still version 1.1; build from source to use the latest Mac 2.0.0 capabilities.">
|
||||
目前公开下载的 Mac 安装包(DMG)仍为 1.1 历史版本;如需 Mac 2.0.0 的最新功能,请从源码构建。
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
@@ -529,29 +537,29 @@
|
||||
<div class="split-heading">
|
||||
<div>
|
||||
<p class="eyebrow" data-zh="开始使用" data-en="Get started">开始使用</p>
|
||||
<h2 data-zh="两分钟,让声音进入键盘。" data-en="Put your voice in the keyboard in two minutes.">两分钟,让声音进入键盘。</h2>
|
||||
<h2 data-zh="完成设置,开始语音输入。" data-en="Complete setup and start dictating.">完成设置,开始语音输入。</h2>
|
||||
</div>
|
||||
<p data-zh="本地路径可以直接开始。只有在选择云端能力时,才需要进一步配置。" data-en="The local path works immediately. Additional setup is needed only when you choose cloud capabilities.">
|
||||
本地路径可以直接开始。只有在选择云端能力时,才需要进一步配置。
|
||||
<p data-zh="完成系统授权后即可使用端侧识别;只有选择云端识别或 AI 功能时,才需额外配置。" data-en="After granting the required system permissions, you can use on-device recognition. Additional setup is needed only for cloud recognition or AI features.">
|
||||
完成系统授权后即可使用端侧识别;只有选择云端识别或 AI 功能时,才需额外配置。
|
||||
</p>
|
||||
</div>
|
||||
<ol class="setup-steps">
|
||||
<li>
|
||||
<h3 data-zh="安装并授权" data-en="Install and authorize">安装并授权</h3>
|
||||
<p data-zh="iOS 添加键盘并开启完全访问;Mac 授予麦克风与辅助功能权限。" data-en="Add the keyboard and enable Full Access on iOS; grant microphone and Accessibility permissions on Mac.">
|
||||
iOS 添加键盘并开启完全访问;Mac 授予麦克风与辅助功能权限。
|
||||
<p data-zh="在 iOS、iPadOS 上添加键盘并开启“完全访问”;在 Mac 上授予麦克风和辅助功能权限。" data-en="Add the keyboard and enable Full Access on iOS and iPadOS; grant microphone and Accessibility permissions on Mac.">
|
||||
在 iOS、iPadOS 上添加键盘并开启“完全访问”;在 Mac 上授予麦克风和辅助功能权限。
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<h3 data-zh="选择服务路径" data-en="Choose a service path">选择服务路径</h3>
|
||||
<p data-zh="直接使用本地识别,或按需添加自己的 Key、登录托管积分。" data-en="Use local recognition, add your own key, or sign in for managed credits as needed.">
|
||||
直接使用本地识别,或按需添加自己的 Key、登录托管积分。
|
||||
<h3 data-zh="选择处理方式" data-en="Choose how input is processed">选择处理方式</h3>
|
||||
<p data-zh="使用端侧识别,或按需添加自己的 API 密钥、登录后使用托管积分。" data-en="Use on-device recognition, add your own API key, or sign in to use managed credits.">
|
||||
使用端侧识别,或按需添加自己的 API 密钥、登录后使用托管积分。
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<h3 data-zh="开口或打字" data-en="Speak or type">开口或打字</h3>
|
||||
<p data-zh="轻点听写、长按提问,或切换到中文 / English 键盘。" data-en="Tap to dictate, hold to ask, or switch to Chinese / English typing.">
|
||||
轻点听写、长按提问,或切换到中文 / English 键盘。
|
||||
<p data-zh="轻点开始听写、长按进行提问,或切换到中文或英文键盘。" data-en="Tap to dictate, hold to ask, or switch between Chinese and English typing.">
|
||||
轻点开始听写、长按进行提问,或切换到中文或英文键盘。
|
||||
</p>
|
||||
</li>
|
||||
</ol>
|
||||
@@ -559,10 +567,10 @@
|
||||
<div class="stable-strip">
|
||||
<span data-zh="稳定性同样是功能" data-en="Reliability is a feature">稳定性同样是功能</span>
|
||||
<ul>
|
||||
<li data-zh="扩展冷启动保护" data-en="Extension cold-start protection">扩展冷启动保护</li>
|
||||
<li data-zh="内存压力降级" data-en="Memory-pressure fallback">内存压力降级</li>
|
||||
<li data-zh="上下文安全插入" data-en="Context-safe insertion">上下文安全插入</li>
|
||||
<li data-zh="中断后恢复" data-en="Recovery after interruption">中断后恢复</li>
|
||||
<li data-zh="键盘启动保护" data-en="Reliable keyboard startup">键盘启动保护</li>
|
||||
<li data-zh="内存不足时自动降级" data-en="Automatic fallback when memory is low">内存不足时自动降级</li>
|
||||
<li data-zh="确认输入位置后再插入" data-en="Insert only after confirming the input position">确认输入位置后再插入</li>
|
||||
<li data-zh="中断后可恢复" data-en="Recover after interruptions">中断后可恢复</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -573,37 +581,37 @@
|
||||
<div class="section-inner faq-layout">
|
||||
<div>
|
||||
<p class="eyebrow" data-zh="常见问题" data-en="FAQ">常见问题</p>
|
||||
<h2 data-zh="把重要边界说清楚。" data-en="The important boundaries, clearly stated.">把重要边界说清楚。</h2>
|
||||
<h2 data-zh="隐私和产品限制,提前说清楚。" data-en="Clear answers about privacy and product limits.">隐私和产品限制,提前说清楚。</h2>
|
||||
</div>
|
||||
<div class="faq-list">
|
||||
<details class="faq-item">
|
||||
<summary data-zh="必须注册 OSG 账号吗?" data-en="Do I need an OSG account?">必须注册 OSG 账号吗?</summary>
|
||||
<p data-zh="不需要。本地听写和自备服务商无需 OSG 账号。Apple 登录仅用于可选托管积分、购买、邀请与资料管理。" data-en="No. Local dictation and providers you configure yourself need no OSG account. Sign in with Apple is only for optional managed credits, purchases, referrals, and profile controls.">
|
||||
不需要。本地听写和自备服务商无需 OSG 账号。Apple 登录仅用于可选托管积分、购买、邀请与资料管理。
|
||||
<p data-zh="不需要。使用端侧听写或自行配置的服务商时,无需 OSG 账号。通过 Apple 登录仅用于托管积分、积分购买、邀请奖励和账号资料管理。" data-en="No. You do not need an OSG account for on-device dictation or when using providers you configure yourself. Sign in with Apple is used only for managed credits, credit purchases, referral rewards, and profile management.">
|
||||
不需要。使用端侧听写或自行配置的服务商时,无需 OSG 账号。通过 Apple 登录仅用于托管积分、积分购买、邀请奖励和账号资料管理。
|
||||
</p>
|
||||
</details>
|
||||
<details class="faq-item">
|
||||
<summary data-zh="录音会上传吗?" data-en="Does my audio get uploaded?">录音会上传吗?</summary>
|
||||
<p data-zh="默认本地识别不会上传录音。只有你明确选择自备云端识别或托管积分云端识别时,音频才会发送到对应服务路径。" data-en="Default local recognition does not upload audio. Audio leaves the device only when you explicitly select a user-configured cloud engine or managed-credit cloud recognition.">
|
||||
默认本地识别不会上传录音。只有你明确选择自备云端识别或托管积分云端识别时,音频才会发送到对应服务路径。
|
||||
<p data-zh="使用默认的端侧识别时,录音不会上传。只有你明确选择自行配置的云端识别或托管积分云端识别时,音频才会离开设备,并发送至相应云端服务进行处理。" data-en="On-device recognition does not upload your recordings. Audio leaves the device only when you explicitly choose cloud recognition configured with your own API key or cloud recognition paid for with managed credits.">
|
||||
使用默认的端侧识别时,录音不会上传。只有你明确选择自行配置的云端识别或托管积分云端识别时,音频才会离开设备,并发送至相应云端服务进行处理。
|
||||
</p>
|
||||
</details>
|
||||
<details class="faq-item">
|
||||
<summary data-zh="为什么键盘需要“完全访问”?" data-en="Why does the keyboard need Full Access?">为什么键盘需要“完全访问”?</summary>
|
||||
<p data-zh="完全访问让键盘扩展与主 App 通过 App Group 协作、读取共享 Keychain 中的用户凭证,并在你主动开启后访问剪贴板。它不代表我们会收集普通击键。" data-en="Full Access lets the keyboard work with the host app through App Group, read user credentials from the shared Keychain, and access the clipboard only after you opt in. It does not mean ordinary keystrokes are collected.">
|
||||
完全访问让键盘扩展与主 App 通过 App Group 协作、读取共享 Keychain 中的用户凭证,并在你主动开启后访问剪贴板。它不代表我们会收集普通击键。
|
||||
<p data-zh="开启“完全访问”后,键盘才能与主 App 共享设置、读取已保存的服务配置,并在你主动启用后访问剪贴板。此权限不代表 OSGKeyboard 会收集日常键入内容。" data-en="Full Access lets the keyboard share settings with the OSGKeyboard app, read saved provider configurations, and access the clipboard only after you opt in. We do not collect what you type during normal keyboard use.">
|
||||
开启“完全访问”后,键盘才能与主 App 共享设置、读取已保存的服务配置,并在你主动启用后访问剪贴板。此权限不代表 OSGKeyboard 会收集日常键入内容。
|
||||
</p>
|
||||
</details>
|
||||
<details class="faq-item">
|
||||
<summary data-zh="OSGKeyboard 是开源软件吗?" data-en="Is OSGKeyboard open source?">OSGKeyboard 是开源软件吗?</summary>
|
||||
<p data-zh="不是。项目采用源码可见许可,允许个人学习与非商用本地使用;再分发、公开衍生版本和商业使用需要获得许可。" data-en="No. It uses a source-available license for personal learning and non-commercial local use. Redistribution, public derivatives, and commercial use require permission.">
|
||||
<p data-zh="不是。项目采用源码可见许可,允许个人学习与非商用本地使用;再分发、公开衍生版本和商业使用需要获得许可。" data-en="No. It uses a source-available license for personal learning and non-commercial local use. Redistribution, public derivative versions, and commercial use require permission.">
|
||||
不是。项目采用源码可见许可,允许个人学习与非商用本地使用;再分发、公开衍生版本和商业使用需要获得许可。
|
||||
</p>
|
||||
</details>
|
||||
<details class="faq-item">
|
||||
<summary data-zh="Mac 下载为什么是 1.1?" data-en="Why is the Mac download version 1.1?">Mac 下载为什么是 1.1?</summary>
|
||||
<p data-zh="当前公开、已签名并公证的 DMG 是历史版 1.1。仓库中的 Mac target 随整体源码演进到 2.0;需要最新源码能力时可在 macOS 与 Xcode 26 中自行构建。" data-en="The currently public, signed, and notarized DMG is historical version 1.1. The Mac target in source evolves with the 2.0 codebase; build it with macOS and Xcode 26 for the latest source capabilities.">
|
||||
当前公开、已签名并公证的 DMG 是历史版 1.1。仓库中的 Mac target 随整体源码演进到 2.0;需要最新源码能力时可在 macOS 与 Xcode 26 中自行构建。
|
||||
<p data-zh="当前可下载、已签名并公证的 Mac 安装包为 1.1 版。仓库中的 Mac 版源码已更新至 2.0.0;如需最新功能,请在 macOS 上使用 Xcode 26 或更高版本自行构建。" data-en="The signed and notarized Mac installer currently available for download is version 1.1. The Mac source in the repository has been updated to version 2.0.0; build it on macOS with Xcode 26 or later to use the latest capabilities.">
|
||||
当前可下载、已签名并公证的 Mac 安装包为 1.1 版。仓库中的 Mac 版源码已更新至 2.0.0;如需最新功能,请在 macOS 上使用 Xcode 26 或更高版本自行构建。
|
||||
</p>
|
||||
</details>
|
||||
</div>
|
||||
@@ -615,10 +623,10 @@
|
||||
<div class="section-inner">
|
||||
<div class="download-panel">
|
||||
<div>
|
||||
<p class="eyebrow" data-zh="开口即文字" data-en="Speak it. It's typed.">开口即文字</p>
|
||||
<h2 data-zh="下一段文字,从一句话开始。" data-en="Your next sentence starts with your voice.">下一段文字,从一句话开始。</h2>
|
||||
<p data-zh="先从免费、本地的核心能力开始。需要时,再选择自己的服务商或托管积分。" data-en="Start with the free, local core. Add your own provider or managed credits only when you need them.">
|
||||
先从免费、本地的核心能力开始。需要时,再选择自己的服务商或托管积分。
|
||||
<p class="eyebrow" data-zh="开口即文字" data-en="Say it. It’s typed.">开口即文字</p>
|
||||
<h2 data-zh="下一段文字,开口就能输入。" data-en="Your next sentence starts with your voice.">下一段文字,开口就能输入。</h2>
|
||||
<p data-zh="先使用免费的端侧核心功能;需要时,再配置自己的 API 密钥或选择托管积分服务。" data-en="Start with the free, on-device core. Add your own API key or managed credits only when needed.">
|
||||
先使用免费的端侧核心功能;需要时,再配置自己的 API 密钥或选择托管积分服务。
|
||||
</p>
|
||||
</div>
|
||||
<div class="download-actions">
|
||||
@@ -633,9 +641,9 @@
|
||||
src="assets/badges/ios-zh.svg"
|
||||
data-zh-src="assets/badges/ios-zh.svg"
|
||||
data-en-src="assets/badges/ios-en.svg"
|
||||
data-zh-alt="立即下载 App Store 版"
|
||||
data-zh-alt="在 App Store 下载 OSGKeyboard"
|
||||
data-en-alt="Download on the App Store"
|
||||
alt="立即下载 App Store 版"
|
||||
alt="在 App Store 下载 OSGKeyboard"
|
||||
width="171"
|
||||
height="48"
|
||||
>
|
||||
@@ -645,9 +653,9 @@
|
||||
src="assets/badges/macos-zh.svg"
|
||||
data-zh-src="assets/badges/macos-zh.svg"
|
||||
data-en-src="assets/badges/macos-en.svg"
|
||||
data-zh-alt="下载 macOS 历史版本 1.1"
|
||||
data-en-alt="Download historical macOS version 1.1"
|
||||
alt="下载 macOS 历史版本 1.1"
|
||||
data-zh-alt="下载 macOS 1.1 旧版本"
|
||||
data-en-alt="Download macOS 1.1 (older version)"
|
||||
alt="下载 macOS 1.1 旧版本"
|
||||
width="171"
|
||||
height="48"
|
||||
>
|
||||
@@ -669,7 +677,7 @@
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="footer-inner">
|
||||
<span data-zh="OSGKeyboard 2.0.0 · 源码可见,非开源软件" data-en="OSGKeyboard 2.0.0 · Source available, not open source">
|
||||
<span data-zh="OSGKeyboard 2.0.0 · 源码可见,非开源软件" data-en="OSGKeyboard 2.0.0 · Source-available, not open source">
|
||||
OSGKeyboard 2.0.0 · 源码可见,非开源软件
|
||||
</span>
|
||||
<div class="footer-links">
|
||||
|
||||
@@ -182,41 +182,59 @@
|
||||
|
||||
<div class="lang-block" data-lang="zh">
|
||||
<section class="section">
|
||||
<h2>可选 OSG 账号</h2>
|
||||
<ul>
|
||||
<li>新增 Apple 登录、账号资料管理和 App 内账号注销</li>
|
||||
<li>新增托管积分、App Store 积分包与邀请功能</li>
|
||||
<li>登录后可使用托管云端语音与 AI 服务;本地听写和用户自备 API Key 无需账号,仍可独立使用</li>
|
||||
</ul>
|
||||
</section>
|
||||
<h2>全新积分体验</h2>
|
||||
|
||||
<section class="section">
|
||||
<h2>助手体验升级</h2>
|
||||
<ul>
|
||||
<li>语音与 AI 合并为统一的助手入口,并根据当前输入框显示对应操作</li>
|
||||
<li>AI 回答仅在输入框与光标上下文仍匹配时自动插入,避免写入错误位置</li>
|
||||
<li>修正退出登录与注销账号确认弹窗的锚点位置</li>
|
||||
</ul>
|
||||
<div class="group">
|
||||
<p class="group-title">邀请好友,双方得积分</p>
|
||||
<div class="wn-media wide">
|
||||
<img src="assets/whats-new/referral-rewards-zh.png" alt="OSGKeyboard 设置中的邀请奖励卡片" loading="lazy" decoding="async">
|
||||
</div>
|
||||
<ul>
|
||||
<li>每成功邀请一位好友,你和好友各获得<strong>1000 积分</strong></li>
|
||||
<li>可在设置的账号区域分享邀请链接</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="group">
|
||||
<p class="group-title">OSG 积分模式</p>
|
||||
<div class="wn-media wide">
|
||||
<img src="assets/whats-new/osg-credits-zh.png" alt="OSGKeyboard AI 服务中已选择使用积分" loading="lazy" decoding="async">
|
||||
</div>
|
||||
<ul>
|
||||
<li>使用 Apple 登录后,无需配置自己的 API Key,即可使用托管语音与 AI 服务</li>
|
||||
<li>支持通过 App Store 购买积分包,积分余额自动同步</li>
|
||||
<li>本地听写和自备 API Key 仍可独立使用,无需登录</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="lang-block" data-lang="en">
|
||||
<section class="section">
|
||||
<h2>Optional OSG Account</h2>
|
||||
<ul>
|
||||
<li>Adds Sign in with Apple, profile controls, and in-app account deletion</li>
|
||||
<li>Adds managed credits, App Store credit packs, and referrals</li>
|
||||
<li>Signed-in users can use managed cloud speech and AI; local dictation and user-owned provider keys remain independent and require no account</li>
|
||||
</ul>
|
||||
</section>
|
||||
<h2>A New Credits Experience</h2>
|
||||
|
||||
<section class="section">
|
||||
<h2>Assistant Improvements</h2>
|
||||
<ul>
|
||||
<li>Combines Voice and AI into one Assistant entry with actions adapted to the focused field</li>
|
||||
<li>Inserts AI answers automatically only while the original field and cursor context still match</li>
|
||||
<li>Fixes the anchors for sign-out and account-deletion confirmation dialogs</li>
|
||||
</ul>
|
||||
<div class="group">
|
||||
<p class="group-title">Invite Friends, Earn Credits Together</p>
|
||||
<div class="wn-media wide">
|
||||
<img src="assets/whats-new/referral-rewards-en.png" alt="Referral rewards card in OSGKeyboard Settings" loading="lazy" decoding="async">
|
||||
</div>
|
||||
<ul>
|
||||
<li>For every successful referral, you and your friend each receive <strong>1,000 credits</strong></li>
|
||||
<li>Share your invitation link from the Account section in Settings</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="group">
|
||||
<p class="group-title">OSG Credits Mode</p>
|
||||
<div class="wn-media wide">
|
||||
<img src="assets/whats-new/osg-credits-en.png" alt="Use Credits selected in OSGKeyboard AI Service" loading="lazy" decoding="async">
|
||||
</div>
|
||||
<ul>
|
||||
<li>Sign in with Apple to use managed speech and AI services without configuring your own API key</li>
|
||||
<li>Purchase credit packs through the App Store and keep your balance synchronized automatically</li>
|
||||
<li>Local dictation and user-owned API keys remain available independently, with no sign-in required</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Privacy Policy · OSGKeyboard</title>
|
||||
<meta name="description" content="OSGKeyboard privacy policy: no account required for core use, on-device speech recognition by default, optional user-configured or managed cloud services, no analytics SDKs, no sale of personal data.">
|
||||
<meta name="description" content="OSGKeyboard privacy policy: no account required for core use, on-device speech recognition by default, optional user-configured or managed cloud services, limited first-party analytics with opt-out, no sale of personal data.">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://hkgood.github.io/OSGKeyboard/privacy/">
|
||||
<link rel="icon" href="../assets/app-icon.png" type="image/png">
|
||||
@@ -52,13 +52,14 @@
|
||||
<li><strong>macOS local speech models</strong> — when you choose a Qwen3-ASR local model, the Mac app downloads model files from Hugging Face and stores them in its local application-support directory until you remove them. Local inference does not send your audio to Hugging Face or OSGKeyboard.</li>
|
||||
<li><strong>Voice history</strong> — the host app may keep a list of recent successful transcripts in its History tab. History is capped at 300 entries. When iCloud settings sync is enabled, history may also sync through your private iCloud Key-Value Store.</li>
|
||||
<li><strong>Usage statistics</strong> — cumulative dictation time, dictation characters, translation characters, and dictionary entry count are computed and stored locally on the home screen stats card.</li>
|
||||
<li><strong>Optional first-party product analytics</strong> — enabled by default and removable at any time in Settings. OSGKeyboard sends only fixed event names and fixed categories about app/keyboard sessions, AI feature outcomes and duration ranges, purchase-page interactions, and invitation actions, together with an app-scoped random installation identifier and safe app/OS version labels. It never includes keyboard input, audio, transcripts, cursor context, prompts, model output, contacts, file or device names, Apple identifiers, email, credentials, advertising identifiers, or free-form properties. Turning analytics off deletes queued events; turning it back on creates a new installation identifier.</li>
|
||||
</ul>
|
||||
<p>Clipboard sensitive-content filtering is applied to newly captured items. Existing history is retained until you use the confirmed clear action.</p>
|
||||
|
||||
<h2>What we do not collect</h2>
|
||||
<ul>
|
||||
<li>We do <strong>not</strong> log or upload ordinary keystrokes. Only the on-device Chinese candidate-learning data described above is retained locally.</li>
|
||||
<li>We do <strong>not</strong> operate analytics, crash reporting, or advertising SDKs.</li>
|
||||
<li>We do <strong>not</strong> use third-party analytics, crash-reporting, advertising SDKs, ATT, or IDFA.</li>
|
||||
<li>We do <strong>not</strong> upload raw audio on a local engine. Audio leaves the device only after you select a user-configured cloud engine or managed credits.</li>
|
||||
<li>We do <strong>not</strong> sell personal data.</li>
|
||||
</ul>
|
||||
@@ -79,6 +80,7 @@
|
||||
<h2>Data retention</h2>
|
||||
<p>Settings remain on your device until you delete the app or reset settings. When iCloud settings sync is enabled, API keys replicate through iCloud Keychain and eligible preferences, statistics, dictionary data, and voice history may sync through your private iCloud account. Voice history is capped at 300 entries and can be cleared from History or by resetting settings. Clipboard history remains device-local, is capped at 15 entries, has no fixed expiry, and remains when capture is turned off or settings are reset; use the separate confirmed clear action to delete it. Chinese and English typing-learning data stays local and can be cleared from typing settings without deleting the personal dictionary. Downloaded Mac speech models remain until you remove the model in the app or delete its local files.</p>
|
||||
<p><strong>Optional account</strong> — account profile, credit ledger, StoreKit audit records, and limited anti-abuse records are retained by the account service while the account is active. Account deletion removes the active profile and credentials; pseudonymous ledger, purchase-audit, and time-limited anti-abuse records may remain where required to prevent replay, fraud, or abuse.</p>
|
||||
<p><strong>Product analytics</strong> — queued events expire locally after 34 days and the service accepts events no older than 35 days. Account deletion and analytics opt-out delete the local queue. Analytics identifiers are not used for cross-app tracking or advertising.</p>
|
||||
|
||||
<h2>Children's privacy</h2>
|
||||
<p>OSGKeyboard is not directed to children under 13 and does not knowingly collect personal data from children.</p>
|
||||
@@ -114,13 +116,14 @@
|
||||
<li><strong>macOS 本地语音模型</strong> — 选择 Qwen3-ASR 本地模型后,Mac App 会从 Hugging Face 下载模型文件,并保存在本机应用支持目录,直到你主动移除。本地推理不会把录音发送到 Hugging Face 或 OSGKeyboard。</li>
|
||||
<li><strong>语音历史</strong> — 主 App 可在「历史」页保留近期成功转写,上限 300 条。开启 iCloud 设置同步后,历史也可能经私有 iCloud 键值存储同步。</li>
|
||||
<li><strong>用量统计</strong> — 首页统计卡片的累计听写时长、听写字数、翻译字数、词库词条数均在本地计算与保存。</li>
|
||||
<li><strong>可选第一方产品分析</strong> — 默认开启,可随时在设置中关闭。OSGKeyboard 只发送固定事件名和固定分类,用于了解 App/键盘会话、AI 功能结果与耗时区间、购买页交互及邀请操作,并携带 App 范围内随机生成的安装标识和安全的 App/系统版本标识。绝不包含键盘输入、音频、转录、光标上下文、Prompt、模型输出、联系人、文件名、设备名、Apple 标识、邮箱、凭证、广告标识符或自由形式属性。关闭后会删除待发送事件;重新开启会生成新的安装标识。</li>
|
||||
</ul>
|
||||
<p>剪贴板敏感内容过滤仅在新内容采集时执行;已有历史会继续保留,直到你使用带确认的清空操作。</p>
|
||||
|
||||
<h2>我们不收集的内容</h2>
|
||||
<ul>
|
||||
<li>我们<strong>不会</strong>记录或上传你平时在键盘上的击键内容。</li>
|
||||
<li>我们<strong>不会</strong>集成分析、崩溃上报或广告 SDK。</li>
|
||||
<li>我们<strong>不会</strong>集成第三方分析、崩溃上报或广告 SDK,也不使用 ATT 或 IDFA。</li>
|
||||
<li>使用本地引擎时,我们<strong>不会</strong>上传原始录音。只有你选择用户自备云端识别或托管积分后,录音才会离开设备。</li>
|
||||
<li>我们<strong>不会</strong>出售个人数据。</li>
|
||||
</ul>
|
||||
@@ -141,6 +144,7 @@
|
||||
<h2>数据保留</h2>
|
||||
<p>设置保留在设备上,直至卸载或重置。开启 iCloud 设置同步后,API 密钥经 iCloud 钥匙串同步,可同步的偏好、统计、词库和语音历史可能经私有 iCloud 账户同步。语音历史上限 300 条,可在「历史」页清空或通过重置设置清除。剪贴板历史仅保存在本机,上限 15 条,没有固定过期时间;关闭采集或重置设置均会保留,需使用单独确认的清空操作删除。中英文输入学习数据仅留本机,可在输入设置中单独清除且不影响个性词库。下载的 Mac 语音模型会保留到你在应用中移除模型或删除本地文件。</p>
|
||||
<p><strong>可选账号</strong> — 账号有效期间,账号服务会保留资料、积分账本、StoreKit 审计记录及有限的反滥用记录。注销会删除有效资料与凭证;为防止交易重放、欺诈或滥用,匿名账本、购买审计及有时限的反滥用记录可能在必要范围内继续保留。</p>
|
||||
<p><strong>产品分析</strong> — 待发送事件会在本地满 34 天后过期,服务端只接受 35 天以内的事件。注销账号或关闭产品分析会删除本地队列。分析标识不会用于跨 App 跟踪或广告。</p>
|
||||
|
||||
<h2>儿童隐私</h2>
|
||||
<p>OSGKeyboard 不面向 13 岁以下儿童,亦不会明知地从儿童处收集个人信息。</p>
|
||||
|
||||
Reference in New Issue
Block a user