故障排除
语言模型暂存问题
大多数问题都与语言模型暂存有关,这可能会在打包构建中引发问题。具体来说,你可能会遇到以下日志:
LogRuntimeSpeechRecognizer: Error: Language model loading failed: Failed to load the language model asset '/RuntimeSpeechRecognizer/LanguageModels/LanguageModel.LanguageModel'
要修复此问题,请转到项目设置,然后导航到项目 -> 打包部分。向下滚动并展开“高级”类别,然后确保:
DirectoriesToAlwaysCook(标记为要 Cook 的其他资产目录)中包含了一个/RuntimeSpeechRecognizer/LanguageModels条目。插件会在编辑器运行期间自动完成此设置,但有些用户反馈需要手动添加,因此请务必检查确认。这是确保语言模型资产始终包含在打包构建中所必需的。

bCookMapsOnly被设置为false。如果将其设置为true,它将忽略上一个属性,并且语言模型资产可能无法正确暂存。插件也会自动完成此操作,但为了确保起见,请也手动检查此变量。

Android 和 iOS 崩溃
在某些情况下,在 Android 和 iOS 上,运行时可能会发生崩溃(例如在 TestFlight 测试期间)。这是由底层的 whisper.cpp 库的内存分配需求与 Unreal Engine 在这些平台上的默认分配器冲突所导致的。在其他平台上,FMalloc 默认使用 ANSI 分配器,因此此问题仅存在于 Android 和 iOS 上。
要解决此问题,你需要在项目的 Target.cs 文件中强制使用 ANSI 分配器:
对于 Unreal Engine 5.5 及更早版本:
- 你的项目必须使用源码构建的引擎(而非预编译的二进制文件)
- 将以下行添加到你的
Target.cs文件中:
GlobalDefinitions.Add("FORCE_ANSI_ALLOCATOR=1");
适用于 Unreal Engine 5.6 及更高版本:
- 适用于源码构建和预编译的引擎版本
- 将以下两行添加到你的
Target.cs文件中:
bOverrideBuildEnvironment = true;
StaticAllocator = StaticAllocatorType.Ansi;
这会将 Unreal Engine 强制在 Android 和 iOS 上使用 ANSI 分配器,以匹配 whisper.cpp 所使用的分配器。
备注
此变通方案解决了 whisper.cpp 特有的分配器冲突。如果您的项目在 Android 上使用 Vosk 扩展 作为其提供商,则无需此步骤。