Поделиться через


Включение ведения журнала в пакете SDK для распознавания речи

Ведение журнала в файле является необязательным компонентом для речевого пакета SDK. На стадии разработки ведение журнала предоставляет дополнительные сведения и средства диагностики основных компонентов SDK для распознавания речи. Его можно включить, задав Speech_LogFilename свойство объекта конфигурации речи в расположение и имя файла журнала. Ведение журнала обрабатывается статическим классом в собственной библиотеке речевого пакета 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 должны поместить файлы журнала в одном из расположений для данных приложений (Local, Roaming или папка для временных файлов). Файл журнала можно создать в локальной папке приложения.

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

В приложении UWP для Unity файл журнала можно создать с помощью папки с постоянными путями к данным приложения следующим образом:

#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>

В приложении UWP для Android файл журнала можно создать с помощью папки с постоянными путями к данным приложения следующим образом:

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

Кроме того, необходимо также задать разрешение на запись "External (SDCard)" в параметрах проигрывателя Unity для Android. Журнал записывается в каталог, который можно получить с помощью средства, например AndroidStudio Device проводник. Точный путь к каталогу может отличаться между устройствами Android. Расположение обычно является каталогом sdcard/Android/data/your-app-packagename/files .

Дополнительные сведения о данных и хранилище файлов для приложений Android доступны здесь.

iOS

Доступны только каталоги в изолированной среде приложения. Файлы можно создавать в каталогах Documents, Library и TEMP. Файлы в каталоге документов можно сделать доступными для пользователя.

Если вы используете Objective-C в iOS, используйте следующий фрагмент кода, чтобы создать файл журнала в каталоге документов приложения:

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/>

Если вы используете Swift в iOS, используйте следующий фрагмент кода, чтобы включить журналы:

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, ведение журнала SDK является одним, процессным объектом без концепции отдельных экземпляров. Его можно представить в виде конструктора SpeechRecognizer (или его аналога), неявно вызывающего статическую внутреннюю подпрограмму "Configure Global Logging" с данными свойств, доступными в соответствующем классе 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("");
}

Следующие шаги