-
Notifications
You must be signed in to change notification settings - Fork 60k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
test stt #5634
base: main
Are you sure you want to change the base?
test stt #5634
Changes from 3 commits
ec28338
76faff0
8ec4df4
6e38569
d7eee52
5999604
80a7a1d
43d3824
5e514c5
b91c224
7475519
f0b9068
b5a5558
0ea650d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -180,6 +180,47 @@ export class ChatGPTApi implements LLMApi { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
async transcription(options: TranscriptionOptions): Promise<string> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const formData = new FormData(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
formData.append("file", options.file, "audio.wav"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
formData.append("model", options.model ?? "whisper-1"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (options.language) formData.append("language", options.language); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (options.prompt) formData.append("prompt", options.prompt); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (options.response_format) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
formData.append("response_format", options.response_format); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (options.temperature) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
formData.append("temperature", options.temperature.toString()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log("[Request] openai audio transcriptions payload: ", options); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const controller = new AbortController(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
options.onController?.(controller); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const path = this.path(OpenaiPath.TranscriptionPath, options.model); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const headers = getHeaders(true); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const payload = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
method: "POST", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
body: formData, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
signal: controller.signal, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
headers: headers, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// make a fetch request | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const requestTimeoutId = setTimeout( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
() => controller.abort(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
REQUEST_TIMEOUT_MS, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const res = await fetch(path, payload); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
clearTimeout(requestTimeoutId); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const json = await res.json(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return json.text; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+215
to
+218
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add response status check before parsing JSON In lines 214-217, the code attempts to parse the JSON response without verifying if the request was successful. If the request fails, Consider checking const res = await fetch(path, payload);
clearTimeout(requestTimeoutId);
+ if (!res.ok) {
+ const errorText = await res.text();
+ console.error(`[Response] Transcription request failed: ${errorText}`);
+ throw new Error(`Transcription request failed with status ${res.status}`);
+ }
const json = await res.json();
return json.text; 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} catch (e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log("[Request] failed to make a audio transcriptions request", e); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw e; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Enhance error handling and response parsing in the The
Consider applying the following improvements:
} catch (e) {
- console.log("[Request] failed to make a audio transcriptions request", e);
- throw e;
+ console.error("[Request] failed to make an audio transcriptions request", e);
+ throw new Error(`Transcription request failed: ${e.message}`);
}
const res = await fetch(path, payload);
clearTimeout(requestTimeoutId);
+if (!res.ok) {
+ throw new Error(`Transcription request failed with status ${res.status}`);
+}
const json = await res.json();
-return json.text;
+return json.text ?? '';
const payload = {
method: "POST",
body: formData,
signal: controller.signal,
- headers: headers,
+ headers,
}; These changes will improve the robustness and reliability of the 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
async chat(options: ChatOptions) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const modelConfig = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
...useAppConfig.getState().modelConfig, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -10,6 +10,7 @@ import React, { | |||||||||||||||||||||||
} from "react"; | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
import SendWhiteIcon from "../icons/send-white.svg"; | ||||||||||||||||||||||||
import VoiceWhiteIcon from "../icons/voice-white.svg"; | ||||||||||||||||||||||||
import BrainIcon from "../icons/brain.svg"; | ||||||||||||||||||||||||
import RenameIcon from "../icons/rename.svg"; | ||||||||||||||||||||||||
import ExportIcon from "../icons/share.svg"; | ||||||||||||||||||||||||
|
@@ -72,6 +73,7 @@ import { | |||||||||||||||||||||||
isDalle3, | ||||||||||||||||||||||||
showPlugins, | ||||||||||||||||||||||||
safeLocalStorage, | ||||||||||||||||||||||||
isFirefox, | ||||||||||||||||||||||||
} from "../utils"; | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
import { uploadImage as uploadImageRemote } from "@/app/utils/chat"; | ||||||||||||||||||||||||
|
@@ -97,8 +99,9 @@ import { | |||||||||||||||||||||||
} from "./ui-lib"; | ||||||||||||||||||||||||
import { useNavigate } from "react-router-dom"; | ||||||||||||||||||||||||
import { | ||||||||||||||||||||||||
CHAT_PAGE_SIZE, | ||||||||||||||||||||||||
DEFAULT_STT_ENGINE, | ||||||||||||||||||||||||
DEFAULT_TTS_ENGINE, | ||||||||||||||||||||||||
FIREFOX_DEFAULT_STT_ENGINE, | ||||||||||||||||||||||||
ModelProvider, | ||||||||||||||||||||||||
Path, | ||||||||||||||||||||||||
REQUEST_TIMEOUT_MS, | ||||||||||||||||||||||||
|
@@ -118,6 +121,7 @@ import { MultimodalContent } from "../client/api"; | |||||||||||||||||||||||
const localStorage = safeLocalStorage(); | ||||||||||||||||||||||||
import { ClientApi } from "../client/api"; | ||||||||||||||||||||||||
import { createTTSPlayer } from "../utils/audio"; | ||||||||||||||||||||||||
import { OpenAITranscriptionApi, WebTranscriptionApi } from "../utils/speech"; | ||||||||||||||||||||||||
import { MsEdgeTTS, OUTPUT_FORMAT } from "../utils/ms_edge_tts"; | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
const ttsPlayer = createTTSPlayer(); | ||||||||||||||||||||||||
|
@@ -546,6 +550,44 @@ export function ChatActions(props: { | |||||||||||||||||||||||
} | ||||||||||||||||||||||||
}, [chatStore, currentModel, models]); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
const [isListening, setIsListening] = useState(false); | ||||||||||||||||||||||||
const [isTranscription, setIsTranscription] = useState(false); | ||||||||||||||||||||||||
const [speechApi, setSpeechApi] = useState<any>(null); | ||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Consider using a more specific type for speechApi state The - const [speechApi, setSpeechApi] = useState<any>(null);
+ const [speechApi, setSpeechApi] = useState<WebTranscriptionApi | OpenAITranscriptionApi | null>(null); 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||
|
||||||||||||||||||||||||
useEffect(() => { | ||||||||||||||||||||||||
if (isFirefox()) config.sttConfig.engine = FIREFOX_DEFAULT_STT_ENGINE; | ||||||||||||||||||||||||
setSpeechApi( | ||||||||||||||||||||||||
config.sttConfig.engine === DEFAULT_STT_ENGINE | ||||||||||||||||||||||||
? new WebTranscriptionApi((transcription) => | ||||||||||||||||||||||||
onRecognitionEnd(transcription), | ||||||||||||||||||||||||
) | ||||||||||||||||||||||||
: new OpenAITranscriptionApi((transcription) => | ||||||||||||||||||||||||
onRecognitionEnd(transcription), | ||||||||||||||||||||||||
), | ||||||||||||||||||||||||
); | ||||||||||||||||||||||||
}, []); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
const startListening = async () => { | ||||||||||||||||||||||||
if (speechApi) { | ||||||||||||||||||||||||
await speechApi.start(); | ||||||||||||||||||||||||
setIsListening(true); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
}; | ||||||||||||||||||||||||
const stopListening = async () => { | ||||||||||||||||||||||||
if (speechApi) { | ||||||||||||||||||||||||
if (config.sttConfig.engine !== DEFAULT_STT_ENGINE) | ||||||||||||||||||||||||
setIsTranscription(true); | ||||||||||||||||||||||||
await speechApi.stop(); | ||||||||||||||||||||||||
setIsListening(false); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
}; | ||||||||||||||||||||||||
const onRecognitionEnd = (finalTranscript: string) => { | ||||||||||||||||||||||||
console.log(finalTranscript); | ||||||||||||||||||||||||
if (finalTranscript) props.setUserInput(finalTranscript); | ||||||||||||||||||||||||
if (config.sttConfig.engine !== DEFAULT_STT_ENGINE) | ||||||||||||||||||||||||
setIsTranscription(false); | ||||||||||||||||||||||||
}; | ||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove console.log in production code There's a const onRecognitionEnd = (finalTranscript: string) => {
- console.log(finalTranscript);
if (finalTranscript) props.setUserInput(finalTranscript);
if (config.sttConfig.engine !== DEFAULT_STT_ENGINE)
setIsTranscription(false);
}; 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||
|
||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||
<div className={styles["chat-input-actions"]}> | ||||||||||||||||||||||||
{couldStop && ( | ||||||||||||||||||||||||
|
@@ -780,6 +822,16 @@ export function ChatActions(props: { | |||||||||||||||||||||||
icon={<ShortcutkeyIcon />} | ||||||||||||||||||||||||
/> | ||||||||||||||||||||||||
)} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
{config.sttConfig.enable && ( | ||||||||||||||||||||||||
<ChatAction | ||||||||||||||||||||||||
onClick={async () => | ||||||||||||||||||||||||
isListening ? await stopListening() : await startListening() | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
text={isListening ? Locale.Chat.StopSpeak : Locale.Chat.StartSpeak} | ||||||||||||||||||||||||
icon={<VoiceWhiteIcon />} | ||||||||||||||||||||||||
/> | ||||||||||||||||||||||||
)} | ||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||
); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
@@ -1505,7 +1557,7 @@ function _Chat() { | |||||||||||||||||||||||
setAttachImages(images); | ||||||||||||||||||||||||
} | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
// 快捷键 shortcut keys | ||||||||||||||||||||||||
// 快捷键 | ||||||||||||||||||||||||
const [showShortcutKeyModal, setShowShortcutKeyModal] = useState(false); | ||||||||||||||||||||||||
|
||||||||||||||||||||||||
useEffect(() => { | ||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,51 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { STTConfig, STTConfigValidator } from "../store"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import Locale from "../locales"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { ListItem, Select } from "./ui-lib"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { DEFAULT_STT_ENGINES } from "../constant"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { isFirefox } from "../utils"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export function STTConfigList(props: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sttConfig: STTConfig; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
updateConfig: (updater: (config: STTConfig) => void) => void; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<ListItem | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
title={Locale.Settings.STT.Enable.Title} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
subTitle={Locale.Settings.STT.Enable.SubTitle} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<input | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type="checkbox" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
checked={props.sttConfig.enable} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onChange={(e) => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
props.updateConfig( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(config) => (config.enable = e.currentTarget.checked), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
></input> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</ListItem> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+14
to
+27
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Refactor the config update to avoid assignment in expression. The checkbox implementation for enabling/disabling STT is correct. However, the update logic can be improved to address the static analysis warning about assignment in expression. Consider refactoring the onChange={(e) =>
props.updateConfig(
- (config) => (config.enable = e.currentTarget.checked),
+ (config) => ({ ...config, enable: e.currentTarget.checked })
)
} This change creates a new object with the updated 📝 Committable suggestion
Suggested change
🧰 Tools🪛 Biome
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{!isFirefox() && ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<ListItem title={Locale.Settings.STT.Engine.Title}> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Select | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
value={props.sttConfig.engine} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onChange={(e) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
props.updateConfig( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(config) => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(config.engine = STTConfigValidator.engine( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e.currentTarget.value, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
)), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{DEFAULT_STT_ENGINES.map((v, i) => ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<option value={v} key={i}> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{v} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</option> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
))} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Select> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</ListItem> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
@import "../styles/animation.scss"; | ||
.plugin-page { | ||
height: 100%; | ||
display: flex; | ||
flex-direction: column; | ||
|
||
.plugin-page-body { | ||
padding: 20px; | ||
overflow-y: auto; | ||
|
||
.plugin-filter { | ||
width: 100%; | ||
max-width: 100%; | ||
margin-bottom: 20px; | ||
animation: slide-in ease 0.3s; | ||
height: 40px; | ||
|
||
display: flex; | ||
|
||
.search-bar { | ||
flex-grow: 1; | ||
max-width: 100%; | ||
min-width: 0; | ||
outline: none; | ||
} | ||
|
||
.search-bar:focus { | ||
border: 1px solid var(--primary); | ||
} | ||
|
||
.plugin-filter-lang { | ||
height: 100%; | ||
margin-left: 10px; | ||
} | ||
|
||
.plugin-create { | ||
height: 100%; | ||
margin-left: 10px; | ||
box-sizing: border-box; | ||
min-width: 80px; | ||
} | ||
} | ||
|
||
.plugin-item { | ||
display: flex; | ||
justify-content: space-between; | ||
padding: 20px; | ||
border: var(--border-in-light); | ||
animation: slide-in ease 0.3s; | ||
|
||
&:not(:last-child) { | ||
border-bottom: 0; | ||
} | ||
|
||
&:first-child { | ||
border-top-left-radius: 10px; | ||
border-top-right-radius: 10px; | ||
} | ||
|
||
&:last-child { | ||
border-bottom-left-radius: 10px; | ||
border-bottom-right-radius: 10px; | ||
} | ||
|
||
.plugin-header { | ||
display: flex; | ||
align-items: center; | ||
|
||
.plugin-icon { | ||
display: flex; | ||
align-items: center; | ||
justify-content: center; | ||
margin-right: 10px; | ||
} | ||
|
||
.plugin-title { | ||
.plugin-name { | ||
font-size: 14px; | ||
font-weight: bold; | ||
} | ||
.plugin-info { | ||
font-size: 12px; | ||
} | ||
.plugin-runtime-warning { | ||
font-size: 12px; | ||
color: #f86c6c; | ||
} | ||
} | ||
} | ||
|
||
.plugin-actions { | ||
display: flex; | ||
flex-wrap: nowrap; | ||
transition: all ease 0.3s; | ||
justify-content: center; | ||
align-items: center; | ||
} | ||
|
||
@media screen and (max-width: 600px) { | ||
display: flex; | ||
flex-direction: column; | ||
padding-bottom: 10px; | ||
border-radius: 10px; | ||
margin-bottom: 20px; | ||
box-shadow: var(--card-shadow); | ||
|
||
&:not(:last-child) { | ||
border-bottom: var(--border-in-light); | ||
} | ||
|
||
.plugin-actions { | ||
width: 100%; | ||
justify-content: space-between; | ||
padding-top: 10px; | ||
} | ||
} | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Incorrect number of arguments in
this.path
method callIn line 200, the
this.path
method is called with two arguments (OpenaiPath.TranscriptionPath, options.model
), but thepath
method is defined to accept only one argument. This will result in a TypeError.To fix this, update the
path
method signature to accept the optionalmodel
parameter:Ensure that you handle the
model
parameter within thepath
method as needed.