package voice import ( "encoding/json" "testing" ) // 初始配置 JSON 关键字段必须对(错了火山直接拒识别)。 func TestBuildASRRequest(t *testing.T) { var r asrReq if err := json.Unmarshal(buildASRRequest("u1"), &r); err != nil { t.Fatalf("配置 JSON 不合法: %v", err) } if r.User.UID != "u1" { t.Fatalf("uid 应 u1,得 %q", r.User.UID) } if r.Audio.Rate != 16000 || r.Audio.Bits != 16 || r.Audio.Channel != 1 { t.Fatalf("音频参数应 16k/16bit/单声道,得 %+v", r.Audio) } if r.Request.ModelName != "bigmodel" || !r.Request.VAD.VadEnable { t.Fatalf("model/vad 配置错:%+v", r.Request) } // 空 uid 兜底 var r2 asrReq _ = json.Unmarshal(buildASRRequest(""), &r2) if r2.User.UID == "" { t.Fatal("空 uid 应兜底非空") } } // result 三种形态(数组/对象/字符串)都要能取出文本;final 由 type 决定。 func TestParseASRResult(t *testing.T) { cases := []struct { payload string wantText string wantFinal bool }{ {`{"type":"interim","result":[{"text":"你好"}]}`, "你好", false}, {`{"type":"final","result":[{"text":"你好"},{"text":"世界"}]}`, "你好世界", true}, {`{"type":"final","result":{"text":"单对象"}}`, "单对象", true}, {`{"type":"interim","result":"纯字符串"}`, "纯字符串", false}, } for _, c := range cases { text, final, ok := parseASRResult([]byte(c.payload)) if !ok || text != c.wantText || final != c.wantFinal { t.Fatalf("parse(%s)=%q,%v,%v want %q,%v", c.payload, text, final, ok, c.wantText, c.wantFinal) } } // 坏 JSON 不 panic、ok=false if _, _, ok := parseASRResult([]byte("not json")); ok { t.Fatal("坏 JSON 应 ok=false") } }