Compartilhar via


Habilitar o registro em log no SDK de fala

O registro em log em arquivo é um recurso opcional do SDK de fala. Durante o desenvolvimento, o registro em log traz mais informações e diagnósticos sobre os principais componentes do SDK de fala. Ele pode ser habilitado definindo a propriedade Speech_LogFilename em um objeto de configuração de fala para o local e o nome do arquivo de log. O registro em log é realizado por uma classe estática na biblioteca nativa do SDK de fala. Você pode habilitar o registro em log para qualquer instância do reconhecedor ou sintetizador do SDK de fala. Todas as instâncias do mesmo processo gravam entradas de log no mesmo arquivo de log.

Amostra

O nome do arquivo de log é especificado em um objeto de configuração. Tomando SpeechConfig como exemplo e supondo que você criou uma instância chamada 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")

Você pode criar um reconhecedor a partir do objeto de configuração. Isso habilita o registro em log para todos os reconhecedores.

Observação

Se você criar um SpeechSynthesizer a partir do objeto de configuração, ele não habilitará o registro em log. No entanto, se o registro em log estiver habilitado, você também receberá diagnósticos do SpeechSynthesizer.

O JavaScript é uma exceção em que o registro em log é ativado através de diagnósticos do SDK, conforme mostrado no trecho de código a seguir:

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

Criar arquivos de log em diferentes plataformas

No Windows ou Linux, o arquivo de log pode estar em qualquer caminho no qual o usuário tenha permissão de gravação. As permissões de gravação em locais do sistema de arquivos em outros sistemas operacionais podem ser limitadas ou restritas por padrão.

Plataforma Universal do Windows (UWP)

Os aplicativos UWP precisam colocar os arquivos de log em um dos locais de dados do aplicativo (local, móvel ou temporário). É possível criar um arquivo de log na pasta local do aplicativo:

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

Em um aplicativo UWP do Unity, um arquivo de log pode ser criado usando a pasta de caminho de dados persistentes do aplicativo da seguinte forma:

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

Para obter mais informações sobre permissões de acesso a arquivos em aplicativos UWP, confira Permissões de acesso de arquivo.

Android

Você pode salvar um arquivo de log no armazenamento interno, armazenamento externo ou diretório de cache. Os arquivos criados no armazenamento interno ou no diretório de cache são privados para o aplicativo. É preferível criar um arquivo de log no armazenamento externo.

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

O código acima salva um arquivo de log no armazenamento externo, na raiz de um diretório específico do aplicativo. O usuário pode acessar o arquivo com o gerenciador de arquivos (geralmente em Android/data/ApplicationName/logfile.txt). O arquivo é excluído quando o aplicativo é desinstalado.

Você também precisa solicitar a permissão WRITE_EXTERNAL_STORAGE no arquivo de manifesto:

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

Em um aplicativo Android do Unity, o arquivo de log pode ser criado usando a pasta de caminho de dados persistentes do aplicativo da seguinte forma:

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

Além disso, você precisa definir a permissão de gravação nas configurações do player do Unity para Android como "Externo (SDCard)". O log é gravado em um diretório que você pode obter usando uma ferramenta como o Explorador de Arquivos de Dispositivo AndroidStudio. O caminho exato do diretório pode variar entre dispositivos Android. O local normalmente é o diretório sdcard/Android/data/your-app-packagename/files.

Veja mais informações sobre o armazenamento de dados e arquivos de aplicativos Android aqui.

iOS

Somente os diretórios dentro da área restrita do aplicativo são acessíveis. É possível criar arquivos nos diretórios de documentos, da biblioteca ou temporário. Os arquivos no diretório de documentos podem ser disponibilizados ao usuário.

Se você estiver usando Objective-C no iOS, use o seguinte snippet de código para criar um arquivo de log no diretório de documentos do aplicativo:

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

Para acessar o arquivo criado, adicione as propriedades abaixo à lista de propriedades Info.plist do aplicativo:

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

Se você estiver usando o Swift no iOS, use o seguinte snippet de código para habilitar logs:

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)

Veja mais informações sobre o sistema de arquivos do iOS aqui.

Registro em log com vários reconhecedores

Embora um caminho de saída de arquivo de log seja especificado como uma propriedade de configuração em um SpeechRecognizer ou outro objeto SDK, o registro em log do SDK é uma instalação singleton, em todo o processo, sem nenhum conceito de instâncias individuais. Você pode considerar isso como o construtor SpeechRecognizer (ou semelhante) chamando implicitamente uma rotina estática e interna "configurar registro em log global" com os dados de propriedade disponíveis no SpeechConfig correspondente.

Isso significa que você não pode, por exemplo, configurar seis reconhecedores paralelos para saída simultânea de seis arquivos separados. Em vez disso, o reconhecedor mais recente criado configurará a instância de log global para saída para o arquivo especificado em suas propriedades de configuração e todo o registro em log do SDK será emitido para esse arquivo.

Isso também significa que o tempo de vida do objeto que configurou o registro em log não está vinculado à duração do registro em log. O registro em log não será interrompido em resposta à versão de um objeto SDK e continuará desde que nenhuma nova configuração de registro em log seja fornecida. Uma vez iniciado, o log em todo o processo pode ser interrompido definindo o caminho do arquivo de log para uma cadeia de caracteres vazia ao criar um novo objeto.

Para reduzir a possível confusão ao configurar o registro em log para várias instâncias, pode ser útil abstrair o controle do registro em log de objetos que fazem trabalho real. Um exemplo de par de rotinas auxiliares:

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

Próximas etapas