{"_id":"@bingtang-rn/react-native-vosk","_rev":"2-6dfac8fde9be79a7318974848a0d5e0d","name":"@bingtang-rn/react-native-vosk","dist-tags":{"latest":"2.1.8"},"versions":{"2.1.7":{"name":"@bingtang-rn/react-native-vosk","version":"2.1.7","keywords":["react-native","harmony","harmonyos","react-native-vosk"],"license":"MIT","_id":"@bingtang-rn/react-native-vosk@2.1.7","maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"homepage":"https://gitcode.com/rn_ohos_plugin/react_native_vosk","dist":{"shasum":"6766e92f61a08ae4765a9bf23455bd0484bb69b2","tarball":"https://registry.npmjs.org/@bingtang-rn/react-native-vosk/-/react-native-vosk-2.1.7.tgz","fileCount":34,"integrity":"sha512-QGrtl48ugl7+hgeCtumbXAW7fG1Fe3dOwvxhYRxMyBdiqpY2lreKNVQ/Pmm/+zN6N284g0XhYN3vX0w2HDGRdA==","signatures":[{"sig":"MEUCIE+ixQ3wh3rs06kBQyE8yYhJCV9r5VoJylpPd01p2vA4AiEAnT7MsJtnBLoaUied5b6wn1PF1P77hWM2PigbWP5fYEw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57088},"main":"./src/index.ts","types":"./src/index.d.ts","module":"./src/index.ts","engines":{"node":">=18"},"gitHead":"fe874b688bed682cdd2621318357129c1f203720","harmony":{"alias":"react-native-vosk","autolinking":{"ohPackageName":"@oh-rn/react-native-vosk","cppPackageClassName":"VoskPackage","etsPackageClassName":"VoskPackage","cmakeLibraryTargetName":"vosk"},"codegenConfig":[{"version":1,"specPaths":["./src/specs/v1"]}]},"private":false,"scripts":{"prepare":"echo skip","codegen-lib":"react-native codegen-harmony --cpp-output-path ./harmony/vosk/src/main/cpp/generated --ets-output-path ./harmony/vosk/src/main/ets/generated"},"_npmUser":{"name":"luyizouyuan","email":"189605613@qq.com"},"repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_vosk","type":"git"},"_npmVersion":"11.12.1","description":"适配鸿蒙版本，提供react_native_vosk组件。","directories":{},"_nodeVersion":"24.15.0","react-native":"./src/index.ts","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.3","metro":"^0.81.0","react":"18.2.0","typescript":"5.0.4","@types/react":"18.2.79","react-native":"0.72.5","@react-native/typescript-config":"0.79.5","@react-native-oh/react-native-harmony-cli":"^0.77.50"},"peerDependencies":{"react-native":">=0.72"},"_npmOperationalInternal":{"tmp":"tmp/react-native-vosk_2.1.7_1785416030328_0.834972256400736","host":"s3://npm-registry-packages-npm-production"}},"2.1.8":{"_id":"@bingtang-rn/react-native-vosk@2.1.8","dist":{"shasum":"c341bb4f53e7585a041c0829cb7b4624b6b79096","tarball":"https://registry.npmjs.org/@bingtang-rn/react-native-vosk/-/react-native-vosk-2.1.8.tgz","fileCount":34,"integrity":"sha512-OYx0NKpjWlKvC+MQFwD7MZ3hAowdmrthwsZFMAHXmF1e3gD6wUA9EtTaZMMsF2R8pMgzaoZcySi2E2COeW019w==","signatures":[{"sig":"MEQCIERSQHBJ50vuKYbls3Q67xQ7XktQmao4zyvNGTg+3THgAiBigzHolzVG82LOEfLSi7HT9L9o0kC/NaJTEL1tj2Cvig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDLB9YduS1BRt80BhfJwdsVCoGB0XPHzshibF+pNkrlkAIgTL0RttW9gV74O4S5jEX8nRfSvOfV9S8FEsg6GINZzxg="}],"unpackedSize":57283},"main":"./src/index.ts","name":"@bingtang-rn/react-native-vosk","_from":"file:bingtang-rn-react-native-vosk-2.1.8.tgz","types":"./src/index.d.ts","module":"./src/index.ts","engines":{"node":">=18"},"harmony":{"alias":"react-native-vosk","autolinking":{"ohPackageName":"@bingtang-rn/react-native-vosk","cppPackageClassName":"VoskPackage","etsPackageClassName":"VoskPackage","cmakeLibraryTargetName":"vosk"},"codegenConfig":[{"version":1,"specPaths":["./src/specs/v1"]}]},"license":"MIT","private":false,"scripts":{"prepare":"echo skip","codegen-lib":"react-native codegen-harmony --cpp-output-path ./harmony/vosk/src/main/cpp/generated --ets-output-path ./harmony/vosk/src/main/ets/generated"},"version":"2.1.8","_npmUser":{"name":"luyizouyuan","email":"189605613@qq.com"},"homepage":"https://gitcode.com/rn_ohos_plugin/react_native_vosk","keywords":["react-native","harmony","harmonyos","react-native-vosk"],"_resolved":"D:\\code\\rn\\npm\\batch\\react_native_vosk\\bingtang-rn-react-native-vosk-2.1.8.tgz","_integrity":"sha512-OYx0NKpjWlKvC+MQFwD7MZ3hAowdmrthwsZFMAHXmF1e3gD6wUA9EtTaZMMsF2R8pMgzaoZcySi2E2COeW019w==","repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_vosk","type":"git"},"_npmVersion":"11.12.1","description":"适配鸿蒙版本，提供react_native_vosk组件。","directories":{},"maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"_nodeVersion":"24.15.0","react-native":"./src/index.ts","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.3","metro":"^0.81.0","react":"18.2.0","typescript":"5.0.4","@types/react":"18.2.79","react-native":"0.72.5","@react-native/typescript-config":"0.79.5","@react-native-oh/react-native-harmony-cli":"^0.77.50"},"peerDependencies":{"react-native":">=0.72"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-native-vosk_2.1.8_1790569755158_0.577371641725509"}}},"time":{"created":"2026-07-30T12:53:42.709Z","modified":"2026-09-28T04:29:15.415Z","2.1.7":"2026-07-30T12:53:50.488Z","2.1.8":"2026-09-28T04:29:15.256Z"},"license":"MIT","homepage":"https://gitcode.com/rn_ohos_plugin/react_native_vosk","keywords":["react-native","harmony","harmonyos","react-native-vosk"],"repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_vosk","type":"git"},"description":"适配鸿蒙版本，提供react_native_vosk组件。","maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"readme":"# @bingtang-rn/react-native-vosk for HarmonyOS\r\n\r\n本项目基于 [react-native-vosk](https://github.com/riderodd/react-native-vosk) 开发，为 React Native 鸿蒙（OpenHarmony）适配版本。如果在使用过程中有任何问题，可以在GitCode提Issue，会及时跟进。issue地址：[issues](https://gitcode.com/rn_ohos_plugin/react_native_vosk/issues)。\r\n\r\n## 版本对应关系\r\n\r\n| 鸿蒙适配包版本 | 原始库版本 | 支持 RN 版本 | Autolink | 编译 API 版本 |\r\n| ------------ | ---------- | ------------ | -------- | ------------- |\r\n| 见发布记录 | 2.1.7 | 0.72+ | 是 | API17+ |\r\n\r\n## 安装\r\n\r\n```bash\r\nnpm install @bingtang-rn/react-native-vosk\r\n```\r\n\r\n## 使用\r\n\r\n```tsx\r\nimport { loadModel, start, stop, unload, onResult, onPartialResult, onFinalResult, onError, onTimeout } from 'react-native-vosk';\r\n\r\n// 加载模型\r\nawait loadModel('model-zh-cn');\r\n\r\n// 监听识别结果\r\nconst resultSub = onResult((text) => console.log('Result:', text));\r\nconst partialSub = onPartialResult((text) => console.log('Partial:', text));\r\nconst finalSub = onFinalResult((text) => console.log('Final:', text));\r\nconst errorSub = onError((err) => console.error('Error:', err));\r\nconst timeoutSub = onTimeout(() => console.log('Timed out'));\r\n\r\n// 启动识别（默认模式）\r\nawait start();\r\n\r\n// 带语法/超时启动\r\nawait start({ grammar: ['hello', 'world', '[unk]'] });\r\nawait start({ timeout: 5000 });\r\n\r\n// 停止识别\r\nstop();\r\n\r\n// 卸载模型\r\nunload();\r\n```\r\n\r\n> import 时使用原库名 `'react-native-vosk'`，而非鸿蒙包名。\r\n\r\n**平台差异**：\r\n- HarmonyOS 使用 Core Speech Kit 替代 Vosk 引擎，仅支持中文（zh-CN）离线识别\r\n- `loadModel(path)` 的 `path` 参数仅用于语言标识（如 `'model-zh-cn'`→中文），不加载自定义模型文件\r\n- 已加载引擎时再次调用 `loadModel(path)` 会直接复用当前引擎，不会中断正在进行的识别\r\n- `grammar` 参数通过会话热词提高命中率，并在适配层过滤列表外结果\r\n- 引擎使用长语音模式，短暂停顿只结束当前子句，调用 `stop()` 或达到 timeout 才结束会话\r\n- `timeout` 单位为毫秒；模块定时器按传入值结束识别，原生长语音时长限制为 20000ms～8 小时\r\n\r\n**权限要求**：\r\n- 需在 `module.json5` 声明 `ohos.permission.MICROPHONE`（user_grant，运行时由原生模块自动申请）\r\n\r\n## Link\r\n\r\n| 版本 | 是否支持 Autolink |\r\n|------|------------------|\r\n| 当前版本 | 是 |\r\n\r\n如使用版本支持 Autolink 且工程已接入，可跳过手动配置。\r\n\r\n<details>\r\n<summary>Manual Link 配置</summary>\r\n\r\n> **说明**：本模块需要同时在 C++ 侧和 ETS 侧注册 Package。\r\n\r\n### 1. Overrides RN SDK\r\n\r\n在工程根目录 `oh-package.json5` 添加：\r\n\r\n```json\r\n{\r\n  \"overrides\": {\r\n    \"@rnoh/react-native-openharmony\": \"./react_native_openharmony\"\r\n  }\r\n}\r\n```\r\n\r\n### 2. 引入原生端依赖\r\n\r\n打开 `entry/oh-package.json5`，添加：\r\n\r\n```json\r\n\"dependencies\": {\r\n  \"@bingtang-rn/react-native-vosk\": \"file:../../node_modules/@bingtang-rn/react-native-vosk/harmony/vosk.har\"\r\n}\r\n```\r\n\r\n执行 `ohpm install`。\r\n\r\n### 3. 配置 CMakeLists\r\n\r\n打开 `entry/src/main/cpp/CMakeLists.txt`，添加：\r\n\r\n```cmake\r\nset(OH_MODULES \"${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules\")\r\n\r\nadd_subdirectory(\"${OH_MODULES}/@bingtang-rn/react-native-vosk/src/main/cpp\" ./vosk)\r\n\r\ntarget_link_libraries(rnoh_app PUBLIC vosk)\r\n```\r\n\r\n### 4. 注册 Package（C++ 侧）\r\n\r\n打开 `entry/src/main/cpp/PackageProvider.cpp`，添加：\r\n\r\n```cpp\r\n#include \"VoskPackage.h\"\r\n\r\nstd::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {\r\n    return {\r\n        std::make_shared<VoskPackage>(ctx),\r\n    };\r\n}\r\n```\r\n\r\n### 5. 注册 Package（ETS 侧）\r\n\r\n打开 `entry/src/main/ets/RNPackagesFactory.ets`，添加：\r\n\r\n```typescript\r\nimport { VoskPackage } from '@bingtang-rn/react-native-vosk/ts';\r\n\r\nexport function createRNPackages(ctx: RNPackageContext): RNPackage[] {\r\n  return [\r\n    new VoskPackage(ctx),\r\n  ];\r\n}\r\n```\r\n\r\n</details>\r\n\r\n## 属性 / API\r\n\r\n| API | 描述 | 参数 | 返回值 | HarmonyOS 支持 |\r\n|-----|------|------|--------|----------------|\r\n| loadModel | 加载语音识别模型 | path: string | Promise\\<void\\> | ⚠️ 部分支持（path 仅作语言标识，不加载自定义模型文件） |\r\n| unload | 卸载模型并停止识别 | 无 | void | ✅ 完全支持 |\r\n| start | 启动语音识别 | options?: VoskOptions | Promise\\<void\\> | ⚠️ 部分支持（grammar 使用热词与结果过滤近似实现；timeout 原生精度为 ms） |\r\n| stop | 停止识别 | 无 | void | ✅ 完全支持 |\r\n| onResult | 监听句子完成结果 | cb: (e: string) => void | EmitterSubscription | ✅ 完全支持 |\r\n| onPartialResult | 监听部分识别结果 | cb: (e: string) => void | EmitterSubscription | ✅ 完全支持 |\r\n| onFinalResult | 监听最终识别结果 | cb: (e: string) => void | EmitterSubscription | ✅ 完全支持 |\r\n| onError | 监听错误事件 | cb: (e: any) => void | EmitterSubscription | ✅ 完全支持 |\r\n| onTimeout | 监听超时事件 | cb: () => void | EmitterSubscription | ✅ 完全支持 |\r\n\r\n### 平台差异\r\n- `loadModel(path)`：HarmonyOS Core Speech Kit 使用系统内置离线模型，`path` 参数仅解析为语言标识（如含 `zh-cn`/`chinese` 映射为 `'zh-CN'`），非中文语言自动回退至中文\r\n- `start({ grammar })`：`grammar` 中 `[unk]` 会被过滤，其余词条作为会话热词提高识别率；适配层忽略空白和常见中英文标点后匹配，只返回列表中的原始短语\r\n- 连续识别：使用 Core Speech Kit 长语音模式，停顿后仍保持当前识别会话，可继续接收后续子句结果\r\n\r\n### 未实现功能\r\n| 功能 | 原因 |\r\n|------|------|\r\n| 多语言离线模型（en-US/fr-FR 等） | Core Speech Kit 当前仅支持中文（zh-CN）离线识别 |\r\n| 自定义模型文件加载 | Core Speech Kit 使用系统内置模型，无加载外部模型 API |\r\n| 解码阶段的严格语法匹配 | Core Speech Kit 仅提供热词能力；当前通过适配层结果过滤保证输出范围 |\r\n\r\n### 使用限制\r\n- 需声明 `ohos.permission.MICROPHONE`（user_grant）\r\n- 需要 HarmonyOS 4.1+（API17+）设备\r\n- Core Speech Kit 离线识别仅支持中文\r\n\r\n## 快速验证（运行 Example）\r\n\r\n### 前置条件\r\n\r\n| 依赖 | 版本要求 |\r\n|------|----------|\r\n| Node.js | >= 18 |\r\n| DevEco Studio | 5.0+ / 6.0+ |\r\n| HarmonyOS SDK | API 17+ |\r\n\r\n### 运行步骤\r\n\r\n**1. 克隆仓库**\r\n\r\n```bash\r\ngit clone <仓库地址>\r\ncd <仓库目录>\r\n```\r\n\r\n**2. 安装依赖并构建**\r\n\r\n```bash\r\nnpm install --legacy-peer-deps\r\nnpm pack           # 生成 tgz 包（会自动触发 prepare 构建 JS 产物）\r\n```\r\n\r\n**3. 进入 example 目录，安装依赖**\r\n\r\n```bash\r\ncd example\r\nnpm install --legacy-peer-deps\r\n```\r\n\r\n**4. 生成 JS Bundle**\r\n\r\n```bash\r\nnpm run dev\r\n```\r\n\r\n产物：`harmony/entry/src/main/resources/rawfile/bundle.harmony.js`\r\n\r\n**5. 用 DevEco Studio 打开鸿蒙工程**\r\n\r\n- 打开 DevEco Studio\r\n- 选择 `example/harmony` 目录\r\n- 等待 Sync 完成\r\n\r\n**6. 编译并运行 HAP**\r\n\r\n在 DevEco Studio 中点击运行按钮，将 HAP 安装到设备/模拟器。\r\n\r\n> **注意**：Example 中已预置插件依赖和 Package 注册，无需手动配置 Link。\r\n\r\n## 约束与限制\r\n\r\n### 兼容性\r\n\r\n- RNOH: 0.72+\r\n- HarmonyOS SDK: API 17+\r\n- DevEco Studio: 5.0+\r\n\r\n## 遗留问题\r\n\r\n无（或列出已知问题）\r\n\r\n## 开源协议\r\n\r\n本项目基于 [原始库协议](原始库 LICENSE 链接)，详见 [LICENSE](./LICENSE) 文件。\r\n","readmeFilename":"README.md"}