.NET

しゃべらないコンピュータなんてただの箱だわ。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などで時計が出るけど声が出ない場合、音声合成エンジンが日本語対応してないんだと思うわ。


トップ   編集 凍結解除 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-02-25 (木) 11:25:53