Ativar o registo no SDK de Voz

O registo num ficheiro é uma funcionalidade opcional para o SDK de Voz. Durante o desenvolvimento, o registo disponibiliza informações e diagnósticos adicionais dos componentes principais do SDK de Voz. Ele pode ser habilitado definindo a Speech_LogFilename propriedade em um objeto de configuração de fala para o local e o nome do arquivo de log. O registro em log é manipulado por uma classe estática na biblioteca nativa do Speech SDK. Você pode ativar o registro em log para qualquer instância de sintetizador ou reconhecedor do Speech SDK. Todas as instâncias no mesmo processo gravam entradas de log no mesmo arquivo de log.

Exemplo

O nome do arquivo de log é especificado em um objeto de configuração. Tomando o SpeechConfig como exemplo e assumindo 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 permite o registro em log para todos os reconhecedores.

Nota

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.

JavaScript é uma exceção em que o log é habilitado por meio do diagnóstico do SDK, conforme mostrado no trecho de código a seguir:

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

Criar um arquivo de log em diferentes plataformas

Para Windows ou Linux, o arquivo de log pode estar em qualquer caminho para o 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). Um arquivo de log pode ser criado na pasta do aplicativo local:

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

Dentro de um aplicativo UWP Unity, um arquivo de log pode ser criado usando a pasta de caminho de dados persistente do aplicativo da seguinte maneira:

#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, consulte Permissões de acesso a arquivos.

Android

Você pode salvar um arquivo de log no armazenamento interno, no armazenamento externo ou no 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 salvará um arquivo de log no armazenamento externo na raiz de um diretório específico do aplicativo. Um 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 WRITE_EXTERNAL_STORAGE permissão 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>

Dentro de um aplicativo Unity Android, o arquivo de log pode ser criado usando a pasta de caminho de dados persistente do aplicativo da seguinte maneira:

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

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

Mais informações sobre dados e armazenamento de arquivos para aplicativos Android estão disponíveis aqui.

iOS

Somente diretórios dentro da área restrita do aplicativo são acessíveis. Os arquivos podem ser criados nos diretórios documentos, biblioteca e temporários. Os arquivos no diretório de documentos podem ser disponibilizados para um usuário.

Se você estiver usando o Objective-C no iOS, use o seguinte trecho 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 um arquivo criado, adicione as propriedades abaixo à Info.plist lista de propriedades do aplicativo:

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

Se você estiver usando o Swift no iOS, use o seguinte trecho de código para habilitar os 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)

Mais informações sobre o iOS File System estão disponíveis aqui.

Registro em log com vários reconhecedores

Embora um caminho de saída do arquivo de log seja especificado como uma propriedade de configuração em um ou outro objeto SDK, o log do SDK é um SpeechRecognizer recurso único, em todo o processo, sem conceito de instâncias individuais. Você pode pensar nisso como o SpeechRecognizer construtor (ou similar) chamando implicitamente uma rotina estática e interna de "Configurar Log Global" com os dados de propriedade disponíveis no arquivo .SpeechConfig

Isso significa que você não pode, por exemplo, configurar seis reconhecedores paralelos para produzir simultaneamente 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 log do SDK será emitido para esse arquivo.

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

Para reduzir a confusão potencial ao configurar o log para várias instâncias, pode ser útil abstrair o controle do log de objetos que fazem trabalho real. Um exemplo de duas 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óximos passos