Abilitare la registrazione nell'SDK di Voce

La registrazione al file è una funzionalità facoltativa per Speech SDK. Durante lo sviluppo, la registrazione fornisce informazioni aggiuntive e diagnostiche dai componenti principali di Speech SDK. Può essere abilitata impostando la Speech_LogFilename proprietà su un oggetto di configurazione del riconoscimento vocale sul percorso e sul nome del file di log. La registrazione viene gestita da una classe statica nella libreria nativa di Speech SDK. È possibile attivare la registrazione per qualsiasi istanza di Riconoscimento Speech SDK o sintetizzatore. Tutte le istanze dello stesso processo scrivono voci di log nello stesso file di log.

Esempio

Il nome del file di log viene specificato in un oggetto di configurazione. Prendendo come esempio e presupponendo che sia stata creata un'istanza SpeechConfig denominata 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")

È possibile creare un riconoscitore dall'oggetto di configurazione. In questo modo viene abilitata la registrazione per tutti i riconoscitori.

Nota

Se si crea un oggetto SpeechSynthesizer dall'oggetto di configurazione, non verrà abilitata la registrazione. Se però la registrazione è abilitata, si riceverà anche la diagnostica da SpeechSynthesizer.

JavaScript è un'eccezione in cui la registrazione viene abilitata tramite la diagnostica dell'SDK, come illustrato nel frammento di codice seguente:

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

Creare un file di log in piattaforme diverse

Per Windows o Linux, il file di log può trovarsi in qualsiasi percorso per cui l'utente dispone dell'autorizzazione di scrittura. Le autorizzazioni di scrittura nei percorsi del file system in altri sistemi operativi potrebbero essere limitate o limitate per impostazione predefinita.

Piattaforma UWP (Universal Windows Platform)

Le applicazioni UWP devono posizionare i file di log in uno dei percorsi dei dati dell'applicazione (locale, roaming o temporaneo). È possibile creare un file di log nella cartella dell'applicazione locale:

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

All'interno di un'applicazione UWP unity, è possibile creare un file di log usando la cartella percorso dati permanente dell'applicazione come indicato di seguito:

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

Per altre informazioni sulle autorizzazioni di accesso ai file nelle applicazioni UWP, vedi Autorizzazioni di accesso ai file.

Android

È possibile salvare un file di log nella risorsa di archiviazione interna, nell'archiviazione esterna o nella directory della cache. I file creati nella risorsa di archiviazione interna o nella directory della cache sono privati per l'applicazione. È preferibile creare un file di log nell'archiviazione esterna.

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

Il codice precedente salverà un file di log nella risorsa di archiviazione esterna nella radice di una directory specifica dell'applicazione. Un utente può accedere al file con la gestione file (in genere in Android/data/ApplicationName/logfile.txt). Il file viene eliminato quando l'applicazione viene disinstallata.

È anche necessario richiedere WRITE_EXTERNAL_STORAGE l'autorizzazione nel file manifesto:

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

All'interno di un'applicazione Android Unity, il file di log può essere creato usando la cartella del percorso dati permanente dell'applicazione come indicato di seguito:

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

È anche necessario impostare l'autorizzazione di scrittura nelle impostazioni di Unity Player per Android su "External (SDCard)". Il log viene scritto in una directory che è possibile ottenere usando uno strumento come AndroidStudio Device Esplora file. Il percorso esatto della directory può variare tra i dispositivi Android. Il percorso è in genere la sdcard/Android/data/your-app-packagename/files directory.

Altre informazioni sull'archiviazione di dati e file per le applicazioni Android sono disponibili qui.

iOS

Sono accessibili solo le directory all'interno della sandbox dell'applicazione. I file possono essere creati nelle directory documenti, raccolte e temporanee. I file nella directory dei documenti possono essere resi disponibili per un utente.

Se si usa Objective-C in iOS, usare il frammento di codice seguente per creare un file di log nella directory dei documenti dell'applicazione:

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

Per accedere a un file creato, aggiungere le proprietà seguenti all'elenco Info.plist delle proprietà dell'applicazione:

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

Se si usa Swift in iOS, usare il frammento di codice seguente per abilitare i log:

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)

Altre informazioni sul file system iOS sono disponibili qui.

Registrazione con più riconoscitori

Anche se un percorso di output del file di log viene specificato come proprietà di configurazione in un SpeechRecognizer oggetto o in un altro oggetto SDK, la registrazione dell'SDK è una funzionalità singleton a livello di processo senza alcun concetto di singole istanze. È possibile considerare questo aspetto come il SpeechRecognizer costruttore (o simile) chiamando in modo implicito una routine statica e interna "Configura registrazione globale" con i dati delle proprietà disponibili nell'oggetto corrispondente SpeechConfig.

Ciò significa che non è possibile, ad esempio, configurare sei riconoscitori paralleli per l'output contemporaneamente a sei file separati. Al contrario, il riconoscitore più recente creato configurerà l'istanza di registrazione globale per l'output nel file specificato nelle relative proprietà di configurazione e tutte le registrazioni SDK vengono generate in tale file.

Ciò significa anche che la durata dell'oggetto che ha configurato la registrazione non è associata alla durata della registrazione. La registrazione non verrà interrotta in risposta al rilascio di un oggetto SDK e continuerà fino a quando non viene fornita alcuna nuova configurazione di registrazione. Dopo l'avvio, è possibile arrestare la registrazione a livello di processo impostando il percorso del file di log su una stringa vuota durante la creazione di un nuovo oggetto.

Per ridurre la potenziale confusione durante la configurazione della registrazione per più istanze, può essere utile astrarre il controllo della registrazione dagli oggetti che eseguono operazioni reali. Coppia di esempi di routine helper:

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

Passaggi successivi