From ae0d53e295ad581d2c364b86f6f58eaa2721e57b Mon Sep 17 00:00:00 2001 From: ydy0615 Date: Sat, 11 Apr 2026 10:21:22 +0800 Subject: [PATCH] fix(tts): use temporary file for WAV encoding to avoid BytesIO limitation fix(UniverPreview): update error messages and hints for document loading --- backend/tts_asr.py | 13 ++++++++++--- src/components/UniverPreview.vue | 32 ++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/backend/tts_asr.py b/backend/tts_asr.py index f0ffe8d..c3d3a9d 100644 --- a/backend/tts_asr.py +++ b/backend/tts_asr.py @@ -214,10 +214,17 @@ async def tts_endpoint(req: TTSRequest): # 编码 WAV 到内存 try: + import tempfile import soundfile as sf - bio = BytesIO() - sf.write(bio, wav_data, sr, format="WAV") - audio_bytes = bio.getvalue() + # soundfile 不支持直接写入 BytesIO,需要用临时文件 + with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp: + tmp_path = tmp.name + sf.write(tmp_path, wav_data, sr, format="WAV") + with open(tmp_path, "rb") as f: + audio_bytes = f.read() + # 清理临时文件 + import os as _os + _os.unlink(tmp_path) except Exception as e: logger.exception("音频编码失败") raise HTTPException(status_code=500, detail=f"音频编码失败: {e}") diff --git a/src/components/UniverPreview.vue b/src/components/UniverPreview.vue index e3fcdab..a724dc3 100644 --- a/src/components/UniverPreview.vue +++ b/src/components/UniverPreview.vue @@ -39,17 +39,18 @@
-
-
-
正在初始化 Univer 引擎...
-
-
+
+
+
正在初始化 Univer 引擎...
+
提示:当前为空白预览模式
+
+
预览初始化失败
{{ error }}
-

提示:纯前端模式下仅支持空白文档创建。如需加载实际的 Office 文件内容,请确保后端服务已配置导入功能。

+

提示:当前为空白文档预览模式,Univer 开源版本不支持直接加载 Office 文件内容。

@@ -129,32 +130,35 @@ const loadDocumentIntoUniver = async (instance, blob, fileName, fmt) => { const lowerFmt = (fmt || '').toLowerCase(); console.log(`[Univer] 开始加载文档: ${fileName}, 格式: ${lowerFmt}`); - // 重要提示:Univer 纯前端模式不支持直接加载 DOCX/XLSX/PPTX 文件 - // 这些格式需要后端服务进行转换 + // 重要说明: + // Univer 开源版本不支持直接导入 DOCX/XLSX/PPTX 文件 + // 导入功能需要 @univerjs-pro/exchange-client(Pro 版本) // 当前实现创建空白文档作为预览占位符 - + + console.warn('[Univer] 开源版本不支持导入 Office 文件,创建空白文档'); + console.warn('[Univer] 如需导入功能,请使用 Univer Pro 版本'); + + // Fallback: 创建空白文档 try { - // 尝试创建对应格式的空白文档 if (lowerFmt === 'xlsx') { await univerAPI.createWorkbook({}); console.log('[Univer] 创建空白 Excel 工作簿'); } else if (lowerFmt === 'pptx') { - // PPTX: 尝试使用 Slides API,如果不可用则降级到 Docs + // 尝试 Slides API if (typeof univerAPI.createUniverSlide === 'function') { await univerAPI.createUniverSlide({}); console.log('[Univer] 创建空白 PPT 演示文稿'); } else { await univerAPI.createUniverDoc({}); - console.log('[Univer] Slides API 不可用,创建空白文档'); + console.log('[Univer] 创建空白文档(Slides API 不可用)'); } } else { - // DOCX 和默认情况 await univerAPI.createUniverDoc({}); console.log('[Univer] 创建空白 Word 文档'); } } catch (e) { console.error('[Univer] 创建文档失败:', e); - throw new Error(`无法创建 ${lowerFmt.toUpperCase()} 文档: ${e.message}`); + throw new Error(`无法创建文档: ${e.message}`); } };