//go:build darwin package engine import ( "path/filepath" "testing" "voicesnap/internal/model" ) func TestOfflineConfigForParakeetUsesNemoTransducer(t *testing.T) { root := t.TempDir() files := map[string]string{ "encoder": filepath.Join(root, "encoder.int8.onnx"), "decoder": filepath.Join(root, "decoder.int8.onnx"), "joiner": filepath.Join(root, "joiner.int8.onnx"), "tokens": filepath.Join(root, "tokens.txt"), } resolved := model.ResolvedModel{ ModelID: model.ParakeetModelID, BackendKind: model.BackendNemoTransducer, Profile: model.ModelProfile{ DisplayName: "Parakeet English", BackendKind: model.BackendNemoTransducer, ProviderOrder: []string{"cpu"}, NumThreads: 4, }, Files: files, } config, err := offlineConfigForResolvedModel(resolved, "cpu") if err != nil { t.Fatal(err) } if config.ModelConfig.Transducer.Encoder != files["encoder"] { t.Fatalf("encoder = %q, want %q", config.ModelConfig.Transducer.Encoder, files["encoder"]) } if config.ModelConfig.Transducer.Decoder != files["decoder"] { t.Fatalf("decoder = %q, want %q", config.ModelConfig.Transducer.Decoder, files["decoder"]) } if config.ModelConfig.Transducer.Joiner != files["joiner"] { t.Fatalf("joiner = %q, want %q", config.ModelConfig.Transducer.Joiner, files["joiner"]) } if config.ModelConfig.Tokens != files["tokens"] { t.Fatalf("tokens = %q, want %q", config.ModelConfig.Tokens, files["tokens"]) } if config.ModelConfig.ModelType != model.BackendNemoTransducer { t.Fatalf("model type = %q, want %q", config.ModelConfig.ModelType, model.BackendNemoTransducer) } } func TestOfflineConfigForQwen3ASRUsesQwen3Config(t *testing.T) { root := t.TempDir() files := map[string]string{ "conv_frontend": filepath.Join(root, "conv_frontend.onnx"), "encoder": filepath.Join(root, "encoder.int8.onnx"), "decoder": filepath.Join(root, "decoder.int8.onnx"), "tokenizer": filepath.Join(root, "tokenizer"), } resolved := model.ResolvedModel{ ModelID: model.Qwen3ASRModelID, BackendKind: model.BackendQwen3ASR, Profile: model.ModelProfile{ DisplayName: "Qwen3-ASR", BackendKind: model.BackendQwen3ASR, ProviderOrder: []string{"cpu"}, NumThreads: 4, }, Files: files, } config, err := offlineConfigForResolvedModel(resolved, "cpu") if err != nil { t.Fatal(err) } if config.ModelConfig.Qwen3ASR.ConvFrontend != files["conv_frontend"] { t.Fatalf("conv frontend = %q, want %q", config.ModelConfig.Qwen3ASR.ConvFrontend, files["conv_frontend"]) } if config.ModelConfig.Qwen3ASR.Encoder != files["encoder"] { t.Fatalf("encoder = %q, want %q", config.ModelConfig.Qwen3ASR.Encoder, files["encoder"]) } if config.ModelConfig.Qwen3ASR.Decoder != files["decoder"] { t.Fatalf("decoder = %q, want %q", config.ModelConfig.Qwen3ASR.Decoder, files["decoder"]) } if config.ModelConfig.Qwen3ASR.Tokenizer != files["tokenizer"] { t.Fatalf("tokenizer = %q, want %q", config.ModelConfig.Qwen3ASR.Tokenizer, files["tokenizer"]) } if config.ModelConfig.Qwen3ASR.MaxTotalLen != 1024 { t.Fatalf("max total len = %d, want 1024", config.ModelConfig.Qwen3ASR.MaxTotalLen) } if config.ModelConfig.Qwen3ASR.MaxNewTokens != 256 { t.Fatalf("max new tokens = %d, want 256", config.ModelConfig.Qwen3ASR.MaxNewTokens) } if config.ModelConfig.Tokens != "" { t.Fatalf("tokens = %q, want empty for qwen3-asr", config.ModelConfig.Tokens) } }