Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 24 additions & 11 deletions src/SpeechRecognition.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
import { useCallback, useEffect, useReducer, useRef, useState } from "react";
import NativeSpeechRecognition from "./NativeSpeechRecognition";
import RecognitionManager from "./RecognitionManager";
import { appendTranscript, clearTranscript } from "./actions";
import isAndroid from "./isAndroid";
import { transcriptReducer } from "./reducers";
import {
Expand All @@ -10,6 +7,9 @@ import {
compareTwoStringsUsingDiceCoefficient,
concatTranscripts,
} from "./utils";
import { clearTranscript, appendTranscript, mutateTranscript } from "./actions";
import RecognitionManager from "./RecognitionManager";
import NativeSpeechRecognition from "./NativeSpeechRecognition";

let _browserSupportsSpeechRecognition = !!NativeSpeechRecognition;
let _browserSupportsContinuousListening =
Expand All @@ -22,7 +22,7 @@ const useSpeechRecognition = ({
commands = [],
} = {}) => {
const [recognitionManager] = useState(
SpeechRecognition.getRecognitionManager(),
SpeechRecognition.getRecognitionManager()
);
const [
browserSupportsSpeechRecognition,
Expand All @@ -37,11 +37,11 @@ const useSpeechRecognition = ({
{
interimTranscript: recognitionManager.interimTranscript,
finalTranscript: "",
},
}
);
const [listening, setListening] = useState(recognitionManager.listening);
const [isMicrophoneAvailable, setMicrophoneAvailable] = useState(
recognitionManager.isMicrophoneAvailable,
recognitionManager.isMicrophoneAvailable
);
const commandsRef = useRef(commands);
commandsRef.current = commands;
Expand All @@ -50,11 +50,23 @@ const useSpeechRecognition = ({
dispatch(clearTranscript());
};

const dispatchMutateTranscript = (mutatedTranscript) => {
dispatch(mutateTranscript(mutatedTranscript));
};

const resetTranscript = useCallback(() => {
recognitionManager.resetTranscript();
dispatchClearTranscript();
}, [recognitionManager]);

const editTranscript = useCallback(
(mutatedTranscript) => {
recognitionManager.resetTranscript();
dispatchMutateTranscript(mutatedTranscript);
},
[recognitionManager]
);

const testFuzzyMatch = (command, input, fuzzyMatchingThreshold) => {
const commandToString =
typeof command === "object" ? command.toString() : command;
Expand All @@ -64,7 +76,7 @@ const useSpeechRecognition = ({
.trim();
const howSimilar = compareTwoStringsUsingDiceCoefficient(
commandWithoutSpecials,
input,
input
);
if (howSimilar >= fuzzyMatchingThreshold) {
return {
Expand Down Expand Up @@ -111,7 +123,7 @@ const useSpeechRecognition = ({
return testFuzzyMatch(
subcommand,
input,
fuzzyMatchingThreshold,
fuzzyMatchingThreshold
);
}
return testMatch(subcommand, input);
Expand All @@ -138,10 +150,10 @@ const useSpeechRecognition = ({
}
});
}
},
}
);
},
[resetTranscript],
[resetTranscript]
);

const handleTranscriptChange = useCallback(
Expand All @@ -151,7 +163,7 @@ const useSpeechRecognition = ({
}
matchCommands(newInterimTranscript, newFinalTranscript);
},
[matchCommands, transcribing],
[matchCommands, transcribing]
);

const handleClearTranscript = useCallback(() => {
Expand Down Expand Up @@ -196,6 +208,7 @@ const useSpeechRecognition = ({
resetTranscript,
browserSupportsSpeechRecognition,
browserSupportsContinuousListening,
editTranscript,
};
};
const SpeechRecognition = {
Expand Down
15 changes: 14 additions & 1 deletion src/actions.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
import { APPEND_TRANSCRIPT, CLEAR_TRANSCRIPT } from "./constants";
import {
CLEAR_TRANSCRIPT,
APPEND_TRANSCRIPT,
MUTATE_TRANSCRIPT,
} from "./constants";

export const clearTranscript = () => {
return { type: CLEAR_TRANSCRIPT };
Expand All @@ -13,3 +17,12 @@ export const appendTranscript = (interimTranscript, finalTranscript) => {
},
};
};

export const mutateTranscript = (mutatedTranscript) => {
return {
type: MUTATE_TRANSCRIPT,
payload: {
mutatedTranscript,
},
};
};
1 change: 1 addition & 0 deletions src/constants.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export const CLEAR_TRANSCRIPT = "CLEAR_TRANSCRIPT";
export const APPEND_TRANSCRIPT = "APPEND_TRANSCRIPT";
export const MUTATE_TRANSCRIPT = "MUTATE_TRANSCRIPT";
13 changes: 11 additions & 2 deletions src/reducers.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
import { APPEND_TRANSCRIPT, CLEAR_TRANSCRIPT } from "./constants";
import {
CLEAR_TRANSCRIPT,
APPEND_TRANSCRIPT,
MUTATE_TRANSCRIPT,
} from "./constants";
import { concatTranscripts } from "./utils";

const transcriptReducer = (state, action) => {
Expand All @@ -13,9 +17,14 @@ const transcriptReducer = (state, action) => {
interimTranscript: action.payload.interimTranscript,
finalTranscript: concatTranscripts(
state.finalTranscript,
action.payload.finalTranscript,
action.payload.finalTranscript
),
};
case MUTATE_TRANSCRIPT:
return {
interimTranscript: "",
finalTranscript: action.payload.mutatedTranscript,
};
default:
throw new Error();
}
Expand Down
Loading