Skip to content

Commit c4382df

Browse files
committed
fix: enhance vad logic and settings
- Move AI interruption from onSpeechStart to onSpeechRealStart for better accuracy - Save/restore AI state around speech detection to prevent misfire disruption - Add bilingual misfire messages explaining voice too brief + troubleshooting tips -Implement help icons for technical VAD parameters (thresholds, frames)
1 parent e7a9255 commit c4382df

File tree

8 files changed

+168
-82
lines changed

8 files changed

+168
-82
lines changed

package-lock.json

Lines changed: 55 additions & 52 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"@electron-toolkit/preload": "^3.0.1",
3232
"@electron-toolkit/utils": "^3.0.0",
3333
"@emotion/react": "^11.14.0",
34-
"@ricky0123/vad-web": "^0.0.22",
34+
"@ricky0123/vad-web": "^0.0.24",
3535
"clsx": "^2.1.1",
3636
"date-fns": "^4.1.0",
3737
"electron-updater": "^6.1.7",
@@ -41,6 +41,7 @@
4141
"i18next-browser-languagedetector": "^8.0.5",
4242
"i18next-scanner": "^4.6.0",
4343
"next-themes": "^0.4.4",
44+
"onnxruntime-web": "1.14.0",
4445
"react": "^18.3.1",
4546
"react-dom": "^18.3.1",
4647
"react-i18next": "^15.5.1",

src/main/index.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -96,18 +96,18 @@ app.whenReady().then(() => {
9696
return false;
9797
});
9898

99-
if (process.env.NODE_ENV === "development") {
100-
globalShortcut.register("F12", () => {
101-
const window = windowManager.getWindow();
102-
if (!window) return;
103-
104-
if (window.webContents.isDevToolsOpened()) {
105-
window.webContents.closeDevTools();
106-
} else {
107-
window.webContents.openDevTools();
108-
}
109-
});
110-
}
99+
// if (process.env.NODE_ENV === "development") {
100+
// globalShortcut.register("F12", () => {
101+
// const window = windowManager.getWindow();
102+
// if (!window) return;
103+
104+
// if (window.webContents.isDevToolsOpened()) {
105+
// window.webContents.closeDevTools();
106+
// } else {
107+
// window.webContents.openDevTools();
108+
// }
109+
// });
110+
// }
111111

112112
setupIPC();
113113

src/renderer/src/components/sidebar/setting/asr.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ function ASR({ onSave, onCancel }: ASRProps): JSX.Element {
6161

6262
<NumberField
6363
label={t('settings.asr.positiveSpeechThreshold')}
64+
help={t('settings.asr.positiveSpeechThresholdDesc')}
6465
value={localSettings.positiveSpeechThreshold}
6566
onChange={(value) => handleInputChange('positiveSpeechThreshold', value)}
6667
min={1}
@@ -69,6 +70,7 @@ function ASR({ onSave, onCancel }: ASRProps): JSX.Element {
6970

7071
<NumberField
7172
label={t('settings.asr.negativeSpeechThreshold')}
73+
help={t('settings.asr.negativeSpeechThresholdDesc')}
7274
value={localSettings.negativeSpeechThreshold}
7375
onChange={(value) => handleInputChange('negativeSpeechThreshold', value)}
7476
min={0}
@@ -77,6 +79,7 @@ function ASR({ onSave, onCancel }: ASRProps): JSX.Element {
7779

7880
<NumberField
7981
label={t('settings.asr.redemptionFrames')}
82+
help={t('settings.asr.redemptionFramesDesc')}
8083
value={localSettings.redemptionFrames}
8184
onChange={(value) => handleInputChange('redemptionFrames', value)}
8285
min={1}

src/renderer/src/components/sidebar/setting/common.tsx

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
/* eslint-disable react/require-default-props */
2+
import { useState } from 'react';
23
import {
3-
Text, Input, NumberInput, createListCollection,
4+
Text, Input, NumberInput, createListCollection, Flex, Box,
45
} from '@chakra-ui/react';
6+
import { HiQuestionMarkCircle } from 'react-icons/hi';
57
import { Field } from '@/components/ui/field';
68
import { Switch } from '@/components/ui/switch';
9+
import { Tooltip } from '@/components/ui/tooltip';
710
import {
811
SelectContent,
912
SelectItem,
@@ -13,6 +16,43 @@ import {
1316
} from '@/components/ui/select';
1417
import { settingStyles } from './setting-styles';
1518

19+
// Help Icon Component
20+
interface HelpIconProps {
21+
content: string;
22+
}
23+
24+
function HelpIcon({ content }: HelpIconProps): JSX.Element {
25+
const [isHovering, setIsHovering] = useState(false);
26+
27+
const handleMouseEnter = () => setIsHovering(true);
28+
const handleMouseLeave = () => setIsHovering(false);
29+
30+
return (
31+
<Tooltip
32+
showArrow
33+
content={
34+
<Text fontSize="sm" maxW="300px" lineHeight="1.4">
35+
{content}
36+
</Text>
37+
}
38+
open={isHovering}
39+
>
40+
<Box
41+
as={HiQuestionMarkCircle}
42+
color="gray.400"
43+
_hover={{ color: 'gray.600' }}
44+
cursor="help"
45+
w="16px"
46+
h="16px"
47+
ml="2"
48+
transition="color 0.2s"
49+
onMouseEnter={handleMouseEnter}
50+
onMouseLeave={handleMouseLeave}
51+
/>
52+
</Tooltip>
53+
);
54+
}
55+
1656
// Common Props Types
1757
interface SelectFieldProps {
1858
label: string
@@ -30,12 +70,14 @@ interface NumberFieldProps {
3070
max?: number
3171
step?: number
3272
allowMouseWheel?: boolean
73+
help?: string
3374
}
3475

3576
interface SwitchFieldProps {
3677
label: string
3778
checked: boolean
3879
onChange: (checked: boolean) => void
80+
help?: string
3981
}
4082

4183
interface InputFieldProps {
@@ -87,11 +129,17 @@ export function NumberField({
87129
max,
88130
step,
89131
allowMouseWheel,
132+
help,
90133
}: NumberFieldProps): JSX.Element {
91134
return (
92135
<Field
93136
{...settingStyles.common.field}
94-
label={<Text {...settingStyles.common.fieldLabel}>{label}</Text>}
137+
label={
138+
<Flex align="center">
139+
<Text {...settingStyles.common.fieldLabel}>{label}</Text>
140+
{help && <HelpIcon content={help} />}
141+
</Flex>
142+
}
95143
>
96144
<NumberInput.Root
97145
{...settingStyles.common.numberInput.root}
@@ -112,11 +160,16 @@ export function NumberField({
112160
);
113161
}
114162

115-
export function SwitchField({ label, checked, onChange }: SwitchFieldProps): JSX.Element {
163+
export function SwitchField({ label, checked, onChange, help }: SwitchFieldProps): JSX.Element {
116164
return (
117165
<Field
118166
{...settingStyles.common.field}
119-
label={<Text {...settingStyles.common.fieldLabel}>{label}</Text>}
167+
label={
168+
<Flex align="center">
169+
<Text {...settingStyles.common.fieldLabel}>{label}</Text>
170+
{help && <HelpIcon content={help} />}
171+
</Flex>
172+
}
120173
>
121174
<Switch
122175
{...settingStyles.common.switch}

0 commit comments

Comments
 (0)