Speech SDK のログの有効化

ファイルへのログ記録は、Speech SDK のオプションの機能です。 開発時、ログ記録により、Speech SDK のコア コンポーネントから追加の情報や診断が提供されます。 これは、音声構成オブジェクト上の Speech_LogFilename プロパティをログ ファイルの場所と名前に設定することで有効にできます。 ログは、Speech SDK のネイティブ ライブラリの静的クラスによって処理されます。 任意の Speech 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")

認識エンジンは、構成オブジェクトから作成できます。 これにより、すべての認識エンジンのログが有効になります。

Note

構成オブジェクトから 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 Player 設定の書き込みアクセス許可を "External (SDCard)" に設定する必要もあります。 ログは、AndroidStudio Device File Explorer などのツールを使用して取得できるディレクトリに書き込まれます。 正確なディレクトリ パスは、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 ログはシングルトンであり、個々のインスタンスという概念が無いプロセス全体の機能です。 これは、対応する SpeechConfig で使用可能なプロパティ データを使用して静的および内部の "グローバル ログ記録の構成" ルーチンを暗黙的に呼び出す SpeechRecognizer コンストラクター (または同様のもの) と考えることができます。

つまり、たとえば 6 つの並列認識エンジンを構成して、6 つの個別のファイルに同時に出力することはできません。 その代わりに、作成された最新の認識エンジンは、構成プロパティ内で指定されたファイルに出力するようにグローバル ログ インスタンスを構成し、すべての 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("");
}

次のステップ