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") {//未授予權限。不要顯示開始錄製按鈕,因為按下它會導致問題。
安卓注意事項
即使 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
@布倫丹FDMoore
@布魯德尼
@chitezh
@ifsnow
@jamsch
@米西諾
@諾伊達特
@ohtangza & @hayanmind
@rudiedev6
@tdonia
@wenkesj