努力したWiki

推敲の足りないメモ書き多数

ユーザ用ツール

サイト用ツール


サイドバー

メニュー

インデックス

documents:windows:windows-032

shimaトーク(SAPIによる音声再生アプリ)

2018/10/21

shimatalk.zip shimaトーク。WindowsのSAPI5で音声再生するよ!

2018-10-21 指摘対応

  • 架空のシマメンバーを指定すると落ちる!と指摘があったので修正したよ!
  • ヘルプとメンバー一覧を出す時だけはシマトークしない修正したよ!

音声出力は既定のデバイスから。

E:\shimaland>shimatalk -h
usage: shimatalk [-l シマメンバー一覧] [-t シマ番号] [-v 煩さ] [-s ゆっくり加減] [-f シマ美声保存ファイル名] 読みあげるテキスト
       -v は -10 ~  10 の間で指定無しは0
       -s は   0 ~ 100 の間で指定無しは100
       -t は   0 ~ で指定無しは0

E:\shimaland>shimatalk -l
0番目のシマ : Microsoft Haruka Desktop
1番目のシマ : CeVIO-さとうささら
2番目のシマ : CeVIO-すずきつづみ
3番目のシマ : CeVIO-タカハシ
4番目のシマ : Microsoft David Desktop
5番目のシマ : Microsoft Zira Desktop
6番目のシマ : CeVIO-ONE

E:\shimaland>shimatalk みんなシマになる!

E:\shimaland>shimatalk -t 4 min-na shima ni naru!

E:\shimaland>

バグってる? 大丈夫、shimaトークだから問題ない。

ソース

やっつけで書いたよ!
フリーウエアにするよ! 重要なのは前半のコードだけだよ!

shimatalk.cs
using System;
using System.Text;
using System.Threading;
using SpeechLib;
 
namespace shimatalk
{
    class Program
    {
        static SpVoice sapi = null;
        static ISpeechObjectTokens speakerList = null;
        static int speed = 0;
        static int volume = 100;
        static int shimaidx = 0;
        static string file = "";
        static string text = @"どうせみんなシマになる!";
 
        static void Main(string[] args)
        {
 
            try
            {
                sapi = new SpVoice();
                speakerList = sapi.GetVoices("", "");
 
                if (!option(args)) return;
 
                if (file == "")
                {
                    Thread t = new Thread(() =>
                    {
                        sapi.Voice = speakerList.Item(shimaidx);
                        sapi.Rate = speed;
                        sapi.Volume = volume;
                        sapi.Speak(text);
                    });
                    t.SetApartmentState(ApartmentState.STA);
                    t.Start();
                    t.Join();
                }
                else
                {
                    SpFileStream ss = new SpFileStream();
                    ss.Open(file, SpeechStreamFileMode.SSFMCreateForWrite);
                    sapi.AudioOutputStream = ss;
 
                    Thread t = new Thread(() => {
                        sapi.Voice = speakerList.Item(shimaidx);
                        sapi.Rate = speed;
                        sapi.Volume = volume;
                        sapi.Speak(text);
                    });
                    t.SetApartmentState(ApartmentState.STA);
                    t.Start();
                    t.Join();
                    ss.Close();
                }
            }
            catch (Exception shima1)
            {
                Console.WriteLine("ef5:{0},{1},{2}", shima1.Message, shima1.InnerException == null ? "" : shima1.InnerException.Message, shima1.StackTrace);
            }
        }
 
        static bool option(string[] args)
        {
            StringBuilder sb = new StringBuilder();
 
            for(int idx =0; idx <args.Length; idx++)
            {
                switch(args[idx])
                {
                    case "-h":
                        Console.WriteLine("usage: shimatalk [-l シマちゃんズ] [-t シマ番号] [-v 煩さ] [-s ゆっくり加減] [-f シマ美声保存ファイル名] 読みあげるテキスト");
                        Console.WriteLine("       -v は -10 ~  10 の間で指定無しは0");
                        Console.WriteLine("       -s は   0 ~ 100 の間で指定無しは100");
                        Console.WriteLine("       -t は   0 ~ で指定無しは0");
                        return false;
 
                    case "-l":
                        for(int i=0; i<speakerList.Count; i++)
                        {
                            Console.WriteLine("{0}番目のシマ : {1}", i, speakerList.Item(i).GetAttribute("name"));
                        }
                        return false;
 
                    case "-t":
                        if ((idx + 1) < args.Length)
                        {
                            shimaidx = int.Parse(args[idx + 1]);
                            if ((shimaidx < 0) || (shimaidx >= speakerList.Count)) shimaidx = 0;
                            idx++;
                        };
                        break;
 
                    case "-v":
                        if ((idx + 1) < args.Length)
                        {
                            volume = int.Parse(args[idx + 1]);
                            if (volume < 0) volume = 0;
                            if (volume > 100) volume = 100;
                            idx++;
                        };
                        break;
 
                    case "-s":
                        if ((idx + 1) < args.Length)
                        {
                            speed = int.Parse(args[idx + 1]);
                            if (speed < -10) speed = -10;
                            if (speed > 10) speed = 10;
                            idx++;
                        }
                        break;
 
                    case "-f":
                        if ((idx + 1) < args.Length)
                        {
                            file = args[idx + 1];
                            idx++;
                        }
                        break;
 
                    default:
                        sb.Append(args[idx]);
                        break;
                }
            }
 
            if (sb.Length != 0) text = sb.ToString();
 
            return true;
        }
    }
}

コメント

コメントを入力. Wiki文法が有効です:
画像の文字が読めなければ、文字を読んだ.wavファイルをダウンロードして下さい。
 
documents/windows/windows-032.txt · 最終更新: 2018/10/21 14:13 by k896951

ページ用ツール