2012年01月02日
Speech Platform 11 で音声合成をする
Kinectは使わないですが...
Speech Platform 11 は音声認識の機能とともに、音声合成(コンピューターに文字を入力すると、音声として出力される)の機能も提供されています。
せっかくなので音声合成もやってみましょう。
環境設定などは、こちらを参照してください。
プロジェクト全体はこちらにあります
プロジェクトの作成
WPFのプロジェクトを作ります。
画面を適当に作ります。喋らせる文字を入力するテキストボックスと、トリガとなるボタンがあればOKです。
参照設定で「Microsoft.Speech.dll」を追加します。前回の動作確認を行っていれば、「参照の追加」から「最近使用したファイル」のタブにあると思います。
コードを書く
こんな感じで書くと動きます。
using System; using System.IO; using System.Media; using System.Windows; using Microsoft.Speech.Synthesis; namespace SpeechSynthesizerSample { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { SpeechSynthesizer ss = new SpeechSynthesizer(); SoundPlayer player = new SoundPlayer(); public MainWindow() { InitializeComponent(); ss.SpeakCompleted +=new EventHandler<SpeakCompletedEventArgs>( ss_SpeakCompleted ); } private void button1_Click( object sender, RoutedEventArgs e ) { try { player.Stream = new MemoryStream(); ss.SetOutputToWaveStream( player.Stream ); ss.SpeakAsync( textBox1.Text ); } catch ( Exception ex ) { MessageBox.Show( ex.Message ); } } void ss_SpeakCompleted( object sender, SpeakCompletedEventArgs e ) { try { player.Stream.Position = 0; player.Play(); } catch ( Exception ex ) { MessageBox.Show( ex.Message ); } } } }
解説
Speech SDKには「Microsoft.Speech」のほかに「System.Speech」もあるそうです。
今回使っている「Microsoft.Speech」は音声出力にひと手間かけないといけないようなので、少し長めになっています。
やっていることは、次のようになります
- ボタンをトリガにして、音声をストリームに出力
- 出力が終わったら、そのストリームを使って、プレーヤーからスピーカに出力
フィールド
音声合成のためのSpeechSynthesizerと、スピーカー出力のためのSoundPlayerを宣言します。
SpeechSynthesizer ss = new SpeechSynthesizer(); SoundPlayer player = new SoundPlayer();
コンストラクタ
合成音声を非同期に出力させ、それをスピーカーから出すので、非同期出力の完了イベントを設定します。
public MainWindow() { .... ss.SpeakCompleted +=new EventHandler<SpeakCompletedEventArgs>( ss_SpeakCompleted ); }
ボタンクリック
メモリストリームを作成し、合成音声データをそこに出力させます。
private void button1_Click( object sender, RoutedEventArgs e ) { try { player.Stream = new MemoryStream(); ss.SetOutputToWaveStream( player.Stream ); ss.SpeakAsync( textBox1.Text ); } catch ( Exception ex ) { MessageBox.Show( ex.Message ); } }
スピーカーへの出力
プレーヤー内のストリームに、音声データがあるので、再生位置を0にして再生を開始します。
void ss_SpeakCompleted( object sender, SpeakCompletedEventArgs e ) { try { player.Stream.Position = 0; player.Play(); } catch ( Exception ex ) { MessageBox.Show( ex.Message ); } }
まとめ
簡単に音声合成ができ、漢字も認識してしゃべってくれるのがすごいですね。
前回の音声認識に、この音声合成を入れてみたところ、
自分が話した内容が音声合成されてスピーカーから出力→それをKinectがマイクから入力して、再度音声合成
のループになっていましたw
Speech Platform で合成された音声は、Speech Platformで音声認識できるようですねw
- 20 http://blogahf.blogspot.jp/2012/02/microsoft-speech-platform-110.html
- 12 http://websearch.rakuten.co.jp/?tool_id=1&rid=2000&qt=Microsoft.Speech.Synthesis
- 9 http://t.co/xUxkqbRK
- 5 http://www.google.co.jp/url?sa=t&rct=j&q=音声合成 2012&source=web&cd=2&ved=0CEcQFjAB&url=http://d.hatena.ne.jp/kaorun55/20120102&ei=4zYUT_OhAsrEmAXFq6mBCg&usg=AFQjCNHDzxfEcKAaegyWYQgMSFlvbtujpA
- 5 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=6&ved=0CGYQFjAF&url=http://d.hatena.ne.jp/kaorun55/20120102/1325812194&ei=yEuST7HcHKnjmAWAtuiBAg&usg=AFQjCNFX0nicHEmYALuVLuIuqchDie8hPA&sig2=fA4e3EZY47S5mcHE7VtjkQ
- 5 http://www.google.co.jp/url?sa=t&rct=j&q=Microsoft.Speech.dll&source=web&cd=7&sqi=2&ved=0CGEQFjAG&url=http://d.hatena.ne.jp/kaorun55/20120102/1325812194&ei=SPYjT7egLoahiQftnNXmBA&usg=AFQjCNFX0nicHEmYALuVLuIuqchDie8hPA&sig2=JiWiRJwbezAjI2ulYdqY
- 4 http://www.google.co.jp/url?sa=f&rct=j&url=http://d.hatena.ne.jp/kaorun55/&q=かおるんダイアリー&ei=hkoGT9uQH6GXiQe9tPjMDw&usg=AFQjCNHqDT--GmIEueMid595sO6Y2l_7tw
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=かおるんダイアリー&source=web&cd=1&sqi=2&ved=0CCEQFjAA&url=http://d.hatena.ne.jp/kaorun55/&ei=X18GT_fCOsfjmAXu6cCpAg&usg=AFQjCNEA1q7BAasyGc_c
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=12&ved=0CCoQFjABOAo&url=http://d.hatena.ne.jp/kaorun55/20120102/1325812194&ei=7JYuT-e8CK6amQX_wtXSDw&usg=AFQjCNFX0nicHEmYALuVLuIuqchDie8hPA&sig2=W96UMR5EeiUbLGc69R9SGg
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CD0QFjAD&url=http://d.hatena.ne.jp/kaorun55/20120102/1325812194&ei=chAxT7KfEaSyiQeTktCOBQ&usg=AFQjCNFX0nicHEmYALuVLuIuqchDie8hPA








