MAUI安卓端调用Vosk库遇System.DllNotFoundException: libvosk问题求助
解决MAUI Android平台Vosk库
libvosk找不到的问题 核心原因
Windows平台依赖libvosk.dll,但Android需要对应CPU架构的libvosk.so原生库,默认通过dotnet add package Vosk安装的NuGet包未包含Android所需的原生库,导致加载失败。
解决步骤
1. 配置Android原生库文件
- 下载适配Android架构的
libvosk.so文件(支持armeabi-v7a、arm64-v8a、x86、x86_64) - 在MAUI项目的Android目录下创建
lib文件夹,再在lib下创建对应架构的子目录(比如arm64-v8a、armeabi-v7a) - 将对应架构的
libvosk.so放入子目录,右键文件→属性→高级→生成操作设置为AndroidNativeLibrary
2. 修正模型路径的处理逻辑
Android的Assets目录是只读的,Vosk加载模型需要可读写的路径,需先将模型文件复制到应用私有目录:
private async Task<string> PrepareModelPath() { var targetPath = Path.Combine(FileSystem.AppDataDirectory, "vosk-model"); if (!Directory.Exists(targetPath)) { // 从Assets复制打包好的模型文件 var assets = Microsoft.Maui.ApplicationModel.Platform.CurrentActivity.Assets; using var zipStream = assets.Open("vosk-model.zip"); using var zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Read); zipArchive.ExtractToDirectory(targetPath); } return targetPath; }
- 将模型文件夹打包为zip,放入Android项目的Assets目录,设置生成操作为
AndroidAsset
3. 调整VoskService初始化流程
确保先准备好模型路径,再初始化Vosk:
public class VoskService : IDisposable { private Model? _model; public async Task InitializeAsync() { Vosk.Vosk.SetLogLevel(0); var modelPath = await PrepareModelPath(); _model = new Model(modelPath); } // 实现IDisposable接口的释放逻辑 public void Dispose() { _model?.Dispose(); GC.SuppressFinalize(this); } }
4. 添加必要权限
在AndroidManifest.xml中添加麦克风权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
同时在MAUI代码中动态申请权限:
var status = await Permissions.RequestAsync<Permissions.Microphone>(); if (status != PermissionStatus.Granted) { // 处理权限拒绝后的逻辑 return; }
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

