You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 18:05:00