语音识别踩坑记录
本来想在原来的语音识别的基础上增加本地扩展本地词典,
采用的语音识别是Vosk识别器,模型是 vosk-model-small-cn-0.22
// 初始化Vosk识别器
if (recognizer == null)
{
using (Model model = new Model(modelPath))
{
string grammar = @"{""root"": [""你好"", ""退出"", ""电视剧"", ""我有一个朋友"", {""早上好"" : 0.5}]}";
recognizer = new VoskRecognizer(model, 16000.0f, grammar);
//recognizer = new VoskRecognizer(model, 16000.0f);
}
}
注释掉的是原来能用的创建对象,但是增加了词典后直接报内存错误。
经过搜索
解决 System.AccessViolationException
内存错误的逐步指南
🔍 原因分析
此错误通常由 非托管内存操作越界 引起,常见于 Vosk 等依赖本地库的调用场景。可能触发条件:
- 1.模型文件损坏 或路径错误
- 2.音频数据格式 不匹配(采样率/位深度)
- 3.对象生命周期管理 不当导致提前释放资源
- 4.跨线程访问 非托管代码未同步
✅ 解决方案步骤
- 1.
验证模型完整性
- 重新下载模型(推荐使用 Vosk 中文模型 0.22)
- 确认解压后目录结构完整(应有
am
,conf
,graph
等子目录) - 代码中绝对路径访问:
-
string modelPath = @"D:\models\vosk-model-cn-0.22"; // 避免中文和空格 Model model = new Model(modelPath);
结论:
本来想弄小模型 vosk-model-small-cn-0.22 40m的语音识别,但这个小模型的功能局限性强,不能增加本地词典。
还是得下载1.5G的vosk-model-cn-0.22 模型。