@@ -9,6 +9,7 @@ import { db } from '../lib/db';
9
9
import { useSerialPorts } from '../hooks/useSerialPorts' ;
10
10
import { RefreshCw } from 'lucide-react' ;
11
11
import { invoke } from '@tauri-apps/api' ;
12
+ import { Label } from "@/components/ui/label" ;
12
13
13
14
interface Device {
14
15
deviceId : string ;
@@ -38,6 +39,12 @@ export const SettingsPanel: React.FC<SettingsPanelProps> = ({ setIsConfigured })
38
39
bytedance_tts_appId : '' ,
39
40
bytedance_tts_token : '' ,
40
41
bytedance_tts_cluster : '' ,
42
+ bytedance_tts_voiceAppId : '' ,
43
+ bytedance_tts_voiceAccessToken : '' ,
44
+ bytedance_tts_asrAppId : '' ,
45
+ tencent_asr_appId : '' ,
46
+ tencent_asr_secretId : '' ,
47
+ tencent_asr_secretKey : ''
41
48
} ) ;
42
49
43
50
const [ devices , setDevices ] = useState < Device [ ] > ( [ ] ) ;
@@ -78,7 +85,29 @@ export const SettingsPanel: React.FC<SettingsPanelProps> = ({ setIsConfigured })
78
85
} ) ) ;
79
86
} ;
80
87
81
- const saveSettings = async ( ) => {
88
+ const validateVoiceSettings = ( ) => {
89
+ const { bytedance_tts_voiceAppId, bytedance_tts_voiceAccessToken } = settings ;
90
+ const missingFields = [ ] ;
91
+
92
+ if ( ! bytedance_tts_voiceAppId ) {
93
+ missingFields . push ( '语音应用ID' ) ;
94
+ }
95
+ if ( ! bytedance_tts_voiceAccessToken ) {
96
+ missingFields . push ( '访问令牌' ) ;
97
+ }
98
+
99
+ if ( missingFields . length > 0 ) {
100
+ alert ( `请完善以下语音识别设置:\n${ missingFields . join ( '\n' ) } ` ) ;
101
+ return false ;
102
+ }
103
+ return true ;
104
+ } ;
105
+
106
+ const handleSave = async ( ) => {
107
+ if ( ! validateVoiceSettings ( ) ) {
108
+ console . error ( 'Voice recognition settings are incomplete' ) ;
109
+ return ;
110
+ }
82
111
const settingsToSave = Object . entries ( settings ) . map ( ( [ key , value ] ) => ( {
83
112
key,
84
113
value
@@ -151,6 +180,8 @@ export const SettingsPanel: React.FC<SettingsPanelProps> = ({ setIsConfigured })
151
180
< TabsTrigger value = "device" > 设备设置</ TabsTrigger >
152
181
< TabsTrigger value = "tts" > TTS设置</ TabsTrigger >
153
182
< TabsTrigger value = "bytedance_tts" > ByteDance TTS设置</ TabsTrigger >
183
+ < TabsTrigger value = "bytedance_shibie" > ByteDance 实时语音识别设置</ TabsTrigger >
184
+ < TabsTrigger value = "tentcent_asr" > 腾讯云 实时语音识别设置</ TabsTrigger >
154
185
</ TabsList >
155
186
< TabsContent value = "api" >
156
187
< Card >
@@ -344,6 +375,7 @@ export const SettingsPanel: React.FC<SettingsPanelProps> = ({ setIsConfigured })
344
375
< div >
345
376
< label className = "block mb-1" > Token</ label >
346
377
< Input
378
+ type = "password"
347
379
value = { settings . bytedance_tts_token }
348
380
onChange = { ( e ) => handleChange ( 'bytedance_tts_token' , e . target . value ) }
349
381
/>
@@ -355,12 +387,76 @@ export const SettingsPanel: React.FC<SettingsPanelProps> = ({ setIsConfigured })
355
387
onChange = { ( e ) => handleChange ( 'bytedance_tts_cluster' , e . target . value ) }
356
388
/>
357
389
</ div >
390
+
391
+ </ div >
392
+ </ CardContent >
393
+ </ Card >
394
+ </ TabsContent >
395
+ < TabsContent value = "bytedance_shibie" >
396
+ < Card >
397
+ < CardHeader > ByteDance 实时语音识别设置</ CardHeader >
398
+ < CardContent >
399
+ < div className = "space-y-4" >
400
+ < div className = "pt-6" >
401
+ < div className = "space-y-4" >
402
+ < div >
403
+ < Label htmlFor = "voiceAppId" > 语音应用ID</ Label >
404
+ < Input
405
+ id = "voiceAppId"
406
+ value = { settings . bytedance_tts_voiceAppId }
407
+ onChange = { ( e ) => handleChange ( 'bytedance_tts_voiceAppId' , e . target . value ) }
408
+ placeholder = "输入语音应用ID"
409
+ />
410
+ </ div >
411
+ < div >
412
+ < Label htmlFor = "voiceAccessToken" > 访问令牌</ Label >
413
+ < Input
414
+ id = "voiceAccessToken"
415
+ value = { settings . bytedance_tts_voiceAccessToken }
416
+ onChange = { ( e ) => handleChange ( 'bytedance_tts_voiceAccessToken' , e . target . value ) }
417
+ placeholder = "输入访问令牌"
418
+ />
419
+ </ div >
420
+ </ div >
421
+ </ div >
422
+ </ div >
423
+ </ CardContent >
424
+ </ Card >
425
+ </ TabsContent >
426
+ < TabsContent value = "tentcent_asr" >
427
+ < Card >
428
+ < CardHeader > 腾讯云 实时语音识别设置</ CardHeader >
429
+ < CardContent >
430
+ < div className = "space-y-4" >
431
+ < div >
432
+ < label className = "block mb-1" > App ID</ label >
433
+ < Input
434
+ value = { settings . tencent_asr_appId }
435
+ onChange = { ( e ) => handleChange ( 'tencent_asr_appId' , e . target . value ) }
436
+ />
437
+ </ div >
438
+ < div >
439
+ < label className = "block mb-1" > Secret ID</ label >
440
+ < Input
441
+ value = { settings . tencent_asr_secretId }
442
+ onChange = { ( e ) => handleChange ( 'tencent_asr_secretId' , e . target . value ) }
443
+ />
444
+ </ div >
445
+ < div >
446
+ < label className = "block mb-1" > Secret Key</ label >
447
+ < Input
448
+ type = "password"
449
+ value = { settings . tencent_asr_secretKey }
450
+ onChange = { ( e ) => handleChange ( 'tencent_asr_secretKey' , e . target . value ) }
451
+ />
452
+ </ div >
358
453
</ div >
454
+
359
455
</ CardContent >
360
456
</ Card >
361
457
</ TabsContent >
362
458
</ Tabs >
363
- < Button onClick = { saveSettings } className = "mt-4" > 保存所有设置</ Button >
459
+ < Button onClick = { handleSave } className = "mt-4" > 保存所有设置</ Button >
364
460
</ div >
365
461
) ;
366
462
} ;
0 commit comments