Włączanie rejestrowania w zestawie SDK mowy

Rejestrowanie w pliku jest opcjonalną funkcją zestawu SDK usługi Mowa. W trakcie programowania rejestrowanie dostarcza dodatkowych informacji i danych diagnostycznych na temat podstawowych składników zestawu SDK usługi Mowa. Można ją włączyć, ustawiając Speech_LogFilename właściwość obiektu konfiguracji mowy na lokalizację i nazwę pliku dziennika. Rejestrowanie jest obsługiwane przez klasę statyczną w natywnej bibliotece zestawu SPEECH SDK. Możesz włączyć rejestrowanie dla dowolnego aparatu rozpoznawania lub syntezatora zestawu SPEECH SDK. Wszystkie wystąpienia w tym samym procesie zapisują wpisy dziennika w tym samym pliku dziennika.

Przykład

Nazwa pliku dziennika jest określona w obiekcie konfiguracji. Biorąc przykład i SpeechConfig zakładając, że utworzono wystąpienie o nazwie 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")

Rozpoznawanie można utworzyć na podstawie obiektu konfiguracji. Umożliwia to rejestrowanie wszystkich rozpoznawania.

Uwaga

Jeśli utworzysz obiekt SpeechSynthesizer z obiektu konfiguracji, nie włączy rejestrowania. Jeśli jednak rejestrowanie jest włączone, otrzymasz również diagnostykę z programu SpeechSynthesizer.

JavaScript jest wyjątkiem, w którym rejestrowanie jest włączone za pośrednictwem diagnostyki zestawu SDK, jak pokazano w poniższym fragmencie kodu:

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

Tworzenie pliku dziennika na różnych platformach

W przypadku systemu Windows lub Linux plik dziennika może znajdować się w dowolnej ścieżce, dla którego użytkownik ma uprawnienia do zapisu. Uprawnienia do zapisu w lokalizacjach systemu plików w innych systemach operacyjnych mogą być domyślnie ograniczone lub ograniczone.

Platforma uniwersalna systemu Windows (UWP)

Aplikacje platformy UNIWERSALNEJ systemu Windows muszą umieszczać pliki dziennika w jednej z lokalizacji danych aplikacji (lokalnie, roamingu lub tymczasowej). Plik dziennika można utworzyć w folderze aplikacji lokalnej:

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

W aplikacji platformy UWP aparatu Unity można utworzyć plik dziennika przy użyciu folderu trwałej ścieżki danych aplikacji w następujący sposób:

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

Aby uzyskać więcej informacji na temat uprawnień dostępu do plików w aplikacjach platformy UWP, zobacz Uprawnienia dostępu do plików.

Android

Plik dziennika można zapisać w magazynie wewnętrznym, magazynie zewnętrznym lub katalogu pamięci podręcznej. Pliki utworzone w magazynie wewnętrznym lub katalogu pamięci podręcznej są prywatne dla aplikacji. Zaleca się utworzenie pliku dziennika w magazynie zewnętrznym.

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

Powyższy kod zapisze plik dziennika w magazynie zewnętrznym w katalogu głównym katalogu specyficznego dla aplikacji. Użytkownik może uzyskać dostęp do pliku za pomocą menedżera plików (zazwyczaj w pliku Android/data/ApplicationName/logfile.txt). Plik jest usuwany po odinstalowaniu aplikacji.

Należy również zażądać WRITE_EXTERNAL_STORAGE uprawnień w pliku manifestu:

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

W aplikacji aparatu Unity dla systemu Android można utworzyć plik dziennika przy użyciu folderu trwałej ścieżki danych aplikacji w następujący sposób:

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

Ponadto należy również ustawić uprawnienia do zapisu w ustawieniach aparatu Unity Player dla systemu Android na wartość "External (SDCard)". Dziennik jest zapisywany w katalogu, który można uzyskać za pomocą narzędzia, takiego jak AndroidStudio Device Eksplorator plików. Dokładna ścieżka katalogu może się różnić między urządzeniami z systemem Android. Lokalizacja to zazwyczaj sdcard/Android/data/your-app-packagename/files katalog.

Więcej informacji o danych i magazynie plików dla aplikacji systemu Android jest dostępnych tutaj.

iOS

Dostępne są tylko katalogi w piaskownicy aplikacji. Pliki można tworzyć w dokumentach, bibliotece i katalogach tymczasowych. Pliki w katalogu dokumentów można udostępnić użytkownikowi.

Jeśli używasz języka Objective-C w systemie iOS, użyj następującego fragmentu kodu, aby utworzyć plik dziennika w katalogu dokumentów aplikacji:

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

Aby uzyskać dostęp do utworzonego pliku, dodaj poniższe właściwości do Info.plist listy właściwości aplikacji:

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

Jeśli używasz usługi Swift w systemie iOS, użyj następującego fragmentu kodu, aby włączyć dzienniki:

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)

Więcej informacji na temat systemu plików systemu iOS jest dostępne tutaj.

Rejestrowanie za pomocą wielu rozpoznawania

Mimo że ścieżka wyjściowa pliku dziennika jest określana jako właściwość konfiguracji do SpeechRecognizer obiektu lub innego obiektu zestawu SDK, rejestrowanie zestawu SDK jest pojedynczym obiektem obejmującym cały proces bez pojęcia poszczególnych wystąpień. Można to traktować jako SpeechRecognizer konstruktor (lub podobny) niejawnie wywołując statyczną i wewnętrzną procedurę "Konfigurowanie rejestrowania globalnego" z danymi właściwości dostępnymi w odpowiednim obiekcie SpeechConfig.

Oznacza to, że na przykład nie można skonfigurować sześciu równoległych rozpoznawania danych wyjściowych jednocześnie do sześciu oddzielnych plików. Zamiast tego najnowszy utworzony moduł rozpoznawania skonfiguruje globalne wystąpienie rejestrowania w celu wyprowadzenia danych wyjściowych do pliku określonego we właściwościach konfiguracji, a wszystkie rejestrowanie zestawu SDK jest emitowane do tego pliku.

Oznacza to również, że okres istnienia obiektu skonfigurowanego rejestrowania nie jest powiązany z czasem trwania rejestrowania. Rejestrowanie nie zostanie zatrzymane w odpowiedzi na wydanie obiektu zestawu SDK i będzie kontynuowane tak długo, jak nie podano nowej konfiguracji rejestrowania. Po rozpoczęciu rejestrowanie całego procesu można zatrzymać, ustawiając ścieżkę pliku dziennika na pusty ciąg podczas tworzenia nowego obiektu.

Aby zmniejszyć potencjalne zamieszanie podczas konfigurowania rejestrowania dla wielu wystąpień, może być przydatne abstrakcja kontroli nad rejestrowaniem z obiektów wykonujących rzeczywistą pracę. Przykładowa para procedur pomocnika:

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("");
}

Następne kroki