Skip to content

fix(knowledge): 转写语言改成下拉选择,不再让用户手写 zh 这种代码 - #4457

Open
linus-liu-web wants to merge 2 commits into
Tencent:mainfrom
linus-liu-web:fix/asr-language-dropdowns
Open

linus-liu-web wants to merge 2 commits into
Tencent:mainfrom
linus-liu-web:fix/asr-language-dropdowns

Conversation

@linus-liu-web

Copy link
Copy Markdown
Contributor

描述

「音频语言提示」(ASR 转写语言)原来是自由文本输入框,用户得自己回想 ASR 厂商认的短代码(zh / en / ja …)。写错了不会报错:值原样发给后端,识别质量静默变差;写 Chinese / English 更是完全不生效。用户反馈这类字段应该是下拉,不该让人手写代码。

同一个弹窗里其他语言字段都是下拉,只有它是输入框,看起来也像漏配:

控件 值 形式
分块语言(chunking languages) de / en / zh t-select multiple + creatable
图片描述语言(multimodalConfig.descriptionLanguage) Chinese / English / … t-select
ASR 语言(asrConfig.language) zh / en / … t-input 自由文本 ← 本次改掉

改动

把 UploadConfirmDialog.vue 里的 ASR 语言输入框换成 t-select:

  • 预置选项:自动检测、中文 zh、English en、日本語 ja、한국어 ko、Русский ru
  • filterable + creatable:es / fr / yue 这类列表里没有的语种仍然手输即用,不限制用户
  • clearable:清空等于留空自动检测,保持原有语义
  • 选项的 value 仍是厂商代码(zh 这种),显示名走 i18n;6 个语言包都补了
    knowledgeEditor.asr.languageAutoDetect 与 knowledgeEditor.asr.languageOptions.{zh,en,ja,ko,ru}

实现上「自动检测」不是占位符,而是列表里的一个真实选项(TDesign 里空字符串等于没选中,会退化成 placeholder)。utils/asrLanguage.ts 负责在显示值与存储值之间转换:

toAsrLanguageModel('')        // => '__auto__'(下拉里显示“自动检测”)
fromAsrLanguageModel('__auto__') // => ''(落库仍是空字符串)
fromAsrLanguageModel('es')    // => 'es'(creatable 手输的代码原样保留)

之所以不复用现有的 language.zhCN 那组 key:ko-KR / ru-RU 语言包里这几个值自己还是中文(language.zhCN 的值就是 '简体中文',zhTW 在 ko-KR 里是 '번체 중국어'),放进语言选择器会和界面语种串味,所以新增了 ASR 专用的显示名。

为什么只改这一处

main(2c0d83843)上只有这一处自由文本 ASR 语言输入:

$ git show origin/main:frontend/src/views/knowledge/KnowledgeBaseEditorModal.vue | grep -n videoConfig
(无输出,main 上没有 videoConfig)
$ grep -rn "asrConfig.language" frontend/src --include=*.vue
frontend/src/views/knowledge/components/UploadConfirmDialog.vue:576  ← 唯一的输入控件
frontend/src/views/knowledge/KnowledgeBaseEditorModal.vue:1155       ← 只回写,不渲染控件

视频处理的「转写语言」来自未合并的视频 PR(feat/video-parsing 分支第 666 行),不在 main 上,所以本 PR 不涉及——等那个 PR 合并后,同一处可以直接复用这次新增的 i18n key 和 utils/asrLanguage.ts。

兼容性

  • 值格式不变:仍然是 zh / en / … 这类 ASR 厂商代码,后端 asr_config.language 不需要改
  • 现有数据不变:库里 zh 直接命中预置项显示「中文」;历史值若不在列表里(例如 ch),下拉照样原样显示该代码,保存时不被改写
  • 清空仍是空字符串(原来「留空自动检测」的语义),payload 里 asr_config.language 始终是 string,不会变成 undefined

测试

新增 utils/asrLanguage.test.ts(值映射 / 清空 / 自定义代码 / 空白裁剪 / 非字符串兜底)与
UploadConfirmDialog.test.ts 里的下拉接线断言(不再有 t-input、选项 value 是代码、payload 透传、6 个语言包 key 齐全)。

验证

$ npx vue-tsc --noEmit -p tsconfig.app.json      # 0 error,exit 0
$ npx tsx --test "src/**/*.test.ts"
# tests 1384   # pass 1384   # fail 0
$ npx tsx --test "src/**/*.test.mjs"
# tests 420    # pass 419    # skipped 1   # fail 0   (含 styleGuard)
$ npx tsx --test src/i18n/localeKeyAudit.test.ts
# tests 15     # pass 15     # fail 0
$ npx vite build
✓ built in 23.47s

注:第二个提交修的是 main 上已经红的 assistantRefresh.test.ts——#4420 让 DataSourceSettings.vue 通过 useConnectorLabel 取数据源显示名,但 vueFixture 的依赖白名单没跟上,npm test 报 Unexpected component dependency: @/composables/useConnectorLabel。夹具里没有 i18n 运行时,注入恒等格式化即可,生产代码未改。不修它,本 PR 的 frontend CI 会继承这条红。

Checklist

  • git diff --check origin/main...HEAD 通过
  • 改动的源文件已按仓库风格格式化
  • 针对改动组件的测试通过
  • 全仓前端检查已跑(见上方输出)
  • 已自审
  • 补了覆盖该改动的测试

截图

改动是上传确认弹窗「音频处理」分区里的一个控件(输入框 → 下拉)。这里没有可运行的前端环境,无法附真实截图;控件形态与同弹窗里「图片描述语言」的 t-select 一致,宽度保持 280px。

音频 ASR 的语言字段原来是自由文本输入框,用户得自己回想 whisper 这类 ASR
厂商认的短代码(zh / en / ja …)。写错了不会报错,值会原样发给后端,
识别结果静默变差;写 Chinese / English 更是完全无效。

- 改成 t-select:自动检测 + 中文/英语/日语/韩语/俄语,选项值仍是厂商代码
- filterable + creatable:es / fr / yue 这类列表里没有的语种可以手输
- 自动检测是列表里的真实选项(空值在 TDesign 里等于没选中),选中它或
  清空后 asr_config.language 仍是 '',和原来“留空自动检测”的语义一致
- 展示名走 i18n(6 个语言包),不复用 language.zhCN 这类界面语言 key:
  ko-KR / ru-RU 里那几个值还是中文,放进语言选择器会串味

值兼容:DB 里现有的 zh 直接命中预置项;历史值若不在列表里(例如 ch),
下拉照样原样显示,保存时不被改写。
DataSourceSettings.vue 从 Tencent#4420 起通过 useConnectorLabel 解析数据源显示名,
而 vueFixture 的组件依赖是按白名单注入的,main 上这个注入一直缺着,
导致 npm test 里 "refreshes data source controls…" 直接红:
Unexpected component dependency: @/composables/useConnectorLabel。

夹具没有 i18n 运行时,注入恒等格式化即可,生产代码不动。

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant