ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Moonshine 模型下载完全指南:CLI 预热缓存与多平台 AssetDownloader 实战

Moonshine 模型下载完全指南:CLI 预热缓存与多平台 AssetDownloader 实战 Moonshine 模型下载完全指南CLI 预热缓存与多平台 AssetDownloader 实战【免费下载链接】moonshineVery low latency speech to text, intent recognition, and text to speech, for building voice agents and interfaces项目地址: https://gitcode.com/GitHub_Trending/moonshine3/moonshineMoonshine 是一个主打极低延迟的语音转写STT、意图识别intent recognition与语音合成TTS的开源项目其所有能力都依赖从远程目录下载的模型文件。本篇技术指南以仓库中的 docs/using/downloading-models.md 为核心系统讲解 Moonshine 的模型下载机制既包含高级 API 的自动下载首次load()即拉取所需资产也包含面向离线部署的moonshine-voice downloadCLI 预热缓存方案并深入源码揭示下载器的实现原理依赖目录、原子写入、断点续传与完整性校验。读完本文你将能够在 JavaScript、Python、SwiftiOS/macOS、Android 与 C 各平台上按需获取 STT、Embedding 与 TTS 模型并理解文件落地后的目录布局与g2p_root/tts_root等关键配置。模型下载的整体设计opt-in 与自动化的边界Moonshine 在模型获取上采用高级 API 自动下载、底层 API 严格 opt-in的双轨设计高级辅助类MicTranscriber、TextToSpeech、AgentFlow会在第一次load()时自动拉取各自需要的全部资产因此大多数应用根本不需要手动调用任何下载接口。底层路径严格 opt-in应用自行打包模型、并通过from files/from assets/from memory等常规路径加载时行为与从前完全一致绝不触碰网络。自动下载器建立在与 Python CLI 相同的依赖目录dependency catalog之上具备以下可靠性特性见 language-bindings/python/src/moonshine_voice/download.py 与 download_file.py文件清单来自原生目录下载器通过moonshine_get_stt_catalog_string()、moonshine_get_stt_dependencies_string()、moonshine_get_tts_dependencies_string()等 C API 解析出每个文件的名字、URL、大小与 CRC32C 校验和Python 侧不再硬编码任何文件名或尺寸源码注释明确说明Nothing in this file hardcodes filenames, URLs, or sizes anymore。原子写入先写入文件名.partial临时文件校验通过后再通过 rename 原子替换目标文件避免半截文件被加载器误读。断点续传下载前检查.partial文件大小通过 HTTPRange: bytesN-头从断点继续若服务器返回 416Range Not Satisfiable则删除临时文件从头下载。空间检查与进度上报大文件写入前检查磁盘可用空间通过on_progress/onProgress回调按文件粒度报告进度。并发安全每个文件配套一个.lock文件Python 侧使用filelock多进程同时下载同一模型时后到者会在锁内复查目标文件是否已被其他进程完成。自动下载各平台的高级 API 用法JavaScript浏览器 / WASM浏览器端MicTranscriber.load()、TextToSpeech.load()与AgentFlow.load()会通过内部AssetDownloader将缺失资源下载到 Cache Storage 桶moonshine-models-v1。之后的访问直接复用该缓存并支持离线运行import { MicTranscriber } from https://cdn.jsdelivr.net/npm/moonshine-ai/moonshine-wasm/dist/index.js; const mic new MicTranscriber() .onProgress((fraction, file) { console.log(${(fraction * 100).toFixed(0)}% ${file}); }) .onText((text) showInProgress(text)) .onLine((line) appendLine(line.text)); await mic.load(); await mic.start();开发调试技巧在演示页 URL 后追加?fresh1可清空模型缓存并强制重新下载若你自己托管资产而非使用 CDN可传入modelsFrom或自定义baseUrl。PythonMicTranscriber、TextToSpeech、AgentFlow首次load()时下载到用户缓存目录可用环境变量MOONSHINE_VOICE_CACHE覆盖位置。传入on_progress()可以驱动自定义 UI同时会静默默认的终端进度条tqdmfrom moonshine_voice import MicTranscriber mic ( MicTranscriber() .language(en) .on_progress(lambda fraction, file: print(f{fraction:.0%} {file})) .on_text(lambda text: show_in_progress(text)) .on_line(lambda line: append_line(line.text)) ) mic.load() mic.start()如果你磁盘上已有一份模型目录例如执行过下文 CLI 下载 命令可以用models_from(path)直接指定——打包或预置的模型永远不会触发网络请求。从源码看MicTranscriber.models_from()与on_progress()均为链式 settermic_transcriber.pyload()内部调用get_model_for_language()完成解析与下载。iOS / macOSSwiftMicTranscriber.load()与TextToSpeech.load()自动下载需要显式控制时AssetDownloader.ensureModelPresent会把你选择的目录下缺失的资源全部拉齐并返回该目录可直接交给Transcriber、MicTranscriber或TextToSpeech。该方法为async需在主 actor 之外调用import MoonshineVoice let modelDir URL.cachesDirectory.appending(path: moonshine/tiny-en) // 语音转写下载默认英语模型追加 includeSpelling: true 获取字母数字拼写模型 // 或通过 modelArch: 指定具体架构 let downloader AssetDownloader(allowsCellularAccess: false) // 仅 Wi-Fi try await downloader.ensureModelPresent(root: modelDir, spec: .stt(language: en)) { progress in print(\(progress.relativePath): \(progress.bytesDownloaded)/\(progress.bytesTotal)) } let transcriber try Transcriber(modelPath: modelDir.path, modelArch: .tiny) // 文本嵌入embeddinggemma-300m 较大——即使 q4 量化也有几百 MB try await downloader.ensureModelPresent(root: embeddingDir, spec: .embedding(variant: q4)) // 语音合成文件落在你传给 g2p_root 的目录下 try await downloader.ensureModelPresent(root: ttsRoot, spec: .tts(language: en_us, voice: kokoro_af_heart))辅助 API 说明isModelPresent(root:spec:)是廉价的同步检查磁盘上资产齐备时可直接跳过下载 UI。下载失败抛出AssetDownloadErrorHTTP 状态、空间不足、取消等便于区分没拉到文件与后续加载失败。HTTPS 下载无需任何额外的Info.plist条目或权限声明。可选网络测试MOONSHINE_DOWNLOAD_TESTS1 swift test --filter AssetDownloaderNetworkTests。AndroidJava高级load()路径同样自动下载。Android 的AssetDownloader与 Swift API 对齐但执行阻塞式网络 I/O必须在主线程之外调用。需要可靠的、能扛住进程被杀的后台下载时使用基于 WorkManager 的MoonshineDownloadWorker可约束网络类型并带退避重试File modelDir new File(context.getFilesDir(), moonshine/tiny-en); // 直接下载在后台线程 / 协程中调用 File root new AssetDownloader().ensureModelPresent( modelDir, ModelSpec.stt(en), (path, index, total, done, size) - Log.i(dl, path done / size)); Transcriber transcriber new Transcriber(); transcriber.loadFromFiles(root.getAbsolutePath(), JNI.MOONSHINE_MODEL_ARCH_TINY); // 或走 WorkManager仅在非计量如 Wi-Fi网络下下载 OneTimeWorkRequest request MoonshineDownloadWorker.buildRequest(modelDir, ModelSpec.stt(en), /*requireUnmetered*/ true); WorkManager.getInstance(context).enqueue(request);补充要点ModelSpec还提供tts(language, voice)、embedding(modelName, variant)、g2p(language)工厂方法与 Swift 的 spec 一一对应。库的 manifest 已声明INTERNET与ACCESS_NETWORK_STATE权限会自动合并进你的应用MoonshineDownloadWorker的进度可通过WorkInfo.getProgress()配合 worker 的PROGRESS_*data key 观察。使用下载器会传递性引入 OkHttp 与 WorkManager自带模型的应用虽仍会携带这些库但永远不会走网络路径。可选网络测试./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.classai.moonshine.voice.AssetDownloaderTest -Pandroid.testInstrumentationRunnerArguments.moonshineDownloadTests1需要已连接的设备/模拟器。Linux / Windows / Raspberry PiLinux优先使用 Python 辅助类要在断网前预热缓存用下文 CLI 命令。C 应用从路径构造Transcriber时应运行moonshine-voice download或执行 examples/c 中的./download-library.sh它会顺带拉取一份英语示例模型然后把该目录传给引擎。Windows同样优先 Python 辅助类C 应用包括 examples/windows/cli-transcriber用moonshine-voice download下载或直接使用 release 压缩包内自带的模型再让引擎指向该目录。Raspberry Pi与 Python 一致——pip install moonshine-voice后让MicTranscriber.load()/TextToSpeech.load()/AgentFlow.load()首次使用时拉取到缓存需要离线时先用moonshine-voice download预热。文件落在哪里使用AssetDownloader或 Swift/Android 的ensureModelPresent时目标目录由你指定请按平台存储策略选择合适的目录Apple 平台用URL.cachesDirectoryAndroid 用context.getFilesDir()/context.getCacheDir()。目录内的布局与加载器的预期完全一致STT 与 Embedding 文件使用裸文件名如encoder.ort、tokenizer.binTTS/G2P 资产保留规范相对路径如en_us/dict.tsv引擎仅凭根目录即可定位全部文件。浏览器中下载的模型存放在 Cache Storagemoonshine-models-v1而非文件系统路径。Python 默认缓存位于用户缓存目录macOS 为~/Library/Caches/moonshine_voice可用MOONSHINE_VOICE_CACHE覆盖。仓库中的 scripts/test-model-downloads.sh 会先跑一遍原生目录采样测试再驱动 Swift 与 Android 的可选网络下载测试对应平台工具链或设备不可用时自动跳过。mock 的离线AssetDownloaderTests仍会作为默认swift test的一部分运行在不联网的情况下覆盖清单解析、续传与错误处理逻辑。Speech-to-Text 模型下载获取转写模型文件最直接的方式是使用 Python 下载模块。安装见 快速开始后执行moonshine-voice download --stt --language enlanguage参数既支持两位语言代码也支持英文名如en或english。当前版本支持哪些语言可参考 可用模型清单也可以故意传一个不存在的语言名让命令列出所有支持项moonshine-voice download --stt --language foo上面的调用会报错退出错误信息即包含支持的语种列表。指定架构可用--model-arch标志显式选择架构取值来自 core/moonshine-c-api.h 中定义的MOONSHINE_MODEL_ARCH_*常量数字常量说明0MOONSHINE_MODEL_ARCH_TINYTiny非流式1MOONSHINE_MODEL_ARCH_BASEBase非流式2MOONSHINE_MODEL_ARCH_TINY_STREAMINGTiny Streaming3MOONSHINE_MODEL_ARCH_BASE_STREAMINGBase Streaming已定义但尚未发布于模型目录4MOONSHINE_MODEL_ARCH_SMALL_STREAMINGSmall Streaming5MOONSHINE_MODEL_ARCH_MEDIUM_STREAMINGMedium Streaming若未指定架构脚本会加载该语言可用的最高质量模型即目录中的默认项is_default标记。下载脚本会打印模型文件位置与架构信息典型输出如下adapter.ort: 100%|██████████████████████████████████████████████████████████████| 3.48M/3.48M [00:0000:00, 18.6MB/s] cross_kv.ort: 100%|█████████████████████████████████████████████████████████████| 11.0M/11.0M [00:0000:00, 39.4MB/s] decoder_kv.ort: 100%|███████████████████████████████████████████████████████████████| 139M/139M [00:0100:00, 100MB/s] encoder.ort: 100%|██████████████████████████████████████████████████████████████| 89.8M/89.8M [00:0100:00, 83.1MB/s] frontend.weights.ort: 100%|█████████████████████████████████████████████████████| 11.3M/11.3M [00:0000:00, 65.7MB/s] frontend.model.ort: 100%|█████████████████████████████████████████████████████████| 28.0k/28.0k [00:0000:00, 1.88MB/s] streaming_config.json: 100%|██████████████████████████████████████████████████████| 513/513 [00:0000:00, 1.88MB/s] tokenizer.bin: 100%|█████████████████████████████████████████████████████████████| 244k/244k [00:0000:00, 3.06MB/s] spelling_cnn.ort: 100%|█████████████████████████████████████████████████████████| 1.59M/1.59M [00:0000:00, 10.2MB/s] spelling_cnn_meta.json: 100%|█████████████████████████████████████████████████████| 622/622 [00:0000:00, 1.72MB/s] Model download url: https://download.moonshine.ai/model/medium-streaming-en/quantized_26_08_21 Model components: [adapter.ort, cross_kv.ort, decoder_kv.ort, encoder.ort, frontend.model.ort, frontend.weights.ort, streaming_config.json, tokenizer.bin] Model arch: 5 Downloaded model path: /Users/petewarden/Library/Caches/moonshine_voice/download.moonshine.ai/model/medium-streaming-en/quantized_26_08_21由于本例未指定架构下载的是最高质量的英语 Medium Streaming 模型架构 5。末尾两个spelling_cnn文件是字母数字拼写模型——当该语言发布了拼写模型时下载器会与主模型一并拉取。最后两行分别告诉你是哪种架构、模型文件落在哪里。默认使用用户缓存目录macOS 为~/Library/Caches/moonshine_voice运行脚本前设置MOONSHINE_VOICE_CACHE环境变量即可改到其他位置。STT 下载背后的源码路径从 download.py 的实现看--stt分支最终调用get_model_for_language()先经find_model_info()在原生目录中解析语言代码或英文名与架构再通过_stt_dependency_manifest()拿到该语言 架构的下载清单含include_spelling/word_timestamps选项随后_download_manifest_group()逐个文件下载并在下载器可用时校验尺寸与 CRC32Cdownload_file.py。log_model_info()则打印Model download url、Model components、Model arch、Downloaded model path四行摘要与 CLI 输出一一对应。moonshine-voice download子命令本身由 cli.py 分发与python -m moonshine_voice.download等价。Embedding 模型下载下载模块还能帮你获取匹配口语短语所需的资产核心是一个句子嵌入模型sentence embedding model。AgentFlow首次使用时自动拉取若要自己使用向量把下载好的目录传给EmbeddingModel见 API 文档。这条命令通常只在离线部署前预热缓存时使用moonshine-voice download --embeddingmodel_q4.ort: 100%|██████████████████████████████████████████████| 189M/189M [00:0200:00, 90.1MB/s] tokenizer.bin: 100%|███████████████████████████████████████████████| 2.46M/2.46M [00:0000:00, 13.9MB/s] Embedding model path: /Users/petewarden/Library/Caches/moonshine_voice/download.moonshine.ai/model/embeddinggemma-300m /Users/petewarden/Library/Caches/moonshine_voice/download.moonshine.ai/model/embeddinggemma-300m当前嵌入模型为embeddinggemma-300m768 维嵌入。从 download.py 可确认其变体默认q4另有q8fp32、fp16、q4f16已不再支持调用时会抛出带提示的ValueError。文件清单单个全量.ort加tokenizer.bin、URL、尺寸与 CRC32C 均来自原生目录的moonshine_get_embedding_dependencies_string()。Text-to-Speech 模型下载TTS 需要大量随语言差异很大的模型、词典与其他文件。下载模块可以按语言可选按音色精确拉取所需内容moonshine-voice download --tts --root /tmp/tts-files/dict_filtered_heteronyms.tsv: 100%|██████████████████████████████| 2.77M/2.77M [00:0000:00, 15.5MB/s] g2p-config.json: 100%|██████████████████████████████████████████████| 60.0/60.0 [00:0000:00, 160kB/s] model.ort: 100%|█████████████████████████████████████████████████| 21.1M/21.1M [00:0000:00, 37.7MB/s] onnx-config.json: 100%|████████████████████████████████████████████| 4.53k/4.53k [00:0000:00, 11.7MB/s] model.ort: 100%|█████████████████████████████████████████████████| 88.3M/88.3M [00:0100:00, 85.6MB/s] config.json: 100%|███████████████████████████████████████████████| 2.30k/2.30k [00:0000:00, 6.88MB/s] af_heart.kokorovoice: 100%|████████████████████████████████████████| 510k/510k [00:0000:00, 3.82MB/s] TTS assets root (use as g2p_root): /private/tmp/tts-files /private/tmp/tts-files关键行为下载的模型放在--root指定的根目录下的子文件夹中默认情况下 TTS 模块期望文件保持相同相对路径这样它仅凭父目录路径即可自动找到全部文件。如需把文件移动到别处可在TextToSpeech的load()之前通过options()setter 为每个文件指定新路径键为常用相对路径值为文件实际路径。若应用安装后可能位于任意位置还可通过options()传入tts_root值在运行时设置 TTS 数据的实际根目录。可选--voice参数精确指定音色kokoro_*、piper_*或zipvoice_*前缀加 id/词干如kokoro_af_heart、zipvoice_american_female。TTS/G2P 目录布局与根目录选项与 STT 不同TTS 资产在缓存根下保持规范相对键如en_us/dict.tsv、zipvoice/...、clone_asr/...因此g2p_root布局可直接被引擎识别。Python 侧download_tts_assets()返回的目录即可作为g2p_root传给合成器download_g2p_assets()则只拉取 G2P 词典/模型文件--g2p标志对应。源码中还提供了list_tts_voices()返回{present: [...], downloadable: [...]}、validate_tts_voice_downloaded()与validate_tts_voice_known()等辅助函数用于在请求 CDN 前先校验语言与音色是否存在避免对不存在的音色文件发起 HTTP 404 请求download.py。下载测试与可靠性验证仓库用两层测试保障下载链路见 scripts/test-model-downloads.sh原生目录采样测试通过moonshine-download-smoke工具请求 C API 的下载清单把每个文件用 curl 下载到临时目录再从该目录加载对应引擎并跑一次推理。任何清单缺少文件都会导致第 3 步失败——这正是目的验证目录列出了每个模型所需的全部文件。默认覆盖 STT tiny-en非流式、tiny-streaming-en、tiny-ja、G2P de、TTS en_usPiper lessac 音色、embeddinggemma-300m q4 与 diarization--all追加更多语言与 q8/fp16 嵌入变体用于夜间回归。框架级下载测试Swift 端MOONSHINE_DOWNLOAD_TESTS1 swift test --filter AssetDownloaderNetworkTests仅 macOS 且存在 XCFramework 时运行Android 端connectedAndroidTest的AssetDownloaderTest仅检测到已连接设备时运行。两者均以--skip-frameworks跳过。该测试脚本需要联网因此不属于Hermetic 的 scripts/test-core.sh 常规测试集需显式运行。结语选择适合你的下载路径归纳起来Moonshine 模型获取的决策路径非常清晰常规在线应用直接使用MicTranscriber/TextToSpeech/AgentFlow的高级load()让内置AssetDownloader按需拉取Web 端落在 Cache StoragePython 端落在用户缓存Apple/Android 端落在你指定的目录。离线 / 弱网设备发货前用moonshine-voice download --stt / --embedding / --tts预热缓存并用models_from()/g2p_root/tts_root把预置目录交给引擎全程零网络请求。自建托管Web 端通过modelsFrom/ 自定义baseUrl替换 CDN其余平台把下载目录整体迁移即可因为 STT/Embedding 用裸文件名、TTS 用规范相对路径的布局是与加载器约定好的。配合 可用模型清单含各语言、各架构的参数规模与 WER/CER 指标、C API 头文件架构常量与 快速开始安装方式你可以在任何目标平台上稳定、可靠地拿到 Moonshine 全部模型资产。【免费下载链接】moonshineVery low latency speech to text, intent recognition, and text to speech, for building voice agents and interfaces项目地址: https://gitcode.com/GitHub_Trending/moonshine3/moonshine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表