diff --git a/runtime/llama.cpp/sensevoice/funasr-sensevoice/funasr-sensevoice.cpp b/runtime/llama.cpp/sensevoice/funasr-sensevoice/funasr-sensevoice.cpp index 533d59947..11a808684 100644 --- a/runtime/llama.cpp/sensevoice/funasr-sensevoice/funasr-sensevoice.cpp +++ b/runtime/llama.cpp/sensevoice/funasr-sensevoice/funasr-sensevoice.cpp @@ -241,11 +241,22 @@ int main(int argc,char**argv){ // NOTE: SenseVoiceSmall inference() feeds the RAW log-mel fbank to the encoder; // it does NOT apply am.mvn CMVN (that path is unused at inference). Applying it // makes the encoder predict <|nospeech|>. So no CMVN here. - float*emb=(float*)m.g("embed.weight")->data; // [16, 560] row-major + ggml_tensor*embed=m.g("embed.weight"); // [16, 560] row-major + if(embed->ne[0]!=F){fprintf(stderr,"unexpected embed width: %lld\n",(long long)embed->ne[0]);return 1;} + for(int id:qtok) if(id<0||id>=embed->ne[1]){fprintf(stderr,"query token out of embed range: %d\n",id);return 1;} + std::vector embed_f32((size_t)ggml_nelements(embed)); + if(embed->type==GGML_TYPE_F32){ + memcpy(embed_f32.data(),embed->data,embed_f32.size()*sizeof(float)); + } else if(embed->type==GGML_TYPE_F16){ + const ggml_fp16_t*src=(const ggml_fp16_t*)embed->data; + for(size_t i=0;itype));return 1; + } // Run encoder+CTC on one fbank window [T,F]; returns decoded text string. auto run_seg=[&](const std::vector& fb,int T) -> std::string { int N=nq+T; std::vector inp((size_t)N*F); - for(int i=0;itype==GGML_TYPE_F32" in source + assert "embed->type==GGML_TYPE_F16" in source + assert "ggml_fp16_to_fp32" in source + assert 'float*emb=(float*)m.g("embed.weight")->data' not in source + + def test_sensevoice_does_not_hardcode_cpu_graph_backend(): source = SENSEVOICE.read_text(encoding="utf-8") run_seg_body = source.split("auto run_seg=", maxsplit=1)[1].split("int64_t t0=", maxsplit=1)[0]