跳至主要内容

疑難排解

語言模型暫存問題

大多數問題都與語言模型的暫存(staging)有關,這可能會在打包建置中造成問題。也就是說,您可能會遇到以下日誌:

LogRuntimeSpeechRecognizer: Error: Language model loading failed: Failed to load the language model asset '/RuntimeSpeechRecognizer/LanguageModels/LanguageModel.LanguageModel'

若要修正此問題,請前往專案設定,然後瀏覽至專案 -> 打包區段。向下捲動並展開進階類別,並確認:

  1. DirectoriesToAlwaysCook(在 UI 中標示為 Additional Asset Directories to Cook)中有一個 /RuntimeSpeechRecognizer/LanguageModels 的條目。此操作會由外掛程式在編輯器執行期間自動完成,但有些使用者回報必須手動處理,因此請務必檢查。這是確保語言模型資產必定會包含在打包建置中的必要條件。

Additional Asset Directories to Cook

  1. bCookMapsOnly 被設為 false。如果設為 true,它會忽略先前的屬性,且語言模型資產有可能無法正確地進行暫存。此外掛程式也會自動完成此操作,但為了確保起見,請也手動檢查此變數。

Additional Asset Directories to Cook

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 擴充功能 作為其提供者,則無需此步驟。