しゃべらないコンピュータなんてただの箱だわ。20世紀に戻るつもりはないわね。
今回は、Windows7以下だとひと工夫いるかもしれないわ。(日本語音声のインストール&それをAPIから使うための小細工)
ここでは、System.Speech.Synthesis を使うわ。
これ便利だけど、以下の点は要注意ね。
Windows7の場合、Speechlibを使う方が有名かもしれないわ。でも Speechlib を使っちゃうと、本来ソレが不要な8以上でも使わなくちゃならなくなる のよね。だからおススメしない。
さて、時間でしゃべらせてみましょうか。
#ref(): File not found: "petitclock.png" at page "時報をしゃべる時計"
System.speechを追加してね。
あとWindows7だとレジストリに工作が必要かも。(8.1とかだとそのまま動くはず)
<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>
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(); } } }
例外処理を忘れると、Harukaの入ってないパソコンで止まっちゃうから気をつけて。
Windows7などで時計が出るけど声が出ない場合、音声合成エンジンが日本語対応してないんだと思うわ。