25-04-20, 05:13 PM
تحويل النص إلا كلام بالعربي دون اتصال بالنت
السلام عليكم و رحمة الله و بركاتهبعد تتبع مسار ملفات الصوت الخاصة باللغة تبين ان هناك اكثر من ناطق باللغة العربية و لكن يلزم تفعيله
في البداية نتأكد من ان لغتنا لديها الميزات المطلوبة من الاعدادات
و اذا لم تكن مثبتة ميزة تحويل النص الى كلام فيجب تثبيتها
بعد ذلك نحن بحاجة الى حزم صوتية ناطقة بالعربية
نذهب الى التبويب كلام في نفس الصفحة
حتى هذه اللحظة هناك حزمتين للعرب
الاولى باسم hoda و هي تتبع جمهورية مصر.
و الثاني باسم Naayf و هو يتبع المملكة العربية السعودية.
الجدير بالذكر ان مشروع Naayf ما زال قيد التطوير و يمكنك الانضمام الى فريق التطوير.
بعد تثبيت الاصوات المطلوبة
الشيئ المؤسف في الموضوع ان هذه الاصوات لا يتم تثبيتها في المكان المطلوب بشكل افتراضي
اذ انه يجب ان تتوفر بشكل فعلي في المسار التالي الى جانب الاصوات القديمة.
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\SPEECH\Voices\Tokens
حيث لا تتواجد الى حزمتين اساسيتين في هذا المكان.
و بعد البحث عن الحزم التي قمنا بتثبيتها تبين انها تواجدت بمكان اخر
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Speech_OneCore\Voices\Tokens
لذا كنا مجبرين على اعادة زرعاها في المسار الاول و لتحقيق المهمة , نذهب الى المسار
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Speech_OneCore\Voices\Tokens
و نتبع كما بالصور
بعد تصدير الملف نحفظه في مكان على اي قرص ,
نقوم بفتح الملف عبر اي محرر نصوص
و نعدل داخله كما بالصورة
باستبدال المسار داخل الملف الى المسار المطلوب
و من ثم نحفظ الملف , و بعد ذلك نقوم بالضغط باليمين على الملف و من ثم Merge او دمج
و نعمل ذلك مع كل ملف جديد.
بعد هذا الجهد نلاحظ توفر الحزم في المكان المطلوب , و لم يتبقى سوى التجريب.
انشأ مشروع جديد و ضع عليه أدوات كما يلي
الاجراء الخاص بجلب الاصوات
PHP كود :
Private Sub Btn_GetVoices_Click(sender As Object, e As EventArgs) Handles Btn_GetVoices.Click
Using synth As SpeechSynthesizer = New SpeechSynthesizer()
For Each voice As InstalledVoice In synth.GetInstalledVoices()
Dim info As VoiceInfo = voice.VoiceInfo
Dim AudioFormats As String = ""
For Each fmt As SpeechAudioFormatInfo In info.SupportedAudioFormats
AudioFormats += String.Format("{0}" & vbLf, fmt.EncodingFormat.ToString())
Next
ListBox1.Items.Add(info.Name)
TextBox1.AppendText(info.Name & vbNewLine)
TextBox1.AppendText(info.Culture.DisplayName & vbNewLine)
TextBox1.AppendText(info.Age & vbNewLine)
TextBox1.AppendText(info.Gender & vbNewLine)
TextBox1.AppendText(info.Description & vbNewLine)
TextBox1.AppendText(info.Id & vbNewLine)
TextBox1.AppendText(voice.Enabled & vbNewLine)
If info.SupportedAudioFormats.Count <> 0 Then
TextBox1.AppendText(" Audio formats: " & AudioFormats & vbNewLine)
Else
TextBox1.AppendText(" No supported audio formats found" & vbNewLine)
End If
Dim AdditionalInfo As String = ""
For Each key As String In info.AdditionalInfo.Keys
AdditionalInfo += String.Format(" {0}: {1}" & vbLf, key, info.AdditionalInfo(key))
Next
TextBox1.AppendText(" Additional Info - " & AdditionalInfo & vbNewLine)
TextBox1.AppendText("ـــــــــــــــــــــــــــــــــــــــ" & vbNewLine)
Next
End Using
End Sub
الاجراء الخاص بالكلام
PHP كود :
Private Sub Speek_Arabic()
Dim speaker = New SpeechSynthesizer()
' speaker.Rate = -2
Dim culture = CultureInfo.GetCultureInfo("ar-SA")
Dim voices = speaker.GetInstalledVoices(culture)
If voices.Count > 0 Then
speaker.SelectVoice(voices(0).VoiceInfo.Name)
speaker.SpeakAsync(RichTextBox1.Text)
End If
End Sub
وجب التنويه الى ان Culture هو من يحدد المتحدث لذلك قمنا بجلب معلومات شاملة عن المعلق , و اذا توفر اكثر من متحدث بنفس اللهجة فاننا نختار اول معلق راجع الكود.
اما Hoda فـ Culture الخاص بها فهو (ar-EG).
اما المكاتب الخارجية فجربت احداها على الرابط التالي.
Vision A ID
الصوت نزل باسم معلق اسمه Maged.
يتم اختيار المعلق حسب اسمه في الكود .
يوجد العديد من المعلقين على الانترنت لكن الاشكال ان كل المعلقين مدفوعين.
لذا من النادر ان تجد معلق مجاني.
لا تنسى استيراد فضاء الاسماء الخاص بالمكتبة System.Speech.
اما داخل المشروع.
PHP كود :
Imports System.Speech.Synthesis
Imports System.Speech.AudioFormat
Imports System.Globalization
