Я запускаю npx create-expo-module@latest --local, чтобы создать свой «мой-голосовой модуль» в папке модулей. Вот соответствующие файлы:
/modules/my-voice-module/android/src/main/.../MyVoiceModule.kt
Код: Выделить всё
package expo.modules.myvoicemodule
import android.content.Intent
import android.os.Bundle
import android.speech.RecognitionListener
import android.speech.RecognizerIntent
import android.speech.SpeechRecognizer
import expo.modules.kotlin.modules.Module
import expo.modules.kotlin.modules.ModuleDefinition
class MyVoiceModule : Module() {
private var speechRecognizer: SpeechRecognizer? = null
private var recognitionIntent: Intent? = null
override fun definition() = ModuleDefinition {
Name("MyVoiceModule")
Method("startListening") {
val context = appContext.reactContext ?: return@Method
context.runOnUiThread {
speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context)
speechRecognizer?.setRecognitionListener(recognitionListener)
recognitionIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, context.packageName)
putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true)
}
speechRecognizer?.startListening(recognitionIntent)
}
}
Method("stopListening") {
val context = appContext.reactContext ?: return@Method
context.runOnUiThread {
speechRecognizer?.stopListening()
speechRecognizer?.destroy()
speechRecognizer = null
}
}
OnEvent("onReadyForSpeech")
OnEvent("onBeginningOfSpeech")
OnEvent("onEndOfSpeech")
OnEvent("onError")
OnEvent("onResults")
OnEvent("onPartialResults")
}
private val recognitionListener = object : RecognitionListener {
override fun onReadyForSpeech(params: Bundle) {
eventEmitter.emit("onReadyForSpeech", null)
}
override fun onBeginningOfSpeech() {
eventEmitter.emit("onBeginningOfSpeech", null)
}
override fun onRmsChanged(rmsdB: Float) {}
override fun onBufferReceived(buffer: ByteArray) {}
override fun onEndOfSpeech() {
eventEmitter.emit("onEndOfSpeech", null)
}
override fun onError(error: Int) {
eventEmitter.emit("onError", mapOf("errorCode" to error))
}
override fun onResults(results: Bundle) {
val matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
matches?.let {
eventEmitter.emit("onResults", mapOf("results" to it))
}
}
override fun onPartialResults(partialResults: Bundle) {
val matches = partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
matches?.let {
eventEmitter.emit("onPartialResults", mapOf("partialResults" to it))
}
}
override fun onEvent(eventType: Int, params: Bundle) {}
}
}
Код: Выделить всё
import { NativeModule, requireNativeModule } from "expo";
import { MyVoiceModuleEvents } from "./MyVoiceModule.types";
declare class MyVoiceModule extends NativeModule {
startListening(): void;
stopListening(): void;
}
// This call loads the native module object from the JSI.
export default requireNativeModule("MyVoiceModule");
Код: Выделить всё
// Reexport the native module. On web, it will be resolved to MyVoiceModule.web.ts
// and on native platforms to MyVoiceModule.ts
export { default } from "./src/MyVoiceModule";
export * from "./src/MyVoiceModule.types";
import { EventEmitter } from "expo-modules-core";
import { MyVoiceModuleEvents } from "./src/MyVoiceModule.types";
import MyVoiceModule from "./src/MyVoiceModule";
const voiceEventEmitter = new EventEmitter(MyVoiceModule);
export const startListening = () => {
MyVoiceModule.startListening();
};
export const stopListening = () => {
MyVoiceModule.stopListening();
};
export const addSpeechListener = (callback: (text: string) => void) => {
const subscription = voiceEventEmitter.addListener(
"onSpeechResult",
callback
);
return subscription;
};
export const removeSpeechListener = (subscription: any) => {
subscription.remove();
};
Код: Выделить всё
Using expo modules
- expo-asset (10.0.10)
- expo-constants (16.0.2)
- expo-file-system (17.0.1)
- expo-font (12.0.10)
- expo-keep-awake (13.0.2)
- expo-local-authentication (14.0.1)
- expo-modules-core (1.12.26)
- expo-secure-store (13.0.2)
- my-voice-module (UNVERSIONED)
> Task :my-voice-module:compileDebugKotlin FAILED
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:18:9 Unresolved reference: Method
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:21:21 Unresolved reference: runOnUiThread
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:35:9 Unresolved reference: Method
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:38:21 Unresolved reference: runOnUiThread
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:45:9 Unresolved reference: OnEvent
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:46:9 Unresolved reference: OnEvent
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:47:9 Unresolved reference: OnEvent
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:48:9 Unresolved reference: OnEvent
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:49:9 Unresolved reference: OnEvent
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:50:9 Unresolved reference: OnEvent
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:55:13 Unresolved reference: eventEmitter
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:59:13 Unresolved reference: eventEmitter
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:67:13 Unresolved reference: eventEmitter
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:71:13 Unresolved reference: eventEmitter
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:77:17 Unresolved reference: eventEmitter
e: file:///Users/gualter/Desktop/my-expo-app/modules/my-voice-module/android/src/main/java/expo/modules/myvoicemodule/MyVoiceModule.kt:84:17 Unresolved reference: eventEmitter
FAILURE: Build failed with an exception.
Подробнее здесь: https://stackoverflow.com/questions/792 ... runandroid