مقدمة
تُعد أحد الطرق المهمة لتحسين إمكانية الوصول داخل التطبيقات هي تمرير النصوص لقارئات الشاشة ومحركات تحويل النص إلى كلام.
تعني عملية تمرير النصوص أن تجعل قارئ الشاشة يقوم بنطق ما تقوم بتمريره له في الوقت المناسب, وذلك لدعم تفاعل التطبيق الخاص بك مع قارئات الشاشة ومحركات تحويل النص إلى كلام.
على سبيل المثال: يمكنك تمرير قيمة شريط التقدم لقارئات الشاشة عند ضغط المستخدم على إختصار محدد, أو تمرير رسالة لنجاح العملية بعد الانتهاء.
لتسهيل استخدام هذه الوسيلة في التطبيقات ، وخاصة تلك التي يتم تطويرها ببيثون قمنا بتطوير مكتبة PythonUniversalSpeech. تعتمد هذه المكتبة على المكتبة مفتوحة المصدر UniversalSpeech التي تم تطويرها بلغة C++.
ما هي مكتبة PythonUniversalSpeech:
تعتبر مكتبة PythonUniversalSpeech حزمة Python للتفاعل مع UniversalSpeech DLL، وتوفر وظائف لتوليد الكلام وعرض برايل. تتوافق هذه المكتبة مع إصدارات Python الـ 32 بت و 64 بت.
تهدف UniversalSpeech إلى تبسيط وتسهيل تمرير النصوص لقارئات الشاشة ومحركات تحويل النص إلى كلام داخل التطبيقات. يتحقق ذلك عن طريق توفير واجهة موحدة تسمح تمرير النص إلى وسائل مختلفة، تشمل برامج قراءة الشاشة النشطة، ومحركات تحويل النص إلى صوت الأساسية/الخاصة بنظام التشغيل. وتتكيف المكتبة بشكل ديناميكي بناءً على ما هو متاح ومدعوم، مما يوفر حلاً متكاملاً ومتعدد الاستخدامات للوظائف المتعلقة بتمرير النصوص إلى قارئات الشاشة ومحركات تحويل النص إلى كلام.
تم بناء PythonUniversalSpeech على UniversalSpeech، التي تم تطويرها أولاً بواسطة qtnc. لمعرفة المزيد حول المشروع وتفاصيله، يمكنك زيارة مستودع GitHub الخاص بـ UniversalSpeech.
المحركات المدعومة
- Jaws for windows.
- NVDA 2011.1 أو أحدث.
- Windows eye.
- System access.
- Supernova.
- Cobra، مدعومة جزئيا.
- SAPI 5.
- ZDSRAPI.
التثبيت
لتثبيت مكتبة UniversalSpeech، يمكنك استخدام الأمر pip التالي:
pip install UniversalSpeech
بدلا من ذلك، يمكنك تنزيل المشروع مباشرة من مستودع GitHub من هذا الرابط واستخدامه في مشروع Python الخاص بك.
الاستخدام:
UniversalSpeech class:
يوفر UniversalSpeech
class واجهة مبسطة للتفاعل مع مكتبة UniversalSpeech DLL.
السمات (Attributes):
engine_used
(str): تُعيد اسم المحرك الحالي للكلام.rate_supported
(bool): تشير ما إذا كان تعيين سرعة الكلام مدعومًا في المحرك الحالي.volume_supported
(bool): تشير ما إذا كان تعيين حجم الصوت مدعومًا في المحرك الحالي.pitch_supported
(bool): تشير ما إذا كان تعيين حدة الصوت مدعومًا في المحرك الحالي.inflexion_supported
(bool): تشير ما إذا كان تعيين لحن الصوت مدعومًا في المحرك الحالي.
الوظائف (Methods):
say(msg: str, interrupt: bool = True) -> None
:- تقوم بنطق الرسالة المعطاة باستخدام محرك الكلام.
- تشير المعلمة msg إلى الرسالة المراد نطقها.
- تستخدم المعلمة interrupt: لتحديد ما إذا كان يمكن قطع الكلام الحالي (إذا كان قائمًا) عند تشغيل الدالة أم لا. القيمة الافتراضية هي True.
say_a(msg: str, interrupt: bool = True) -> None
:- تقوم بنطق الحرف الأول من الرسالة المعطاة باستخدام محرك الكلام.
braille(msg: str) -> None
:- تعرض الرسالة المعطاة ببرايل.
speech(msg: str) -> None
:- تقوم بنطق الرسالة وعرضها بالبرايل.
speech_a(msg: str) -> None
:- تقوم بنطق الحرف الأول وعرض الرسالة بالبرايل.
stop() -> None
:- توقف الكلام.
get_value(what) -> int
:- تحصل على القيمة الحالية لمعامل الكلام المحدد.
- ملحوظة: يمكنك معرفة المعلمات المتاحة بالإطلاع على بداية هذا الملف.
set_value(what, value) -> None
:- تعيين قيمة معامل الكلام المحدد.
get_string(what) -> str
:- تحصل على تمثيل نصي لمعامل الكلام المحدد.
enable_native_speech(enabled: bool = True) -> None
:- تحديد ما إذا كان يجب استخدام محركات الكلام الأصلية، مثل SAPI على نظام التشغيل Windows، والتي عمومًا تكون موثوقة ويمكن استخدامها عند عدم توفر محركات أخرى.
- إذا تم تعيين
enabled
إلى True، يتم استخدام محركات الكلام الأصلية. إذا تم تعيينها إلى False، يتم تجاهل الكلام في مثل هذه الحالات.
get_engines() -> List[Dict]
:- تحصل على قائمة بمحركات الكلام المتاحة مع أسمائها وتوفرها ومعرفاتها.
set_rate(value: int, min_rate: int = None, max_rate: int = None) -> None
:- تعيين سرعة الكلام واختياريًا القيم الدنيا والعليا.
set_volume(value: int, min_volume: int = None, max_volume: int = None) -> None
:- تعيين مستوى الصوت واختياريًا القيم الدنيا والعليا.
set_pitch(value: int, min_pitch: int = None, max_pitch: int = None) -> None
:- تعيين حدة الصوت واختياريًا القيم الدنيا والعليا.
set_inflexion(value: int, min_inflexion: int = None, max_inflexion: int = None) -> None
:- تعيين لحن الصوت واختياريًا القيم الدنيا والعليا.
الاستثناءات:
DLLFileNotFoundError(Exception)
:- يتم رفعه عندما يكون أحد ملفات DLL اللازمة مفقودًا.
UnsupportedError(Exception)
:- يتم رفعه عندما لا يتم دعم وظيفة محددة مع المحرك الحالي.
مثال:
import UniversalSpeech
# Create an instance of UniversalSpeech
uspeech = UniversalSpeech.UniversalSpeech()
# Enable the use of native speech engines such as SAPI
uspeech.enable_native_speech(True)
#Say a message
uspeech.say("Hello, world.")
# Display a message in braille
uspeech.braille("Hello, world.")
# Get engine used
engine_used = uspeech.engine_used
print("You are using {}.".format(engine_used))
# Get list of available engins
available_engines = uspeech.get_engines()
print(available_engines)
# set the rate if it is supported
try:
uspeech.set_rate(150)
except UniversalSpeech.exceptions.UnsupportedError as e:
print(e)
السلام عليكم.
بارك الله فيكم على هذه المكتبة النافعة المهمة.
لدي سؤال:
جربتُ استخدام المكتبة وعمل معي البرنامج بشكل ممتاز. لكن عند محاولة إنشاء ملف تنفيذي له باستخدام pyinstaller ، بعد تنفيذ الكود تظهر رسالة: UniversalSpeech.exceptions.DLLFileNotFoundError: Missing dll files. هل ينبغي تضمين مجلد ملفات dll ضمن مجلد البرنامج؟ أم كيف نعالج هذه المشكلة؟
شكرا لكم.
وعليكم السلام
نعم يجب تضمين ملفات dll مع التجميع, وهو المفترض ما تقوم به pyinstaller, ولكن من الواضح ان هناك مشكلة معها.
يرجى تجربة القيام بتثبيت المكاتب في بيئة إفتراضية Virtual environment ومن ثم التجميع من هذه البيئة.
أو بستخدام مكتبة cx_freeze في التجميع وهو ما افضله.
السلام عليكم.
شكرا على ردكم.
حقيقةً كنتُ قد جربتُ أيضا التجميع عبر بيئة افتراضية مع pyinstaller، ولم تنجح العملية، هل يمكن إضافة مجلد دفعة واحدة للمتغير datas ضمن ملف الخصائص بحيث يحوي كافة الملفات؟
جربتُ أيضا cxfreeze بعد أن أشرتم إليها مشكورين، وقد عمل الملف التنفيذي جيدا، لكن، هل من طريقة مع هذه المكتبة لجعل الملف التنفيذي يضم كافة ملفات المشروع بما في ذلك ملفات البيانات وملفات dll، دون أن تكون منفصلة إلى جانبه في ذات المجلد؟
بارك الله فيكم.
عليكم السلام،
أولاً، نعتذر عن التأخر في الرد.
ثانيا, نعم، يمكن تضمين مجلد بأكمله باستخدام دالة collect_data_files من PyInstaller، أو من خلال استخدام حلقة loop لتجميع تلك الملفات في قائمة list. على سبيل المثال:
data = [(os.path.join(folder, f), folder) for f in os.listdir(folder)]
ولكنني أعتقد أن UniversalSpeech لم تتمكن أيضًا من العثور على تلك الملفات بسبب تجميعها في مسار مختلف.
على أي حال، الأمر يحتاج إلى بعض التجارب. إذا وجدتِ شكلًا لمسار يجب أن يحتوي على ملفات DLL بعد التجميع، يمكنني التعديل لأخذ ذلك في الاعتبار.
أما بالنسبة للسؤال الثاني، للأسف لا توجد طريقة لتجميع البرنامج في ملف تنفيذي واحد باستخدام cx_Freeze.