package echomeet import ( "testing" "yunyan/pb" ) // testTranscribers 构造仅含转写能力的 provider 集合(不初始化任何 SDK/凭据)。 func testTranscribers() map[pb.TranscribeService]Transcriber { return map[pb.TranscribeService]Transcriber{ pb.TranscribeService_TranscribeService_ByteDance: &byteDanceTranscriber{}, pb.TranscribeService_TranscribeService_Ali: &aliTranscriber{}, } } // 阿里转写的语言支持判定:paraformer-v2 不支持西语等,必须返回 false, // 否则西语音频会被送进阿里、静默返回 SUCCESS_WITH_NO_VALID_FRAGMENT(看着像"音频没声音")。 func TestAliTranscriberSupportsLanguage(t *testing.T) { tr := &aliTranscriber{} for _, l := range []string{"zh-CN", "zh-TW", "yue-HK", "en-US", "ja-JP", "ko-KR", "de-DE", "fr-FR", "ru-RU"} { if !tr.SupportsLanguage(l) { t.Errorf("paraformer-v2 应支持 %s,却返回 false", l) } } // 这些语种 bcp47ToDashScope 里有映射,但 paraformer-v2 实际不支持 for _, l := range []string{"es-ES", "es-MX", "pt-BR", "it-IT", "vi-VN", "tr-TR", "pl-PL", "nl-NL", "uk-UA", "th-TH", "ar-SA", "id-ID", "ms-MY", "fil-PH"} { if tr.SupportsLanguage(l) { t.Errorf("paraformer-v2 不支持 %s,却返回 true(会导致空转写)", l) } } if !tr.SupportsLanguage("") { t.Error("空语言应允许 DashScope 自动检测") } } // 字节转写支持西语,是西语会议兜底的前提。 func TestByteDanceSupportsSpanish(t *testing.T) { if !(&byteDanceTranscriber{}).SupportsLanguage("es-ES") { t.Fatal("字节应支持 es-ES(西语兜底目标)") } } // 核心回归:即使 DefaultService 被固定成 Ali(线上就是这么配的), // 西语也不能进阿里,必须改道到支持它的字节。 func TestPickTranscribeServiceAvoidsUnsupportedLang(t *testing.T) { trs := testTranscribers() ali := pb.TranscribeService_TranscribeService_Ali byteDance := pb.TranscribeService_TranscribeService_ByteDance cases := []struct { lang string resolved pb.TranscribeService // ResolveServiceType 的结果(DefaultService=Ali) wantSvc pb.TranscribeService wantChanged bool }{ {"es-ES", ali, byteDance, true}, // 西语:阿里不支持 → 改道字节(本次修复的 bug) {"pt-BR", ali, byteDance, true}, // 葡语:同上 {"zh-CN", ali, ali, false}, // 中文:阿里支持 → 不乱改道 {"ru-RU", ali, ali, false}, // 俄语:阿里支持 → 维持 {"en-US", byteDance, byteDance, false}, // 英语:字节支持 → 维持 } for _, c := range cases { got, changed, supported := pickTranscribeService(trs, c.resolved, c.lang) if got != c.wantSvc || changed != c.wantChanged { t.Errorf("lang=%s resolved=%s: got=(%s,changed=%v) want=(%s,changed=%v)", c.lang, ServiceTypeName(c.resolved), ServiceTypeName(got), changed, ServiceTypeName(c.wantSvc), c.wantChanged) } if !supported { t.Errorf("lang=%s: 选中的 %s 应支持该语言", c.lang, ServiceTypeName(got)) } } } // 没有任何服务商支持该语言时:维持原选择、不改道、并明确报告 unsupported(调用方据此告警)。 func TestPickTranscribeServiceNoneSupports(t *testing.T) { // 只放阿里,喂一个阿里不支持的语种 → 无处可去 trs := map[pb.TranscribeService]Transcriber{ pb.TranscribeService_TranscribeService_Ali: &aliTranscriber{}, } got, changed, supported := pickTranscribeService(trs, pb.TranscribeService_TranscribeService_Ali, "es-ES") if got != pb.TranscribeService_TranscribeService_Ali || changed { t.Errorf("无可用兜底时应维持原选择且不改道,got=%s changed=%v", ServiceTypeName(got), changed) } if supported { t.Error("应报告 unsupported=false,让调用方告警") } }