设为首页 收藏本站
查看: 398|回复: 0

基于vc++2008托管代码开发Windows Vista语音朗读

[复制链接]

尚未签到

发表于 2015-4-30 10:32:09 | 显示全部楼层 |阅读模式
  闲的无聊,锻炼一下托管c++,
  看代码
  #pragma once
#include "Window1.g.h"
  using namespace System;
using namespace System::Collections::Generic;
using namespace System::Text;
using namespace System::Windows;
using namespace System::Windows::Controls;
using namespace System::Windows::Data;
using namespace System::Windows::Documents;
using namespace System::Windows::Input;
using namespace System::Windows::Media;
using namespace System::Windows::Media::Imaging;
using namespace System::Windows::Shapes;
  using namespace System::Collections::ObjectModel;
using namespace System::Xml;
  using namespace System::Speech::Synthesis;
  namespace speechSynth
{
///
/// Interaction logic for Window1.xaml
///
  //ORIGINAL LINE: public partial class Window1 : System.Windows.Window
//INSTANT C++ TODO TASK: C++ does not support 'partial' types. You must manually combine the entire Window1 type in one place.
public ref class Window1 : System::Windows::Window
{
private:
  SpeechSynthesizer ^synth;
  public:
  Window1()
  {
   InitializeComponent();
  synth = gcnew SpeechSynthesizer();
   synth->StateChanged += gcnew EventHandler(this, &Window1::synth_StateChanged);
   synth->BookmarkReached += gcnew EventHandler(this, &Window1::synth_BookmarkReached);
   synth->PhonemeReached += gcnew EventHandler(this, &Window1::synth_PhonemeReached);
   synth->SpeakCompleted += gcnew EventHandler(this, &Window1::synth_SpeakCompleted);
   synth->SpeakProgress += gcnew EventHandler(this, &Window1::synth_SpeakProgress);
   synth->SpeakStarted += gcnew EventHandler(this, &Window1::synth_SpeakStarted);
   synth->VisemeReached += gcnew EventHandler(this, &Window1::synth_VisemeReached);
   synth->VoiceChange += gcnew EventHandler(this, &Window1::synth_VoiceChange);
  this->btnSpeakText->Click += gcnew RoutedEventHandler(this, &Window1::btnSpeakText_Click);
   this->btnWavFile->Click += gcnew RoutedEventHandler(this, &Window1::btnWavFile_Click);
   this->btnVoices->Click += gcnew RoutedEventHandler(this, &Window1::btnVoices_Click);
   this->btnSpeakSsml->Click += gcnew RoutedEventHandler(this, &Window1::btnSpeakSsml_Click);
   this->btnPause->Click += gcnew RoutedEventHandler(this, &Window1::btnPause_Click);
   this->btnResume->Click += gcnew RoutedEventHandler(this, &Window1::btnResume_Click);
   this->btnPromptBuilder->Click += gcnew RoutedEventHandler(this, &Window1::btnPromptBuilder_Click);
   this->btnToXml->Click += gcnew RoutedEventHandler(this, &Window1::btnToXml_Click);
   this->btnSsmlPitch->Click += gcnew RoutedEventHandler(this, &Window1::btnSsmlPitch_Click);
   this->btnCutIn->Click += gcnew RoutedEventHandler(this, &Window1::btnCutIn_Click);
  this->sliderRate->ValueChanged += gcnew RoutedPropertyChangedEventHandler(this, &Window1::sliderRate_ValueChanged);
   this->sliderVolume->ValueChanged += gcnew RoutedPropertyChangedEventHandler(this, &Window1::sliderVolume_ValueChanged);
  }
  private:
  void btnCutIn_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   synth->SpeakAsyncCancelAll(); //stops current async call
   synth->SpeakAsync("this is some interrupting text"); //just appends, unless AsyncCancelAll() called first
   //synth.Speak("this is some interrupting text"); //does not interrupt async call
  }
  void btnSsmlPitch_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   XmlDocument ^xd = gcnew XmlDocument();
   xd->Load("ssmlPitch.xml");
   synth->SpeakSsmlAsync(xd->OuterXml);
  }
  #pragma region SYNTHESIZER_EVENTS
  void synth_VoiceChange(System::Object ^sender, VoiceChangeEventArgs ^e)
  {
   System::Diagnostics::Debug::WriteLine("VoiceChange : " + e->Voice->Name);
  }
  void synth_VisemeReached(System::Object ^sender, VisemeReachedEventArgs ^e)
  {
   System::Diagnostics::Debug::WriteLine("VisemeReached : " + e->Viseme.ToString());
  }
  void synth_SpeakStarted(System::Object ^sender, SpeakStartedEventArgs ^e)
  {
   System::Diagnostics::Debug::WriteLine("SpeakStarted");
  }
  void synth_SpeakProgress(System::Object ^sender, SpeakProgressEventArgs ^e)
  {
   System::Diagnostics::Debug::WriteLine("SpeakProgress : " + e->AudioPosition.TotalSeconds.ToString());
  }
  void synth_SpeakCompleted(System::Object ^sender, SpeakCompletedEventArgs ^e)
  {
   System::Diagnostics::Debug::WriteLine("SpeakCompleted");
  }
  void synth_PhonemeReached(System::Object ^sender, PhonemeReachedEventArgs ^e)
  {
   System::Diagnostics::Debug::WriteLine("PhonemeReached : " + e->Phoneme->ToString());
  }
  void synth_BookmarkReached(System::Object ^sender, BookmarkReachedEventArgs ^e)
  {
   System::Diagnostics::Debug::WriteLine("BookmarkReached : " + e->Bookmark);
  }
  void synth_StateChanged(System::Object ^sender, StateChangedEventArgs ^e)
  {
   System::Diagnostics::Debug::WriteLine("StateChanged : " + e->State.ToString());
   lblState->Content = e->State.ToString();
  }
  #pragma endregion
  void btnToXml_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   PromptBuilder ^myPrompt = GetBuiltPrompt();
   MessageBox::Show(myPrompt->ToXml());
  }
  void btnPromptBuilder_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   PromptBuilder ^pb = GetBuiltPrompt();
  //Now let's get the synthesizer to render this message
   //SpeechSynthesizer synth = new SpeechSynthesizer();
   synth->SetOutputToDefaultAudioDevice();
   synth->SpeakAsync(pb);
  }
  PromptBuilder ^GetBuiltPrompt()
  {
   //from http://msdn.microsoft.com/msdnmag/issues/06/01/speechinWindowsVista/
  //This prompt is quite complicated
   //So I'm going to build it first, and then render it.
   PromptBuilder ^myPrompt = gcnew PromptBuilder();
  //Start the main speaking style
   PromptStyle ^mainStyle = gcnew PromptStyle();
   mainStyle->Rate = PromptRate::Medium;
   mainStyle->Volume = PromptVolume::Loud;
   myPrompt->StartStyle(mainStyle);
  //Alert the listener
   myPrompt->AppendAudio(gcnew Uri("file://c://windows//media//notify.wav"), "Attention!");
   myPrompt->AppendText("Here are some important messages.");
  //Here's the first important message
   myPrompt->AppendTextWithPronunciation("WinFX", "w?n?f?ks");
   myPrompt->AppendText("is a great platform.");
  //And the second one
   myPrompt->AppendTextWithHint("ASP", SayAs::SpellOut);
   myPrompt->AppendText("is an acronym for Active Server Pages. Whereas an ASP is a snake.");
  myPrompt->AppendBreak();
  //Let's emphasise how important these messages are
   PromptStyle ^interimStyle = gcnew PromptStyle();
   interimStyle->Emphasis = PromptEmphasis::Strong;
   myPrompt->StartStyle(interimStyle);
   myPrompt->AppendText("Please remember these two things.");
   myPrompt->EndStyle();
  //Then we can revert to the main speaking style
   myPrompt->AppendBreak();
   myPrompt->AppendText("Thank you");
  myPrompt->EndStyle();
   return myPrompt;
  }
  void btnResume_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   synth->Resume();
  }
  void btnPause_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   synth->Pause();
  }
  void btnSpeakSsml_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   //http://www.w3.org/TR/speech-synthesis/
   synth->SetOutputToDefaultAudioDevice();
  //XmlDocument xd = new XmlDocument();
   ////xd.Load("sampleSSML.xml"); //works
   //xd.Load("ssmlPitch.xml"); //works
   //synth.SpeakSsmlAsync(xd.OuterXml);
  //XmlDocument xd = new XmlDocument();
   ////xd.Load("sampleSSML.xml"); //TODO doesn't work?
   //xd.Load("ssmlPitch.xml"); //TODO doesn't work?
   //PromptBuilder pb = new PromptBuilder();
   //pb.AppendSsmlMarkup(xd.DocumentElement.OuterXml);
   //synth.SpeakAsync(pb);
  PromptBuilder ^pb = gcnew PromptBuilder();
   pb->AppendText("blah");
   pb->AppendSsml("sampleSSML.xml"); //works
   //pb.AppendSsml("ssmlPitch.xml"); //TODO doesn't work
   synth->SpeakAsync(pb);
  }
  void sliderVolume_ValueChanged(System::Object ^sender, RoutedPropertyChangedEventArgs ^e)
  {
   synth->Volume = safe_cast(sliderVolume->Value);
  }
  void sliderRate_ValueChanged(System::Object ^sender, RoutedPropertyChangedEventArgs ^e)
  {
   synth->Rate = safe_cast(sliderRate->Value);
  }
  void btnVoices_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   ReadOnlyCollection ^voices = synth->GetInstalledVoices();
   System::String ^retVal = System::String::Empty;
   for each (InstalledVoice ^iv in voices)
   {
    retVal += iv->VoiceInfo->Name + "/r/n";
   }
   MessageBox::Show(retVal);
  }
  void btnWavFile_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   synth->SetOutputToWaveFile("spoken.wav");
   synth->Speak(GetText());
   synth->SetOutputToNull();
   MessageBox::Show("done");
  }
  void btnSpeakText_Click(System::Object ^sender, RoutedEventArgs ^e)
  {
   synth->SetOutputToDefaultAudioDevice();
   synth->SpeakAsync(GetText());
  }
  System::String ^GetText()
  {
   return txtToSpeak->Text->Trim();
  }
  };
}
  需要的留下EMAIL,我给大家发

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-62190-1-1.html 上篇帖子: windows server 2008 standard 激活 下篇帖子: 基于vc++2008托管代码开发Windows Vista语音识别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表