Skip to content

Commit 0970249

Browse files
committed
feat: avoid re-sending language detection event if last detected language or confidence don't change
1 parent 9076e15 commit 0970249

File tree

2 files changed

+33
-9
lines changed

2 files changed

+33
-9
lines changed

android/src/main/java/expo/modules/speechrecognition/ExpoSpeechService.kt

+23-6
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ class ExpoSpeechService(
6060
private var delayedFileStreamer: DelayedFileStreamer? = null
6161
private var soundState = SoundState.INACTIVE
6262

63+
private var lastDetectedLanguage: String? = null
64+
private var lastLanguageConfidence: Float? = null
65+
6366
var recognitionState = RecognitionState.INACTIVE
6467

6568
companion object {
@@ -121,6 +124,8 @@ class ExpoSpeechService(
121124
audioRecorder = null
122125
delayedFileStreamer?.close()
123126
delayedFileStreamer = null
127+
lastDetectedLanguage = null
128+
lastLanguageConfidence = null
124129
recognitionState = RecognitionState.STARTING
125130
soundState = SoundState.INACTIVE
126131
lastVolumeChangeEventTime = 0L
@@ -435,7 +440,7 @@ class ExpoSpeechService(
435440
when {
436441
// File URI
437442
sourceUri.startsWith("file://") -> File(URI(sourceUri))
438-
443+
439444
// Local file path without URI scheme
440445
!sourceUri.startsWith("https://") -> File(sourceUri)
441446

@@ -624,11 +629,23 @@ class ExpoSpeechService(
624629
}
625630

626631
override fun onLanguageDetection(results: Bundle) {
627-
sendEvent("languagedetection", mapOf(
628-
"detectedLanguage" to results.getString(SpeechRecognizer.DETECTED_LANGUAGE),
629-
"confidence" to languageDetectionConfidenceLevelToFloat(results.getInt(SpeechRecognizer.LANGUAGE_DETECTION_CONFIDENCE_LEVEL)),
630-
"topLocaleAlternatives" to results.getStringArrayList(SpeechRecognizer.TOP_LOCALE_ALTERNATIVES)
631-
))
632+
val detectedLanguage = results.getString(SpeechRecognizer.DETECTED_LANGUAGE)
633+
val confidence = languageDetectionConfidenceLevelToFloat(results.getInt(SpeechRecognizer.LANGUAGE_DETECTION_CONFIDENCE_LEVEL))
634+
635+
// Only send event if language or confidence has changed
636+
if (detectedLanguage != lastDetectedLanguage || confidence != lastLanguageConfidence) {
637+
lastDetectedLanguage = detectedLanguage
638+
lastLanguageConfidence = confidence
639+
640+
sendEvent(
641+
"languagedetection",
642+
mapOf(
643+
"detectedLanguage" to detectedLanguage,
644+
"confidence" to confidence,
645+
"topLocaleAlternatives" to results.getStringArrayList(SpeechRecognizer.TOP_LOCALE_ALTERNATIVES),
646+
),
647+
)
648+
}
632649
}
633650

634651
/**

example/App.tsx

+10-3
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,6 @@ export default function App() {
9393
const transcript = ev.results[0]?.transcript || "";
9494

9595
setTranscription((current) => {
96-
// When a final result comes in, we need to update the base transcript to build off from
97-
// Because on Android and Web, multiple final results can be returned within a continuous session
9896
// When a final result is received, any following recognized transcripts will omit the previous final result
9997
const transcriptTally = ev.isFinal
10098
? (current?.transcriptTally ?? "") + transcript
@@ -126,6 +124,10 @@ export default function App() {
126124
console.log("[event]: nomatch");
127125
});
128126

127+
useSpeechRecognitionEvent("languagedetection", (ev) => {
128+
console.log("[event]: languagedetection", ev);
129+
});
130+
129131
const startListening = () => {
130132
if (status !== "idle") {
131133
return;
@@ -574,7 +576,12 @@ function GeneralSettings(props: {
574576
: locale
575577
}
576578
active={settings.lang === locale}
577-
onPress={() => handleChange("lang", locale)}
579+
onPress={() =>
580+
handleChange(
581+
"lang",
582+
settings.lang === locale ? undefined : locale,
583+
)
584+
}
578585
/>
579586
);
580587
})}

0 commit comments

Comments
 (0)