React Native 的语音到文本库。
纱线添加@react-native-voice/voice# ornpm i @react-native-voice/voice --save
链接 iOS 包
npx pod 安装
链接
手动链接Android
手动链接 iOS
预构建插件
用法
例子
应用程序编程接口
活动
权限
安卓
iOS系统
贡献者
手动或自动链接NativeModule
反应本机链接@react-native-voice/voice
在android/setting.gradle
中
... 包括 ':@react-native-voice_voice', ':app'project(':@react-native-voice_voice').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-voice/语音/安卓')
在android/app/build.gradle
中
...依赖项{... 编译项目(':@react-native-voice_voice') }
在MainApplication.java
中
导入 android.app.Application;导入 com.facebook.react.ReactApplication;导入 com.facebook.react.ReactPackage; ...导入 com.wenkesj.voice.VoicePackage; // <------ 添加这个!...public class MainActivity extends Activity Implements ReactApplication { ...@Overrideprotected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList(new MainReactPackage(),new VoicePackage() // <------ 添加这个!); } }
将 Voice.xcodeproj 从 @react-native-voice/voice/ios 文件夹拖到项目中 Xcode 上的 Libraries 组。手动链接
单击主项目文件(代表 .xcodeproj 的文件),选择“构建阶段”并将静态库 lib.Voice.a 从 Libraries/Voice.xcodeproj/Products 文件夹拖动到“Link Binary With Libraries”
该包不能在“Expo Go”应用程序中使用,因为它需要自定义本机代码。
安装此 npm 包后,将配置插件添加到app.json
或app.config.js
的plugins
数组中:
{ "expo": {"plugins": ["@react-native-voice/voice"] } }
接下来,按照“添加自定义本机代码”指南中的说明重建您的应用程序。
该插件提供了额外定制的道具。每次更改道具或插件时,您都需要重建(和prebuild
)本机应用程序。如果没有添加额外的属性,将使用默认值。
speechRecognition
( string | false ):设置Info.plist
消息中NSSpeechRecognitionUsageDescription
键的消息。当未定义时,将使用默认的权限消息。当false
时,权限将被跳过。
microphone
( string | false ):设置Info.plist
中NSMicrophoneUsageDescription
键的消息。当未定义时,将使用默认的权限消息。当false
时, android.permission.RECORD_AUDIO
将不会添加到AndroidManifest.xml
中,并且 iOS 权限将被跳过。
{“插件”:[ [“@react-native-voice/语音”, {"microphonePermission": "CUSTOM: 允许 $(PRODUCT_NAME) 访问麦克风","speechRecognitionPermission": "CUSTOM: 允许 $(PRODUCT_NAME) 安全地识别用户语音" } ] ] }
Android 和 iOS 的完整示例。
从 '@react-native-voice/voice' 导入 Voice;从 'react' 导入 React, {Component};class VoiceTest 扩展 Component { 构造函数(props) {Voice.onSpeechStart = this.onSpeechStartHandler.bind(this);Voice.onSpeechEnd = this.onSpeechEndHandler.bind(this);Voice.onSpeechResults = this.onSpeechResultsHandler.bind(this); } onStartButtonPress(e){Voice.start('en-US'); } ...}
对语音 API 的静态访问。
现在,所有方法都返回一个new Promise
,以实现async/await
兼容性。
方法名称 | 描述 | 平台 |
---|---|---|
语音.isAvailable() | 检查系统上是否提供语音识别服务。 | 安卓、iOS |
Voice.start(语言环境) | 开始聆听特定区域的语音。如果没有发生错误则返回 null。 | 安卓、iOS |
语音.stop() | 停止聆听讲话。如果没有发生错误则返回 null。 | 安卓、iOS |
Voice.cancel() | 取消语音识别。如果没有发生错误则返回 null。 | 安卓、iOS |
Voice.destroy() | 销毁当前的 SpeechRecognizer 实例。如果没有发生错误则返回 null。 | 安卓、iOS |
Voice.removeAllListeners() | 清理/取消覆盖的Voice 静态方法。 | 安卓、iOS |
Voice.isRecognizing() | 如果 SpeechRecognizer 正在识别,则返回。 | 安卓、iOS |
Voice.getSpeechRecognitionServices() | 返回设备上可用的语音识别引擎的列表。 (例如: ['com.google.android.googlequicksearchbox'] 如果 Google 是唯一可用的。) | 安卓 |
发出本机事件时调用的回调。
活动名称 | 描述 | 事件 | 平台 |
---|---|---|---|
Voice.onSpeechStart(事件) | 当调用.start() 且没有错误时调用。 | { error: false } | 安卓、iOS |
Voice.onSpeechRecognized(事件) | 识别语音时调用。 | { error: false } | 安卓、iOS |
Voice.onSpeechEnd(事件) | 当 SpeechRecognizer 停止识别时调用。 | { error: false } | 安卓、iOS |
Voice.onSpeechError(事件) | 发生错误时调用。 | { error: Description of error as string } | 安卓、iOS |
Voice.onSpeechResults(事件) | 当 SpeechRecognizer 完成识别时调用。 | { value: [..., 'Speech recognized'] } | 安卓、iOS |
Voice.onSpeechPartialResults(事件) | 计算任何结果时调用。 | { value: [..., 'Partial speech recognized'] } | 安卓、iOS |
Voice.onSpeechVolumeChanged(事件) | 当识别的音高发生变化时调用。 | { value: pitch in dB } | 安卓 |
可以说是最重要的部分。
虽然附带的VoiceTest
应用程序无需显式权限检查和请求即可工作,但可能需要为某些配置添加RECORD_AUDIO
的权限请求。从 Android M (6.0) 开始,用户需要在运行时授予权限(而不是在应用程序安装期间)。默认情况下,调用startSpeech
方法将向用户调用RECORD AUDIO
权限弹出窗口。可以通过在选项参数中传递REQUEST_PERMISSIONS_AUTO: true
来禁用此功能。
如果您正在运行弹出的 expo/expokit 应用程序,您可能会遇到 Android 上的权限问题,并收到以下错误host.exp.exponent.MainActivity cannot be cast to com.facebook.react.ReactActivity startSpeech
。这可以通过在开始识别之前使用expo-permission
包提示权限来解决。
import { Permissions } from "expo";async componentDidMount() {const { status, expires, Permissions } = wait Permissions.askAsync(Permissions.AUDIO_RECORDING);if (status !== "granted") {//未授予权限。不要显示开始录制按钮,因为按下它会导致问题。this.setState({showRecordButton: false});} else {this.setState({showRecordButton: true});}}
安卓注意事项
即使 Android 中的所有权限都正确之后,还有最后一件事要确保该库在 Android 上正常工作。请通过调用Voice.getSpeechRecognitionServices()
确保设备具有 Google 语音识别引擎,例如com.google.android.googlequicksearchbox
。由于 Android 手机可以配置如此多的选项,即使设备具有 googlequicksearchbox 引擎,也可以配置为使用其他服务。对于大多数 Android 手机,您可以按照以下步骤检查语音辅助应用程序使用的是哪个服务:
Settings > App Management > Default App > Assistive App and Voice Input > Assistive App
上述流程可能因 Android 型号和制造商而异。对于华为手机,设备可能无法安装 Google 服务。
如何在设备中获取com.google.android.googlequicksearchbox
?
请要求用户安装 Google 搜索应用。
需要在 iOS 的 Info.plist 中包含NSMicrophoneUsageDescription
和NSSpeechRecognitionUsageDescription
的权限。请参阅随附的VoiceTest
了解如何处理这些情况。
<字典> ... <key>NSMicrophoneUsageDescription</key> <string>说明为什么需要使用麦克风</string> <key>NSSpeechRecognitionUsageDescription</key> <string>为什么需要使用语音识别的描述</string> ... </字典>
请参阅 ReactNative 提供的文档:PermissionsAndroid
@asafron
@布伦丹FD摩尔
@布鲁德尼
@chitezh
@ifsnow
@jamsch
@米西诺
@诺伊达特
@ohtangza & @hayanmind
@rudiedev6
@tdonia
@wenkesj