PDA

View Full Version : سوال: گفتار به واج



inspirationB
پنج شنبه 10 مرداد 1392, 23:29 عصر
سلام
من می خوام که گفتار پیوسته رو به واج های تشکیل دهنده اون تبدیل کنم (زبان هم مهم نیست که فارسی یا انگلیسی باشه!) فقط می خوام بدونم با library های سی شارپ مثل speechlib یا system.spech می شه همچسن کاری رو کرد یا نه
ممنون

مهرداد صفا
جمعه 11 مرداد 1392, 03:01 صبح
باسلام.
بله. از رویداد System.Speech.Synthesis.SpeechSynthesizer.PhonemeR eached در مورد System.Speech و رویداد SpeechLib.SpVoice.Phoneme در مورد SpeechLib استفاده کنید.
رویدادهای فوق با پردازش هر phoneme در هنگام speak اتفاق می افتند. اگر توضیح بیشتری نیاز بود بفرمایید.

در ضمن جهت اطلاع SpeechLib کمپوننت ویندوز و System.Speech هم classLibrary مربوط به .net هستند و نه فقط برای c#.

inspirationB
جمعه 11 مرداد 1392, 09:48 صبح
خیلی خیلی ممنونم
راستش من توی سی شارپ خیلی مبتدی ام ... ببینید من یه کد دارم که از فایل wav یک گفتار رو می خونه و در یک کنترل متنی این گفتار رو می نویسه .... و الان دقیقا می خوام به جای اون تکس ... تکس فونتیکش نوشته شه ... پس با توجه به این موردی که شما فرمودید بنظرتون باید این طوری بنویسم؟
textbox1.text=System.Speech.Synthesis.SpeechSynthe sizer.PhonemeR eached
یا
textbox1.text=SpeechLib.SpVoice.Phoneme
ممنون میشم که در این مورد هم راهنماییم کنید .....

manij_mhm
جمعه 11 مرداد 1392, 10:51 صبح
من یه کد دارم که از فایل wav یک گفتار رو می خونه و در یک کنترل متنی این گفتار رو می نویسه
سلام . منم فک کنم همون برنامه شما رو داشته باشم. اما بدرستی اجرا نمیشه! برای شما متن فایل رو به درستی تایپ میکنه؟!

مهرداد صفا
جمعه 11 مرداد 1392, 12:18 عصر
خیلی خیلی ممنونم
راستش من توی سی شارپ خیلی مبتدی ام ... ببینید من یه کد دارم که از فایل wav یک گفتار رو می خونه و در یک کنترل متنی این گفتار رو می نویسه .... و الان دقیقا می خوام به جای اون تکس ... تکس فونتیکش نوشته شه ... پس با توجه به این موردی که شما فرمودید بنظرتون باید این طوری بنویسم؟
textbox1.text=System.Speech.Synthesis.SpeechSynthe sizer.PhonemeR eached
یا
textbox1.text=SpeechLib.SpVoice.Phoneme
ممنون میشم که در این مورد هم راهنماییم کنید .....

خواهش می کنم.
شما باید ابتدا مطمئن باشید موتور مورد نظر از sapi synthesizer استفاده می کند. حتی ممکن است موتور sapi باشد ولی این رویداد در آن ساپورت نشود.
در ضمن برای استفاده از رویداد هم قبلا باید نمونه سازی از کلاس صورت گرفته شده باشد و از خصوصیت Phoneme مربوط به آرگومنت رویداد باید استفاده کنید.
پیشنهاد می کنم قبل از شروع در مورد کلاسها و رویدادها و هندلرها مطالعه بفرمایید.
ولی در هر صورت چون منابع به طور کلی در این زمینه ها زیاد نیست یک نمونه کد برای تبدیل متن به هجا:

//in the name of god
//صل الله علی محمد و آله





using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
System.Speech.Synthesis.SpeechSynthesizer synthesizer = new System.Speech.Synthesis.SpeechSynthesizer();
synthesizer.SpeakAsync("hello! how are you ");
synthesizer.PhonemeReached += new EventHandler<System.Speech.Synthesis.PhonemeReachedEventArgs>(this.Synthesizer_PhonemeReached);

}

void Synthesizer_PhonemeReached(object sender, System.Speech.Synthesis.PhonemeReachedEventArgs e)
{
textBox1.Text += e.Phoneme;
}
}
}


برای توضیحات بیشتر و دقیقتر باید کد رو ببینم.
باز هم در مورد مطالعه مواردی که گفتم تاکید می کنم.

inspirationB
جمعه 11 مرداد 1392, 16:05 عصر
سلام بازم ممنون من این برنامه رو ران کردم و خروجی مطلوبی نگرفتم !!! خروجی که گرفتم دقیقا اینه :" hɛloha͡ʊɑɻju" میشه بازم کمکم کنید ؟؟؟؟

inspirationB
جمعه 11 مرداد 1392, 16:08 عصر
سلام . منم فک کنم همون برنامه شما رو داشته باشم. اما بدرستی اجرا نمیشه! برای شما متن فایل رو به درستی تایپ میکنه؟!
تقریبا برای فایلهایی که داشتم 70 درصدشون رو درست جواب داده !! البته فایلهای من یک کلمه ای بوده و اعداد یک تا نه که فقط برای عدد نه و دو درست تبدیل نکرده ....

inspirationB
جمعه 11 مرداد 1392, 16:12 عصر
سلام بازم ممنون من این برنامه رو ران کردم و خروجی مطلوبی نگرفتم !!! خروجی که گرفتم دقیقا اینه :" hɛloha͡ʊɑɻju" میشه بازم کمکم کنید ؟؟؟؟
ببخشید من الان که دقت کردم درسته خیلی خیلی سپاس گزارم....

inspirationB
جمعه 11 مرداد 1392, 16:15 عصر
ببخشید من الان که دقت کردم درسته خیلی خیلی سپاس گزارم....
فقط یه خواهش دیگه؟؟؟ میشه راهنماییم کنید و بگید بجای "hello! how are you " در کد فایل wav رو قرار بدم؟ بنظرتون از فایل صوتی بخونم و در اون قسمت قرار بدم ؟اگه تو این قسمت هم کمکم کنید خیلی خیلی ممنونتون میشم !!!!

مهرداد صفا
جمعه 11 مرداد 1392, 18:27 عصر
فقط یه خواهش دیگه؟؟؟ میشه راهنماییم کنید و بگید بجای "hello! how are you " در کد فایل wav رو قرار بدم؟ بنظرتون از فایل صوتی بخونم و در اون قسمت قرار بدم ؟اگه تو این قسمت هم کمکم کنید خیلی خیلی ممنونتون میشم !!!!

خواهش می کنم.
همونطور که گفتم نتیجه کار به نوع انجینی که استفاده می کنید و روش شما خیلی بستگی دارد.
از prompt یا xmlیا .. استفاده می کنید؟
برای راهنمایی بیشتر لطفا کدی را که برای تولید گفتار استفاده می کنید قرار بدهید.

inspirationB
جمعه 11 مرداد 1392, 21:29 عصر
خواهش می کنم.
همونطور که گفتم نتیجه کار به نوع انجینی که استفاده می کنید و روش شما خیلی بستگی دارد.
از prompt یا xmlیا .. استفاده می کنید؟
برای راهنمایی بیشتر لطفا کدی را که برای تولید گفتار استفاده می کنید قرار بدهید.
این کد رو من استفاده کردم :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Speech;
using System.IO;
using SpeechLib;

namespace phoneme
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

}

void Synthesizer_PhonemeReached(object sender, System.Speech.Synthesis.PhonemeReachedEventArgs e)
{
textBox1.Text += e.Phoneme;
}

private void Form1_Load(object sender, EventArgs e)
{

System.Speech.Synthesis.SpeechSynthesizer synthesizer = new System.Speech.Synthesis.SpeechSynthesizer();
synthesizer.SpeakAsync("two");
synthesizer.PhonemeReached += new EventHandler<System.Speech.Synthesis.PhonemeReachedEventArgs>(this.Synthesizer_PhonemeReached);
}
}
}

inspirationB
جمعه 11 مرداد 1392, 22:30 عصر
این کد رو من استفاده کردم :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Speech;
using System.IO;
using SpeechLib;

namespace phoneme
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

}

void Synthesizer_PhonemeReached(object sender, System.Speech.Synthesis.PhonemeReachedEventArgs e)
{
textBox1.Text += e.Phoneme;
}

private void Form1_Load(object sender, EventArgs e)
{

System.Speech.Synthesis.SpeechSynthesizer synthesizer = new System.Speech.Synthesis.SpeechSynthesizer();
synthesizer.SpeakAsync("two");
synthesizer.PhonemeReached += new EventHandler<System.Speech.Synthesis.PhonemeReachedEventArgs>(this.Synthesizer_PhonemeReached);
}
}
}

البته این کدی هست که گفتار رو به هجا تبدیل کرده و برای خوندن گفتار از فایل ورودی از این کد استفاده کردم که به متن تبدیل میشه :

inspirationB
جمعه 11 مرداد 1392, 22:31 عصر
البته این کدی هست که گفتار رو به هجا تبدیل کرده و برای خوندن گفتار از فایل ورودی از این کد استفاده کردم که به متن تبدیل میشه :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using SpeechLib;
using System.Speech;

namespace SpeechFromFile
{
public partial class Form1 : Form
{
private SpeechLib.ISpeechRecoContext wavRecoContext = null;
private SpeechLib.SpFileStream InputWAV = null;
private SpeechLib.ISpeechRecoGrammar Grammar = null;
private String _WAVFile = null;
private string strData = "No recording yet";
private String _lastRecognized = "";
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void button1_Click(object sender, EventArgs e)
{

OpenFileDialog dialog = new OpenFileDialog();
dialog.Title = "Select a Speech file";
dialog.ShowDialog();
_WAVFile = dialog.FileName;
if (_WAVFile == null) return;
//***********************************************
// Now we have the WAV file, we can set up the
// inline SPeech Engine to process it
//***********************************************
// create the recognition context
wavRecoContext = new SpeechLib.SpInProcRecoContext();
//************************************************** ****************
// Register our event as a listener on the Recognition event
// that way, anytime the speech engine thinks it "hears" something
// that it recognize, we're called to check it out for ourselves
//************************************************** ******************
((SpInProcRecoContext)wavRecoContext).Recognition +=
new _ISpeechRecoContextEvents_RecognitionEventHandler( wavRecoContext_Recognition);
//************************************************** ****************
// Register a method on the endStream event so we can do basic clean-up
// when the Audio file is finished
//************************************************** ****************
((SpInProcRecoContext)wavRecoContext).EndStream += new _ISpeechRecoContextEvents_EndStreamEventHandler(wa vRecoContext_EndStream);
//************************************************** ***********************
// the parameter passed to CreateGrammar is any int. It is only used as if
// you have more than one grammar active, so you can specify which one is
// to be used....
//************************************************** ***********************
Grammar = wavRecoContext.CreateGrammar(0);
// I simply use the default Frammar for dictation
Grammar.DictationLoad("", SpeechLoadOption.SLOStatic);
//************************************************** ***********************
//Speech engine is now ready to go, so set it to the
// audio file TO do this, we open the requested file
// using the SPeechStreamFileMode, and pass that to the
// speech engine to use as its input source
//************************************************** ***********************
InputWAV = new SpFileStreamClass();
InputWAV.Open(@_WAVFile, SpeechStreamFileMode.SSFMOpenForRead, false);
System.Speech.Synthesis.SpeechSynthesizer synthesizer = new System.Speech.Synthesis.SpeechSynthesizer();
synthesizer.SpeakAsync(InputWAV);
synthesizer.PhonemeReached += new EventHandler<System.Speech.Synthesis.PhonemeReachedEventArgs>(this.Synthesizer_PhonemeReached);
//wavRecoContext.Recognizer.AudioInputStream = InputWAV;
//************************************************** ***********************
// the way you "Turn On" the speech engine is by setting the Diction State
// of its grammar to "Active"
//************************************************** ***********************
Grammar.DictationSetState(SpeechRuleState.SGDSActi ve);
//************************************************** ***********************
// the result will be handled by wavRecoContext_Recognition()
//************************************************** ***********************
}


//************************************************** *************
//' Event fired when speech recognition engine recognizes audio
//************************************************** *************
private void wavRecoContext_Recognition(int StreamNumber, object StreamPosition, SpeechRecognitionType RecognitionType, ISpeechRecoResult Result)
{
strData = Result.PhraseInfo.GetText(0, -1, true);
// parseSpeechResult(strData); -- Call a function to parse it if wanted
_lastRecognized = textBox1.Text;
textBox1.Text = strData;

}
void Synthesizer_PhonemeReached(object sender, System.Speech.Synthesis.PhonemeReachedEventArgs e)
{
textBox1.Text += e.Phoneme;
}

//************************************************** *************

//' End of wav Input Stream reached by speech recognition engine

//************************************************** *************

private void wavRecoContext_EndStream(int StreamNumber, object StreamPosition, bool f)
{
// ' Disable dictation
Grammar.DictationSetState(SpeechRuleState.SGDSInac tive);

}


}
}

inspirationB
شنبه 12 مرداد 1392, 10:06 صبح
سلام من هنوز منتظرم ... اگه امکانش هست یکم زودتر جوابمو بدید ممنونتون می شم !!!:خجالت:

مهرداد صفا
یک شنبه 13 مرداد 1392, 13:06 عصر
با سلام.
دقت داشته باشی که تشخیص صدا (speech recognition) و تولید گفتار (speech synthesis) دو بحث مجزا هستند. شما باید ابتدا فایل صوتی را با استفاده از recognition به متن تبدیل کنید و بعد می توانید متن به دست آمده را با استفاده از synthesizer به هجاهای تشکیل دهنده تبدیل کنید.

inspirationB
دوشنبه 11 شهریور 1392, 12:19 عصر
سلام روز شما بخیر .....
ببینید برنامه به درستی کار میکنه ولی واج هایی که تولید میشن بعضا با اونچه که انتظار میره متفاوته مثلا یه نمونه اش روی واج w هستش که یه کاراکتر نامفهوم شبیه r که برعکس هست رو میده که اینو در تستهای مکرر متوجه شدم البته بگم که درست تلفظش میکنه یعنی وقتی صدای ورودی رو به متن و متن رو دوباره به صدا تبدیل میکنه منطبق هستن .... و اینکه قرار با حرکت لب مچ بشن ایرادی نداره می تونم زمانی که میگم مثلا برای w این حرکت رو داشته باش بگم برای r برعکس همون حرکت w رو داشته باش ! ولی برای چنتا از واج ها اینطوریه ...... از جهتی میدونم که این مربوط به engine که دارم استفاده می کنم و سعی کردم از control panel تغییر بدمش ولی نشد یا حتی مقدار value رو در تابع مربوط به grammer تغییر بدم بازهم نشد آیا راهی برای حل این مشکل هست ؟
و اینکه میشه به جای تابع SpeakAsync از چیز دیگه ای استفاده کرد که واج ها رو بده اما صدایی نداشته باشه و بدون تولید صدا تنها واج های متن رو برام داخل یه استرینگ بریزه ؟

خیلی خیلی ازتون ممنون و سپاسگزارم

مهرداد صفا
سه شنبه 12 شهریور 1392, 13:17 عصر
سلام روز شما بخیر .....
ببینید برنامه به درستی کار میکنه ولی واج هایی که تولید میشن بعضا با اونچه که انتظار میره متفاوته مثلا یه نمونه اش روی واج w هستش که یه کاراکتر نامفهوم شبیه r که برعکس هست رو میده که اینو در تستهای مکرر متوجه شدم البته بگم که درست تلفظش میکنه یعنی وقتی صدای ورودی رو به متن و متن رو دوباره به صدا تبدیل میکنه منطبق هستن .... و اینکه قرار با حرکت لب مچ بشن ایرادی نداره می تونم زمانی که میگم مثلا برای w این حرکت رو داشته باش بگم برای r برعکس همون حرکت w رو داشته باش ! ولی برای چنتا از واج ها اینطوریه ...... از جهتی میدونم که این مربوط به engine که دارم استفاده می کنم و سعی کردم از control panel تغییر بدمش ولی نشد یا حتی مقدار value رو در تابع مربوط به grammer تغییر بدم بازهم نشد آیا راهی برای حل این مشکل هست ؟

سلام. مرسی.
ببینید برای کاری که شما قصد انجامش رو دارید، باید روی phoneme ها تمرکز کنید و نه روی حروف. موارد زیادی هست که یک حرف تلفظ متفاوتی داشته باشد و یا یک حرف تلفظ نشود. البته فکر می کنم که همین کار رو هم تا به حال انجام دادید پس در این صورت عکس العمل برنامه رو روی phoneme ها تنظیم کنید و از شکل املایی کلمه صرف نظر کنید، و یا همانطور که اشاره کردید می توانید phoneme هایی اینچنینی را با حروف مورد نظرتان جایگزین کنید.مربوط به انجینی که
در هر حال شکل و تعداد و نوع phoneme ها به انجینی که استفاده می کنید بستگی دارد و احتمال هم دارد که در یک انجین با انجین دیگر متفاوت باشند و در عین حال قابل تغییر هم نیستند مگر اینکه از یک انجین دیگر استفاده کنید.
[/QUOTE]
و اینکه میشه به جای تابع SpeakAsync از چیز دیگه ای استفاده کرد که واج ها رو بده اما صدایی نداشته باشه و بدون تولید صدا تنها واج های متن رو برام داخل یه استرینگ بریزه ؟

خیلی خیلی ازتون ممنون و سپاسگزارم[/QUOTE]

خواهش می کنم.
برای تولید گفتار باید از متودهای Speak... استفاده کنید ولی اگر قصد دارید که صدایی از نرمافزار پخش نشود و صرفا از phoneme ها استفاده کنید می توانید Volume را 0 کنید و یا از متود SetOutPutToNull استفاده کنید. برای افزایش سرعت در گرفتن phoneme ها هم پیشنهاد می کنم Rate را زیاد کنید.

inspirationB
سه شنبه 12 شهریور 1392, 14:43 عصر
ممنون از لطف شما با SetOutPutToNull کاملا مشکلم حل شد البته قبلا از متدهای Speak استفاده کرده بودم و بصورت تکست phoneme ها رو در خروجی نمایش نمی دادند که خروجی بدون صدا بدست اومد و البته متد rate هم که خیلی خوب بود ... خیلی خیلی ممنون
اما در مورد انجین!ببینید چنتا از phoneme ها هستند که به این صورتن ولی اگه اشکالی نداشته باشه و امکانش باشه که انجینی باشه که تلفظ معیار انگلیسی رو به صورت نوشتاری متداول در فرهنگ لغات داشته باشه خیلی بهتر می شه !!!! آیا این وجود داره؟

مهرداد صفا
سه شنبه 12 شهریور 1392, 17:40 عصر
ممنون از لطف شما با SetOutPutToNull کاملا مشکلم حل شد البته قبلا از متدهای Speak استفاده کرده بودم و بصورت تکست phoneme ها رو در خروجی نمایش نمی دادند که خروجی بدون صدا بدست اومد و البته متد rate هم که خیلی خوب بود ... خیلی خیلی ممنون
اما در مورد انجین!ببینید چنتا از phoneme ها هستند که به این صورتن ولی اگه اشکالی نداشته باشه و امکانش باشه که انجینی باشه که تلفظ معیار انگلیسی رو به صورت نوشتاری متداول در فرهنگ لغات داشته باشه خیلی بهتر می شه !!!! آیا این وجود داره؟

خواهش می کنم.
PHONEME هایی که در اکثر انجینها استفاده می شود کم و بیش از علائم و کاراکترهای غیر متداول تشکیل شده. اگر ممکنه نام صدایی که استفاده می کنید بفرمایید.
نکته: نام صدا را به این صورت به دست بیاورید:


SpeechSynthesizer synthesizer = new SpeechSynthesizer();
MessageBox.Show(synthesizer.Voice.Name);

inspirationB
سه شنبه 12 شهریور 1392, 21:14 عصر
خواهش می کنم.
PHONEME هایی که در اکثر انجینها استفاده می شود کم و بیش از علائم و کاراکترهای غیر متداول تشکیل شده. اگر ممکنه نام صدایی که استفاده می کنید بفرمایید.
نکته: نام صدا را به این صورت به دست بیاورید:


SpeechSynthesizer synthesizer = new SpeechSynthesizer();
MessageBox.Show(synthesizer.Voice.Name);


Microsoft Anna

مهرداد صفا
سه شنبه 12 شهریور 1392, 22:22 عصر
لینک تعدادی از صداهای رایگان:
microsoft mary, mike and sam (http://ftp.pcworld.com/pub/new/graphics_and_multimedia/audio/audio_tools/msttsl.exe)
----------------------------------------
MS mary,mike and sam site2 (http://www.zero2000.com/files/microsoft-english-voices-sapi5.msi)
----------------------------------------
Microsoft Sapi 4 English voices: Mary, Mike and Sam (19 voices)
Mike, Mike in Hall, Mike in Space, Mike in Stadium, Mike (for Telephone), Male Whisper
Mary, Mary in Space, Mary in Hall, Mary in Stadium, Mary (for Telephone), Female Whisper
Sam
RoboSoft One, RoboSoft Two, RoboSoft Three, RoboSoft Four, RoboSoft Five, RoboSoft Six (http://ftp.pcworld.com/pub/new/graphics_and_multimedia/audio/audio_tools/msttsl.exe)
----------------------------------------
MS Sapi 4 Mary and Robots (8 voices) (http://www.zero2000.com/files/ms_mary.exe)
----------------------------------------
Sapi 4 L&H TruVoice American English voices (10 voices)
Peter, Sidney, Eddie, Douglas, Biff, Amos, Melvin, Alex, Wanda, Julia (http://activex.microsoft.com/activex/controls/agent2/tv_enua.exe)
----------------------------------------
البته برای استفاده از انجینهای sapi 4 باید از یک روش دیگر استفاده کنید و تنها Mary, mike and sam با استفاده از System.Speech قابل دسترس هستند که فکر می کنم مشکل شما رو حل کنند.