تفعيل تسجيل الدخول إلى Speech SDK

يعد التسجيل إلى ملف ميزة اختيارية لـ Speech SDK. أثناء التطوير، يوفر التسجيل معلومات وتشخيصات إضافية من المكونات الأساسية ل Speech SDK. يمكن تمكينه عن طريق تعيين الخاصية Speech_LogFilename على كائن تكوين الكلام إلى موقع واسم ملف السجل. يتم التعامل مع التسجيل من خلال فئة ثابتة في مكتبة Speech SDK الأصلية. يمكنك تشغيل التسجيل لأي أداة التعرف على الكلام أو مثيل مُركِّب الصوت. تكتب جميع المثيلات في نفس العملية إدخالات السجل إلى ملف السجل نفسه.

عينة

تم تحديد اسم ملف السجل في عنصر التكوين. SpeechConfig أخذ كمثال وافتراض أنك قمت بإنشاء مثيل يسمى 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")

يمكنك إنشاء أداة التعرف من كائن التكوين. وهذا يتيح التسجيل لجميع أدوات التعرف.

إشعار

إذا قمت بإنشاء SpeechSynthesizer من كائن التكوين، فلن يقوم بتمكين التسجيل. ومع ذلك، إذا تم تمكين التسجيل، فستتلقى أيضاً تشخيصات من SpeechSynthesizer.

JavaScript هو استثناء حيث يتم تمكين التسجيل عبر تشخيصات SDK كما هو موضح في قصاصة التعليمات البرمجية التالية:

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

إنشاء ملف سجل على منصات مختلفة

بالنسبة لنظام التشغيل Windows أو Linux، يمكن أن يكون ملف السجل في أي مسار يمتلك المستخدم إذناً بالكتابة له. قد تكون أذونات الكتابة إلى مواقع نظام الملفات في أنظمة التشغيل الأخرى محدودة أو مقيدة بشكل افتراضي.

النظام الأساسي العام لـ Windows ‏(UWP)

تحتاج تطبيقات UWP إلى وضع ملفات السجل في أحد مواقع بيانات التطبيق (محلي أو متجول أو مؤقت). يمكن إنشاء ملف سجل في مجلد التطبيق المحلي:

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

داخل تطبيق Unity UWP، يمكن إنشاء ملف سجل باستخدام مجلد مسار البيانات الثابتة للتطبيق على النحو التالي:

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

لمزيد من المعلومات حول أذونات الوصول إلى الملفات في تطبيقات UWP، راجع أذونات الوصول إلى الملفات.

Android

يمكنك حفظ ملف السجل إما في وحدة التخزين الداخلية أو وحدة التخزين الخارجية أو دليل ذاكرة التخزين المؤقت. الملفات التي تم إنشاؤها في وحدة التخزين الداخلية أو دليل ذاكرة التخزين المؤقت خاصة بالتطبيق. يفضل إنشاء ملف سجل في التخزين الخارجي.

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

سيحفظ التعليمة البرمجية أعلاه ملف سجل في وحدة التخزين الخارجية في جذر دليل خاص بالتطبيق. يمكن للمستخدم الوصول إلى الملف باستخدام مدير الملفات (عادة في Android/data/ApplicationName/logfile.txt). يتم حذف الملف عند إلغاء تثبيت التطبيق.

تحتاج أيضاً إلى طلب إذن WRITE_EXTERNAL_STORAGE في ملف البيان:

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

داخل تطبيق Unity Android، يمكن إنشاء ملف السجل باستخدام مجلد مسار البيانات الثابتة للتطبيق على النحو التالي:

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

بالإضافة إلى ذلك، تحتاج أيضاً إلى تعيين إذن الكتابة في إعدادات Unity Player لنظام Android على "External (SDCard)". تتم كتابة السجل إلى دليل يمكنك الحصول عليه باستخدام أداة مثل AndroidStudio Device مستكشف الملفات. يمكن أن يختلف مسار الدليل الدقيق بين أجهزة Android. عادة ما sdcard/Android/data/your-app-packagename/files يكون الموقع هو الدليل.

يتوفر المزيد حول تخزين البيانات والملفات لتطبيقات Android هنا.

iOS

يمكن الوصول إلى الدلائل الموجودة داخل وضع الحماية للتطبيق فقط. يمكن إنشاء الملفات في المستندات والمكتبة والأدلة المؤقتة. يمكن إتاحة الملفات الموجودة في دليل المستندات للمستخدم.

إذا كنت تستخدم Objective-C على iOS، فاستخدم القصاصة البرمجية التالية لإنشاء ملف سجل في دليل مستند التطبيق:

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

للوصول إلى ملف تم إنشاؤه، أضف الخصائص التالية إلى قائمة خصائص التطبيق Info.plist :

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

إذا كنت تستخدم Swift على iOS، فاستخدم القصاصة البرمجية التالية لتمكين السجلات:

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)

يتوفر المزيد حول نظام ملفات iOS هنا.

التسجيل باستخدام أدوات التعرف المتعددة

على الرغم من تحديد مسار إخراج ملف السجل كخاصية تكوين في كائن SpeechRecognizer SDK أو أي عنصر آخر، فإن تسجيل SDK هو مرفق فردي على مستوى العملية دون أي مفهوم للمثيلات الفردية. يمكنك التفكير في هذا على أنه SpeechRecognizer المُنشئ (أو ما شابه) يستدعي ضمنياً إجراء "Configure Global Logging" ثابتاً وداخلياً باستخدام بيانات الخاصية المتوفرة في SpeechConfig المناظر.

وهذا يعني أنه لا يمكنك، على سبيل المثال، تكوين ستة أدوات التعرف المتوازية لإخراجها في وقت واحد إلى ستة ملفات منفصلة. بدلا من ذلك، سيقوم أحدث أداة التعرف التي تم إنشاؤها بتكوين مثيل التسجيل العمومي للإخراج إلى الملف المحدد في خصائص التكوين الخاصة به ويتم إرسال جميع تسجيل SDK إلى هذا الملف.

وهذا يعني أيضا أن عمر الكائن الذي قام بتكوين التسجيل غير مرتبط بمدة التسجيل. لن يتوقف التسجيل استجابة لإصدار كائن SDK وسيستمر طالما لم يتم توفير تكوين تسجيل جديد. بمجرد البدء، يمكن إيقاف التسجيل على مستوى العملية عن طريق تعيين مسار ملف السجل إلى سلسلة فارغة عند إنشاء كائن جديد.

لتقليل الارتباك المحتمل عند تكوين التسجيل لمثيلات متعددة، قد يكون من المفيد التحكم المجردة في التسجيل من الكائنات التي تقوم بعمل حقيقي. مثال زوج من الإجراءات المساعدة:

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

الخطوات التالية