You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

89 lines
3.7 KiB

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,让调用方告警")
}
}