ここまでのコード
- snackvirtual
- 2022年6月30日
- 読了時間: 4分
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.IO;
using CeVIO.Talk.RemoteService;
using System.Diagnostics;
namespace Python_Execute_Test
{
public partial class Form1 : Form
{
// Public変数を定義
static int timer_status = 0;
static int str_count = 0;
static string[] kuchipaku_word = new string[500];
static double[] kuchipaku_start_time = new double[500];
static int kuchipaku_end_count = 0;
static Image imgN_A, imgN_I, imgN_U, imgN_E, imgN_O,
imgA_N, imgI_N, imgU_N, imgE_N, imgO_N,
imgA_I, imgA_U, imgA_E, imgA_O,
imgI_A, imgI_U, imgI_E, imgI_O,
imgU_A, imgU_I, imgU_E, imgU_O,
imgE_A, imgE_I, imgE_U, imgE_O,
imgO_A, imgO_I, imgO_U, imgO_E,
imgN_N,
imgA_A, imgI_I, imgU_U, imgE_E, imgO_O;
static Image img;
static double sentense_count = 0;
static int kuchipaku_count = 0;
public Form1()
{
InitializeComponent();
// 【CeVIO Creative Studio】起動
ServiceControl.StartHost(false);
imgN_A = Image.FromFile("E:/kuchipaku/N_A.gif");
imgN_I = Image.FromFile("E:/kuchipaku/N_I.gif");
imgN_U = Image.FromFile("E:/kuchipaku/N_U.gif");
imgN_E = Image.FromFile("E:/kuchipaku/N_E.gif");
imgN_O = Image.FromFile("E:/kuchipaku/N_O.gif");
imgA_N = Image.FromFile("E:/kuchipaku/A_N.gif");
imgI_N = Image.FromFile("E:/kuchipaku/I_N.gif");
imgU_N = Image.FromFile("E:/kuchipaku/U_N.gif");
imgE_N = Image.FromFile("E:/kuchipaku/E_N.gif");
imgO_N = Image.FromFile("E:/kuchipaku/O_N.gif");
imgA_I = Image.FromFile("E:/kuchipaku/A_I.gif");
imgA_U = Image.FromFile("E:/kuchipaku/A_U.gif");
imgA_E = Image.FromFile("E:/kuchipaku/A_E.gif");
imgA_O = Image.FromFile("E:/kuchipaku/A_O.gif");
imgI_A = Image.FromFile("E:/kuchipaku/I_A.gif");
imgI_U = Image.FromFile("E:/kuchipaku/I_U.gif");
imgI_E = Image.FromFile("E:/kuchipaku/I_E.gif");
imgI_O = Image.FromFile("E:/kuchipaku/I_O.gif");
imgU_A = Image.FromFile("E:/kuchipaku/U_A.gif");
imgU_I = Image.FromFile("E:/kuchipaku/U_I.gif");
imgU_E = Image.FromFile("E:/kuchipaku/U_E.gif");
imgU_O = Image.FromFile("E:/kuchipaku/U_O.gif");
imgE_A = Image.FromFile("E:/kuchipaku/E_A.gif");
imgE_I = Image.FromFile("E:/kuchipaku/E_I.gif");
imgE_U = Image.FromFile("E:/kuchipaku/E_U.gif");
imgE_O = Image.FromFile("E:/kuchipaku/E_O.gif");
imgO_A = Image.FromFile("E:/kuchipaku/O_A.gif");
imgO_I = Image.FromFile("E:/kuchipaku/O_I.gif");
imgO_U = Image.FromFile("E:/kuchipaku/O_U.gif");
imgO_E = Image.FromFile("E:/kuchipaku/O_E.gif");
imgN_N = Image.FromFile("E:/kuchipaku/N_N.gif");
imgA_A = Image.FromFile("E:/kuchipaku/A_A.gif");
imgI_I = Image.FromFile("E:/kuchipaku/I_I.gif");
imgU_U = Image.FromFile("E:/kuchipaku/U_U.gif");
imgE_E = Image.FromFile("E:/kuchipaku/E_E.gif");
imgO_O = Image.FromFile("E:/kuchipaku/O_O.gif");
pictureBox1.Image=imgN_N;
}
private void call_python()
{
string a = textBox1.Text;
// プロセス開始情報クラスを設定する。
// 引数配列よりコマンド配列(空白繋ぎ)に変換し設定する
ProcessStartInfo psInfo = new ProcessStartInfo();
psInfo.FileName = "C:/ProgramData/Anaconda3/python.exe";
psInfo.Arguments = "C:/Users/Hideo/Documents/test1.py" + " " + a;
psInfo.RedirectStandardOutput = true;
psInfo.UseShellExecute = false;
psInfo.CreateNoWindow = true;
// プロセスを開始
Process ps = Process.Start(psInfo);
// 結果を取得する。
string calcResult = ps.StandardOutput.ReadToEnd();
// プロセス終了を待機する
ps.WaitForExit();
ps.Close();
textBox2.AppendText(calcResult);
}
private void motion_for_text()
{
switch (kuchipaku_word[kuchipaku_count] + "_" + kuchipaku_word[kuchipaku_count + 1])
{
case "N_A" :img = imgN_A;break;
case "N_I" :img = imgN_I;break;
case "N_U" :img = imgN_U;break;
case "N_E" :img = imgN_E;break;
case "N_O" :img = imgN_O;break;
case "A_N" :img = imgA_N;break;
case "I_N" :img = imgI_N;break;
case "U_N" :img = imgU_N;break;
case "E_N" :img = imgE_N;break;
case "O_N" :img = imgO_N;break;
case "A_I" :img = imgA_I;break;
case "A_U" :img = imgA_U;break;
case "A_E" :img = imgA_E;break;
case "A_O" :img = imgA_O;break;
case "I_A" :img = imgI_A;break;
case "I_U" :img = imgI_U;break;
case "I_E" :img = imgI_E;break;
case "I_O" :img = imgI_O;break;
case "U_A" :img = imgU_A;break;
case "U_I" :img = imgU_I;break;
case "U_E" :img = imgU_E;break;
case "U_O" :img = imgU_O;break;
case "E_A" :img = imgE_A;break;
case "E_I" :img = imgE_I;break;
case "E_U" :img = imgE_U;break;
case "E_O" :img = imgE_O;break;
case "O_A" :img = imgO_A;break;
case "O_I" :img = imgO_I;break;
case "O_U" :img = imgO_U;break;
case "O_E" :img = imgO_E;break;
case "N_N" :img = imgN_N;break;
case "A_A": img = imgA_A; break;
case "I_I": img = imgI_I; break;
case "U_U": img = imgU_U; break;
case "E_E": img = imgE_E; break;
case "O_O": img = imgO_O; break;
}
pictureBox1.Image = img;
pictureBox1.Refresh();
label2.Text = kuchipaku_word[kuchipaku_count + 1];
label2.Refresh();
}
private void button1_Click(object sender, EventArgs e)
{
call_python();
string input_str = textBox1.Text;
// ---------------- CeVIO処理 ------------------------------
// Talkerインスタンス生成
Talker talker = new Talker();
// キャスト設定
talker.Cast = "さとうささら";
// (例)音量設定
talker.Volume = 100;
// (例)抑揚設定
talker.ToneScale = 100;
// 入力文字から口パク用文字列を抽出とリップシンク用時間データ抽出
PhonemeData[] phonemes = talker.GetPhonemes(input_str);
kuchipaku_word[0] = "N";
kuchipaku_start_time[0] = 0;
int i = 1;
foreach (var phoneme in phonemes)
{
System.Diagnostics.Trace.WriteLine(phoneme.Phoneme + " " + phoneme.StartTime);
string t = (Convert.ToString(phoneme.Phoneme)).ToUpper();
if ((t == "A") || (t == "I") || (t == "U") || (t == "E") || (t == "O"))
{
kuchipaku_word[i] = t;
kuchipaku_start_time[i] = Convert.ToDouble(phoneme.StartTime);
// 同じ母音が続く場合には、180mSおきに同一母音の画像を追加挿入する処理
if (i >= 1)
{
double word_blank = kuchipaku_start_time[i] - kuchipaku_start_time[i - 1];
while (word_blank > 0.18)
{
kuchipaku_word[i + 1] = kuchipaku_word[i];
kuchipaku_start_time[i + 1] = kuchipaku_start_time[i];
kuchipaku_word[i] = kuchipaku_word[i - 1];
kuchipaku_start_time[i] = kuchipaku_start_time[i - 1] + 0.18;
word_blank = word_blank - 0.18;
i = i + 1;
}
}
i = i + 1;
}
}
kuchipaku_word[i] = "N";
kuchipaku_start_time[i] = kuchipaku_start_time[i - 1] + 0.15;
kuchipaku_end_count = i;
System.Diagnostics.Trace.WriteLine("kuchipaku_word[] kuchipaku_start_time[]");
str_count = 0;
timer_status = 1;
sentense_count = 0;
kuchipaku_count = 0;
// (例)再生
SpeakingState state = talker.Speak(input_str);
//state.Wait();
}
private void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
// デザインでTextboxのプロパティのイベントで、キー KeyPress でイベント名を設定する必要あり!!!!!!!
// Enterキー以外なら抜ける
if (e.KeyChar == 13)
// EnterキーでBeep音がしないようにする
{
e.Handled = true;
button1.PerformClick();
textBox1.Clear();
}
}
private void timer1_Tick(object sender, EventArgs e)
{
if (timer_status == 1)
{
sentense_count += 0.03;
if (str_count <= kuchipaku_end_count)
{
if (kuchipaku_start_time[str_count] < sentense_count)
{
System.Diagnostics.Trace.WriteLine(kuchipaku_word[str_count] + " " + kuchipaku_start_time[str_count]);
motion_for_text();
kuchipaku_count = 0;
str_count += 1;
}
}
else
{
pictureBox1.Image = imgN_N;
timer_status = 0;
str_count = 0;
}
kuchipaku_count += 1;
}
}
private void button2_Click(object sender, EventArgs e)
{
// 【CeVIO Creative Studio】終了
//ServiceControl.CloseHost();
imgN_A.Dispose();
imgN_I.Dispose();
imgN_U.Dispose();
imgN_E.Dispose();
imgN_O.Dispose();
imgA_N.Dispose();
imgI_N.Dispose();
imgU_N.Dispose();
imgE_N.Dispose();
imgO_N.Dispose();
imgA_I.Dispose();
imgA_U.Dispose();
imgA_E.Dispose();
imgA_O.Dispose();
imgI_A.Dispose();
imgI_U.Dispose();
imgI_E.Dispose();
imgI_O.Dispose();
imgU_A.Dispose();
imgU_I.Dispose();
imgU_E.Dispose();
imgU_O.Dispose();
imgE_A.Dispose();
imgE_I.Dispose();
imgE_U.Dispose();
imgE_O.Dispose();
imgO_A.Dispose();
imgO_I.Dispose();
imgO_U.Dispose();
imgO_E.Dispose();
imgN_N.Dispose();
Close();
}
}
}
Comments