共用方式為


在語音 SDK 中啟用記錄

「記錄至檔案」是語音 SDK 的選用功能。 在開發期間,記錄功能會從語音 SDK 的核心元件提供其他資訊和診斷。 您可以將語音設定物件上的 Speech_LogFilename 屬性設定為記錄檔的位置和名稱,藉以啟用此功能。 記錄是由語音 SDK 原生程式庫中的靜態類別處理。 您可以針對任何語音 SDK 辨識器或合成器執行個體開啟記錄。 相同程序中的所有執行個體都會將記錄項目寫入相同記錄檔。

範例

記錄檔名稱是在組態物件上指定。 採用 SpeechConfig 作為範例,並假設您已建立名為 speechConfig 的執行個體:

speechConfig.SetProperty(PropertyId.Speech_LogFilename, "LogfilePathAndName");
speechConfig.setProperty(PropertyId.Speech_LogFilename, "LogfilePathAndName");
speechConfig->SetProperty(PropertyId::Speech_LogFilename, "LogfilePathAndName");
speech_config.set_property(speechsdk.PropertyId.Speech_LogFilename, "LogfilePathAndName")
[speechConfig setPropertyTo:@"LogfilePathAndName" byId:SPXSpeechLogFilename];
import ("github.com/Microsoft/cognitive-services-speech-sdk-go/common")

speechConfig.SetProperty(common.SpeechLogFilename, "LogfilePathAndName")

您可以從設定物件建立識別器。 這可啟用所有辨識器的記錄。

注意

如果您從設定物件建立 SpeechSynthesizer,則不會啟用記錄功能。 如果記錄已啟用,您也會收到來自 SpeechSynthesizer 的診斷。

JavaScript 是透過 SDK 診斷啟用記錄的例外狀況,如下列程式碼片段所示:

sdk.Diagnostics.SetLoggingLevel(sdk.LogLevel.Debug);
sdk.Diagnostics.SetLogOutputPath("LogfilePathAndName");

在不同平台上建立記錄檔

針對 Windows 或 Linux,記錄檔可以位於使用者具有寫入權限的任何路徑中。 根據預設,對其他作業系統中檔案系統位置的寫入權限可能會受到限制。

通用 Windows 平台 (UWP)

UWP 應用程式必須將記錄檔放在其中一個應用程式資料位置 (本機、漫遊或暫存)。 您可以在本機應用程式資料夾中建立記錄檔:

StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile logFile = await storageFolder.CreateFileAsync("logfile.txt", CreationCollisionOption.ReplaceExisting);
speechConfig.SetProperty(PropertyId.Speech_LogFilename, logFile.Path);

在 Unity UWP 應用程式內,您可以使用應用程式持續性資料路徑資料夾來建立記錄檔,如下所示:

#if ENABLE_WINMD_SUPPORT
    string logFile = Application.persistentDataPath + "/logFile.txt";
    speechConfig.SetProperty(PropertyId.Speech_LogFilename, logFile);
#endif

如需 UWP 應用程式中檔案存取權限的詳細資訊,請參閱檔案存取權限

Android

您可以將記錄檔儲存至內部儲存體、外部儲存體或快取目錄。 在內部儲存體或快取目錄中建立的檔案,對應用程式而言是私人的。 最好是在外部儲存體中建立記錄檔。

File dir = context.getExternalFilesDir(null);
File logFile = new File(dir, "logfile.txt");
speechConfig.setProperty(PropertyId.Speech_LogFilename, logFile.getAbsolutePath());

上述程式碼會將記錄檔儲存至外部儲存體中的應用程式特定目錄根目錄。 使用者可以使用檔案管理程式存取檔案 (通常是在 Android/data/ApplicationName/logfile.txt 中)。 解除安裝應用程式時,將會刪除該檔案。

您也需要在資訊清單檔中要求 WRITE_EXTERNAL_STORAGE 權限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="...">
  ...
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  ...
</manifest>

在 Unity Android 應用程式內,您可以使用應用程式持續性資料路徑資料夾來建立記錄檔,如下所示:

string logFile = Application.persistentDataPath + "/logFile.txt";
speechConfig.SetProperty(PropertyId.Speech_LogFilename, logFile);

此外,您也需要在適用於 Android 的 Unity 播放器設定中,將寫入權限設定為 [外部 (SDCard)]。 記錄會寫入至您可以使用工具 (例如 AndroidStudio 裝置檔案總管) 取得的目錄。 確切目錄路徑可能因 Android 裝置而異。 位置通常是 sdcard/Android/data/your-app-packagename/files 目錄。

您可以在這裡找到適用於 Android 應用程式的資料和檔案儲存體的詳細資訊。

iOS

只有應用程式沙箱內的目錄可以存取。 您可以在文件、文件庫和暫存目錄中建立檔案。 文件目錄中的檔案可以提供給使用者使用。

如果您在 iOS 上使用 Objective-C,請使用下列程式碼片段在應用程式文件目錄中建立記錄檔:

NSString *filePath = [
  [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]
    stringByAppendingPathComponent:@"logfile.txt"];
[speechConfig setPropertyTo:filePath byId:SPXSpeechLogFilename];

若要存取已建立的檔案,請將下列屬性新增至應用程式的 Info.plist 屬性清單:

<key>UIFileSharingEnabled</key>
<true/>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>

如果您使用 iOS 上的 Swift,使用下列程式碼片段來啟用記錄:

let documentsDirectoryPathString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let documentsDirectoryPath = NSURL(string: documentsDirectoryPathString)!
let logFilePath = documentsDirectoryPath.appendingPathComponent("swift.log")
self.speechConfig!.setPropertyTo(logFilePath!.absoluteString, by: SPXPropertyId.speechLogFilename)

您可以在這裡找到更多 iOS 檔案系統的相關資訊。

使用多個辨識器進行記錄

雖然記錄檔輸出路徑已指定為 SpeechRecognizer 或其他 SDK 物件中的設定屬性,但是 SDK 記錄是單一、整個程序的設備,而且沒有個別執行個體的概念。 您可以將此視為 SpeechRecognizer 建構函式 (或類似項目) 隱含地呼叫靜態和內部「設定全域記錄」常式,並在對應的 SpeechConfig 中提供屬性資料。

這表示舉例來說您無法將六個平行識別器設定為同時輸出至六個不同的檔案。 相反地,最新建立的辨識器會將全域記錄執行個體設定為輸出到其設定屬性中指定的檔案,並將所有 SDK 記錄發出至該檔案。

這也表示設定記錄的物件存留期不會與記錄的持續時間相關聯。 記錄不會因為回應 SDK 物件的發行而停止,而且只要未提供新的記錄設定,就會繼續進行。 啟動之後,您可以在建立新物件時將記錄檔路徑設定為空字串,以停止整個程序的記錄。

若要在設定多個執行個體的記錄時減少潛在的混淆,從執行實際工作的物件抽象化記錄的控制可能很有用。 協助程式常式範例:

void EnableSpeechSdkLogging(const char* relativePath)
{
	auto configForLogging = SpeechConfig::FromSubscription("unused_key", "unused_region");
	configForLogging->SetProperty(PropertyId::Speech_LogFilename, relativePath);
	auto emptyAudioConfig = AudioConfig::FromStreamInput(AudioInputStream::CreatePushStream());
	auto temporaryRecognizer = SpeechRecognizer::FromConfig(configForLogging, emptyAudioConfig);
}

void DisableSpeechSdkLogging()
{
	EnableSpeechSdkLogging("");
}

下一步