| | |
| | | } |
| | | } |
| | | |
| | | func TestRegistryReturnsParakeetV3ForEuropeanLanguages(t *testing.T) { |
| | | profile, err := GetModelProfile(ParakeetV3ModelID) |
| | | if err != nil { |
| | | t.Fatal(err) |
| | | } |
| | | if profile.BackendKind != BackendNemoTransducer { |
| | | t.Fatalf("backend kind = %q, want %q", profile.BackendKind, BackendNemoTransducer) |
| | | } |
| | | for _, languageID := range []string{FrenchLanguageID, GermanLanguageID, SpanishLanguageID, ItalianLanguageID, PortugueseLanguageID} { |
| | | if !stringSliceContains(profile.SupportedLanguageIDs, languageID) { |
| | | t.Fatalf("parakeet v3 languages = %v, want %s", profile.SupportedLanguageIDs, languageID) |
| | | } |
| | | languageProfile, err := GetLanguageProfile(languageID) |
| | | if err != nil { |
| | | t.Fatal(err) |
| | | } |
| | | if languageProfile.DefaultModelID != ParakeetV3ModelID { |
| | | t.Fatalf("%s default model = %q, want %q", languageID, languageProfile.DefaultModelID, ParakeetV3ModelID) |
| | | } |
| | | } |
| | | } |
| | | |
| | | func TestRegistryReturnsJapaneseAndKoreanDefaults(t *testing.T) { |
| | | tests := []struct { |
| | | languageID string |
| | | modelID string |
| | | }{ |
| | | {JapaneseLanguageID, JapaneseModelID}, |
| | | {KoreanLanguageID, KoreanModelID}, |
| | | } |
| | | for _, tt := range tests { |
| | | languageProfile, err := GetLanguageProfile(tt.languageID) |
| | | if err != nil { |
| | | t.Fatal(err) |
| | | } |
| | | if languageProfile.DefaultModelID != tt.modelID { |
| | | t.Fatalf("%s default model = %q, want %q", tt.languageID, languageProfile.DefaultModelID, tt.modelID) |
| | | } |
| | | modelProfile, err := GetModelProfile(tt.modelID) |
| | | if err != nil { |
| | | t.Fatal(err) |
| | | } |
| | | if modelProfile.BackendKind != BackendTransducer { |
| | | t.Fatalf("%s backend = %q, want %q", tt.modelID, modelProfile.BackendKind, BackendTransducer) |
| | | } |
| | | } |
| | | } |
| | | |
| | | func TestRegistryReturnsQwen3ASRChinese(t *testing.T) { |
| | | profile, err := GetModelProfile(Qwen3ASRModelID) |
| | | if err != nil { |
| | |
| | | dir := t.TempDir() |
| | | createValidParakeet(t, dir) |
| | | if err := os.Remove(filepath.Join(dir, "joiner.int8.onnx")); err != nil { |
| | | t.Fatal(err) |
| | | } |
| | | |
| | | result := ValidateModelDir(profile, dir) |
| | | if result.Valid { |
| | | t.Fatal("expected missing joiner to fail validation") |
| | | } |
| | | } |
| | | |
| | | func TestValidateJapaneseZipformerRequiredFiles(t *testing.T) { |
| | | profile, err := GetModelProfile(JapaneseModelID) |
| | | if err != nil { |
| | | t.Fatal(err) |
| | | } |
| | | dir := t.TempDir() |
| | | createValidZipformerSpecialized(t, dir) |
| | | |
| | | result := ValidateModelDir(profile, dir) |
| | | if !result.Valid { |
| | | t.Fatalf("expected valid japanese zipformer dir, missing=%v problems=%v", result.Missing, result.Problems) |
| | | } |
| | | for _, role := range []string{"encoder", "decoder", "joiner", "tokens"} { |
| | | if result.Files[role] == "" { |
| | | t.Fatalf("missing resolved file role %q", role) |
| | | } |
| | | } |
| | | } |
| | | |
| | | func TestValidateKoreanZipformerRequiredFiles(t *testing.T) { |
| | | profile, err := GetModelProfile(KoreanModelID) |
| | | if err != nil { |
| | | t.Fatal(err) |
| | | } |
| | | dir := t.TempDir() |
| | | createValidZipformerSpecialized(t, dir) |
| | | |
| | | result := ValidateModelDir(profile, dir) |
| | | if !result.Valid { |
| | | t.Fatalf("expected valid korean zipformer dir, missing=%v problems=%v", result.Missing, result.Problems) |
| | | } |
| | | for _, role := range []string{"encoder", "decoder", "joiner", "tokens"} { |
| | | if result.Files[role] == "" { |
| | | t.Fatalf("missing resolved file role %q", role) |
| | | } |
| | | } |
| | | } |
| | | |
| | | func TestValidateZipformerSpecializedRejectsMissingJoiner(t *testing.T) { |
| | | profile, err := GetModelProfile(JapaneseModelID) |
| | | if err != nil { |
| | | t.Fatal(err) |
| | | } |
| | | dir := t.TempDir() |
| | | createValidZipformerSpecialized(t, dir) |
| | | if err := os.Remove(filepath.Join(dir, "joiner-epoch-99-avg-1.int8.onnx")); err != nil { |
| | | t.Fatal(err) |
| | | } |
| | | |
| | |
| | | writeTestFile(t, filepath.Join(dir, "tokens.txt"), "tokens") |
| | | } |
| | | |
| | | func createValidZipformerSpecialized(t *testing.T, dir string) { |
| | | t.Helper() |
| | | if err := os.MkdirAll(dir, 0755); err != nil { |
| | | t.Fatal(err) |
| | | } |
| | | writeTestFile(t, filepath.Join(dir, "encoder-epoch-99-avg-1.int8.onnx"), "encoder") |
| | | writeTestFile(t, filepath.Join(dir, "decoder-epoch-99-avg-1.onnx"), "decoder") |
| | | writeTestFile(t, filepath.Join(dir, "joiner-epoch-99-avg-1.int8.onnx"), "joiner") |
| | | writeTestFile(t, filepath.Join(dir, "tokens.txt"), "tokens") |
| | | } |
| | | |
| | | func createValidQwen3ASR(t *testing.T, dir string) { |
| | | t.Helper() |
| | | if err := os.MkdirAll(filepath.Join(dir, "tokenizer"), 0755); err != nil { |