#freeze
[[.NET]]
しゃべらないコンピュータなんてただの箱だわ。20世紀に戻るつもりはないわね。
#contents
今回は、Windows7以下だとひと工夫いるかもしれないわ。(日本語音声のインストール&それをAPIから使うための小細工)
* しゃべらせるには? [#q7639ab6]
ここでは、System.Speech.Synthesis を使うわ。
これ便利だけど、以下の点は要注意ね。
- 参照を追加しなくちゃいけない。
- Windows7の音声合成は日本語に対応してないので、音声(haruka等)をインストールしてから、レジストリにごにょごにょしなくちゃいけない。
Windows7の場合、Speechlibを使う方が有名かもしれないわ。でも ''Speechlib を使っちゃうと、本来ソレが不要な8以上でも使わなくちゃならなくなる'' のよね。だからおススメしない。
さて、時間でしゃべらせてみましょうか。
#ref(petitclock.png)
* 参照の追加 [#me6ec5df]
System.speechを追加してね。
あとWindows7だとレジストリに工作が必要かも。(8.1とかだとそのまま動くはず)
* デザイン [#f6c809ad]
<Window x:Class="talk1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="35" Width="60" WindowStyle="None">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBox Name="tb1" Grid.Column="0" IsReadOnly="True" PreviewMouseLeftButtonDown="Grid_MouseLeftButtonDown" PreviewMouseRightButtonUp="tb1_PreviewMouseRightButtonUp" />
</Grid>
</Window>
* ソース [#raa14002]
using System.Speech.Synthesis;
using System.Windows.Threading;
namespace talk1
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
Boolean poon = false;
public MainWindow()
{
InitializeComponent();
tb1.Text = DateTime.Now.ToString("HH:mm");
DispatcherTimer dt = new DispatcherTimer();
dt.Interval = new TimeSpan(0, 0, 0,0,100);
dt.Tick += dt_Tick;
dt.Start();
}
void dt_Tick(object sender, EventArgs e)
{
DateTime dt = DateTime.Now;
if (dt.Second < 5 && poon == false)
{
tb1.Text = dt.ToString("HH:mm");
Task.Run(() =>
{
string text = "";
int hour = dt.Hour;
int min = dt.Minute;
string ji = hour.ToString() + "時";
string fun = min.ToString() + "分";
if (min == 30)
{
fun = "半ちょうど";
}
else if(min > 54)
{
ji = (hour + 1).ToString() + "時";
fun = (60 - min).ToString() + "分前";
}
text = dt.ToString(ji + fun + "です");
getTalking(text);
});
poon = true;
}
else if (dt.Second > 50 && poon == true)
{
poon = false;
}
}
private void getTalking(string x)
{
using (SpeechSynthesizer syn = new SpeechSynthesizer())
{
syn.SetOutputToDefaultAudioDevice();
try
{
syn.SelectVoice("Microsoft Server Speech Text to Speech Voice (ja-JP, Haruka)");
}
catch (Exception ex)
{
// 何か例外処理をいれてね。
}
syn.Speak(x);
}
}
private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
this.DragMove();
}
private void tb1_PreviewMouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
this.Close();
}
}
}
* トラブルシューティング [#z6a3cc1a]
例外処理を忘れると、Harukaの入ってないパソコンで止まっちゃうから気をつけて。
Windows7などで時計が出るけど声が出ない場合、音声合成エンジンが日本語対応してないんだと思うわ。