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 proprietà Speech_LogFilename
su un oggetto di configurazione del riconoscimento vocale al percorso e al 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 SpeechConfig
come esempio e presupponendo che sia stata creata un'istanza 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 ristrette 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, vedere 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 l'autorizzazione WRITE_EXTERNAL_STORAGE
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 File Explorer. Il percorso esatto della directory può variare tra i dispositivi Android. Il percorso è in genere la directory sdcard/Android/data/your-app-packagename/files
.
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
o in un altro oggetto SDK, la registrazione dell'SDK è un singleton, struttura a livello di processo senza alcun concetto di singole istanze. È possibile considerare questo aspetto come il costruttore SpeechRecognizer
(o simile) chiamando in modo implicito una routine statica e interna "Configura registrazione globale" con i dati delle proprietà disponibili nel SpeechConfig
corrispondente.
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 verranno 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, potrebbe 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("");
}