#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などで時計が出るけど声が出ない場合、音声合成エンジンが日本語対応してないんだと思うわ。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS