1111 * 渲染进程 asrTranscriber.ts 无需任何改动即可切换引擎。
1212 */
1313
14- import { ipcMain , BrowserWindow } from 'electron' ;
14+ import { BrowserWindow } from 'electron' ;
15+ import { safeHandle } from '../../ipcUtils.js' ;
1516import { logger } from '../../logger.js' ;
1617import {
1718 getLocalAsrConfig ,
@@ -41,7 +42,7 @@ export function registerLocalAsrHandlers(): void {
4142 // ── 转写(核心接口,渲染进程 asrTranscriber.ts 调用) ──
4243 // TODO(P1-3): 本 IPC payload 暂未含可选 hotwords 字段——SenseVoice/Paraformer
4344 // 不支持热词(详见 SherpaAsrService.ts 的 TODO 结论),届时新增字段须保持旧载荷兼容
44- ipcMain . handle (
45+ safeHandle (
4546 'local_asr_transcribe' ,
4647 async ( _event , args : {
4748 audioBase64 : string ;
@@ -62,16 +63,16 @@ export function registerLocalAsrHandlers(): void {
6263 ) ;
6364
6465 // ── 配置 ──
65- ipcMain . handle ( 'local_asr_get_config' , ( ) => {
66+ safeHandle ( 'local_asr_get_config' , async ( ) => {
6667 return getLocalAsrConfig ( ) ;
6768 } ) ;
6869
69- ipcMain . handle ( 'local_asr_update_config' , async ( _event , partial : Partial < LocalAsrConfig > ) => {
70+ safeHandle ( 'local_asr_update_config' , async ( _event , partial : Partial < LocalAsrConfig > ) => {
7071 return updateLocalAsrConfig ( partial ) ;
7172 } ) ;
7273
7374 // ── 可用性检测 ──
74- ipcMain . handle ( 'local_asr_check_available' , async ( ) => {
75+ safeHandle ( 'local_asr_check_available' , async ( ) => {
7576 const available = await checkLocalAsrAvailable ( ) ;
7677 const config = getLocalAsrConfig ( ) ;
7778 return {
@@ -84,13 +85,13 @@ export function registerLocalAsrHandlers(): void {
8485
8586 // ── 真流式 ASR(Paraformer 在线,课堂 smart 采集实时转录) ──
8687 // 渲染进程据此决定是否走真流式链路(否则回退按段转写)
87- ipcMain . handle ( 'local_asr_stream_available' , ( ) => {
88+ safeHandle ( 'local_asr_stream_available' , async ( ) => {
8889 return { available : isStreamingAsrAvailable ( ) } ;
8990 } ) ;
9091
9192 // 启动真流式:创建在线流,后续音频块经 mediaCaptureHandlers 喂入,
9293 // partial/final 结果经 asr_stream_partial / asr_stream_final 事件推回渲染进程
93- ipcMain . handle (
94+ safeHandle (
9495 'local_asr_stream_start' ,
9596 async ( event , args : { sampleRate ?: number } ) => {
9697 const win = BrowserWindow . fromWebContents ( event . sender ) ;
@@ -101,20 +102,20 @@ export function registerLocalAsrHandlers(): void {
101102 } ,
102103 ) ;
103104
104- ipcMain . handle ( 'local_asr_stream_stop' , async ( ) => {
105+ safeHandle ( 'local_asr_stream_stop' , async ( ) => {
105106 stopStreamingAsr ( ) ;
106107 return { success : true } ;
107108 } ) ;
108109
109110 // ── 模型管理 ──
110- ipcMain . handle ( 'local_asr_get_models' , ( ) => {
111+ safeHandle ( 'local_asr_get_models' , async ( ) => {
111112 return {
112113 models : getModelsStatus ( ) ,
113114 download : getDownloadStatus ( ) ,
114115 } ;
115116 } ) ;
116117
117- ipcMain . handle (
118+ safeHandle (
118119 'local_asr_download_model' ,
119120 async ( _event , args : { engine : AsrEngine } ) => {
120121 logger . info ( `[LocalASR] IPC download request: engine=${ args . engine } ` ) ;
@@ -123,7 +124,7 @@ export function registerLocalAsrHandlers(): void {
123124 } ,
124125 ) ;
125126
126- ipcMain . handle (
127+ safeHandle (
127128 'local_asr_delete_model' ,
128129 async ( _event , args : { engine : AsrEngine } ) => {
129130 await deleteModel ( args . engine ) ;
0 commit comments