Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2010, 21:54   #1
Pti44ka
Пользователь
 
Аватар для Pti44ka
 
Регистрация: 02.09.2009
Сообщений: 56
По умолчанию Озвучка. Как поставить паузу?

Мне нужно создать калькулятор и озвучить его. Калькулятор у меня есть и озвучка тоже. Одна проблема только у меня. Я хочу сделать так, чтобы пользователь ввел значение числа, а потом Microsoft Anna его прочитала, а у меня получается так: например, пользователь вводить число 59. Сначала он вводит число 5 , а потом 9. Программа читает у меня следующим образом: сначала произносит 5 по мере ввода, а потом 59. Как сделать,чтобы промежуточный результат не читался?

Я написала в обработчике textBox такой код
Код:
private void textBox1_TextChanged(object sender, EventArgs e)
        {

            m_voice.Voice = m_voice.GetVoices(string.Format("Name={0}", "Microsoft Anna"), "Language=409").Item(0);
            m_voice.Speak(textBox1.Text, SpeechVoiceSpeakFlags.SVSFlagsAsync);
        }
m_voice объект типа SpVoice. Я хотела использовать функцию Sleep.
Thread.Sleep(2000), но у меня тормозит тогда ввод чисел. Помогите, пожалуйста.
Pti44ka вне форума Ответить с цитированием
Старый 08.06.2010, 22:11   #2
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Наверное дело в событии, так как оно и запускает произношение числа каждый раз когда меняется текст в текстбоксе.

Я бы сделал наверное так:

Сделал бы таймер, который бы читал текст через 1,5 сек. (надо тестить, число могло быть другое), если за это время не ввели следующий символ, то Анна читает его =). Если ввели, то таймер выключается не успев сработать и заново включается.

Или:

Просто когда нажимаешь +, -, /, *, = Анна бы читала то что в текстбоксе, ну и плюс, то что нажали (например: 239 умножить...). А иначе как определишь, что пользователь не посидит ещё минуты 3 и не добавит цифру.

Что-то типа того
Код:
private void textBox1_TextChanged(object sender, EventArgs e)
        {
            this.timerSayNumber.Stop();
            this.timerSayNumber.Start();
        }

private void timerSayNumber_Tick(object sender, EventArgs e)
{
            m_voice.Voice = m_voice.GetVoices(string.Format("Name={0}", "Microsoft Anna"), "Language=409").Item(0);
            m_voice.Speak(textBox1.Text, SpeechVoiceSpeakFlags.SVSFlagsAsync);
}
А вообще не знаю, тут надо подумать, делал бы сам, может что нибудь умнее придумал бы

Последний раз редактировалось Casper-SC; 08.06.2010 в 22:34.
Casper-SC вне форума Ответить с цитированием
Старый 08.06.2010, 23:02   #3
Pti44ka
Пользователь
 
Аватар для Pti44ka
 
Регистрация: 02.09.2009
Сообщений: 56
По умолчанию

А как сделать проверку введен ли следующий символ?
Pti44ka вне форума Ответить с цитированием
Старый 08.06.2010, 23:17   #4
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Код:
private void textBox1_TextChanged(object sender, EventArgs e)
в этом событии текст же изменяется, зачем проверять?

Можно сделать переменную одну в которой всегда будет предыдущее число в текстовом представлении (String формате) и если в той переменной длина текста меньше чем в текстбоксе, то значит добавили цифру, если меньше, то значит нажали стереть все цифры, сразу же выключаем таймер
Casper-SC вне форума Ответить с цитированием
Старый 08.06.2010, 23:26   #5
Pti44ka
Пользователь
 
Аватар для Pti44ka
 
Регистрация: 02.09.2009
Сообщений: 56
По умолчанию

Хочу сделать как-то так, но звук не производится=(
private void textBox1_TextChanged(object sender, EventArgs e)
{

tmr.Start();
tmr.Elapsed += new ElapsedEventHandler(textBox1_TextCh anged);
if (tmr.Interval == 2000)
{
tmr.Stop();
m_voice.Voice = m_voice.GetVoices(string.Format("Na me={0}", "Microsoft Anna"), "Language=409").Item(0);

m_voice.Speak(textBox1.Text, SpeechVoiceSpeakFlags.SVSFlagsAsync );

}

}
Pti44ka вне форума Ответить с цитированием
Старый 09.06.2010, 02:22   #6
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

У меня так вполне работает то что я задумал, только конечно WMPLib использовать для целей озвучки это жёстко =), ну я так тестил. Пока я в течении 4-ёх секунд жму какую нибудь кнопку, а фокус на текст боксе, то музыка не прекращает играть:

Код:
    public partial class Form1 : Form
    {
        System.Timers.Timer tmr = new System.Timers.Timer(4000); // интервал в конструкторе ставим 4000 миллисекунд
        WMPLib.WindowsMediaPlayer wmp = new WMPLib.WindowsMediaPlayer();

        public Form1() //конструктор формы
        {
            InitializeComponent();
            tmr.Elapsed += new System.Timers.ElapsedEventHandler(tmr_Elapsed); //подписываем на событие. По истечении 4000 миллисекунд срабатывает событие
            wmp.URL = @"D:\Музыка\драм - ....без слов.....тыц-тыц).mp3"; //путь к музыке
        } 

        //если каждую новую цифру будут успевать печатать
        // быстрей чем за 4000 миллисекунд, то это событие не сработает, а когда перестанут, то сработает. 
        //В твоём случае это голос говорящий какое число.
        void tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 

        {
            wmp.controls.stop(); //остановить воспроизведение
            wmp.controls.play(); //играть снова (с начала)
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            tmr.Stop(); //остановить таймер
            tmr.Start(); //сразу же запустить
        }
    }
И помещай код в теги, напрягает так читать.

Код:
    public partial class Form1 : Form
    {
        System.Timers.Timer tmr = new System.Timers.Timer(4000);

        public Form1()
        {
            InitializeComponent();
            tmr.Elapsed += new System.Timers.ElapsedEventHandler(tmr_Elapsed);
        }

        void tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            m_voice.Voice = m_voice.GetVoices(string.Format("Na me={0}", "Microsoft Anna"), "Language=409").Item(0);
            m_voice.Speak(textBox1.Text, SpeechVoiceSpeakFlags.SVSFlagsAsync );
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            tmr.Stop();
            tmr.Start();
        }
    }

Последний раз редактировалось Casper-SC; 09.06.2010 в 03:19.
Casper-SC вне форума Ответить с цитированием
Старый 10.06.2010, 00:03   #7
Pti44ka
Пользователь
 
Аватар для Pti44ka
 
Регистрация: 02.09.2009
Сообщений: 56
По умолчанию

Большое человеческое спасибо. Ты мне очень помог)
Pti44ka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Таймер на паузу. GrindeX Общие вопросы Delphi 7 27.11.2009 00:03
как сделать паузу (или задержку) в цыкле : с# Natok Помощь студентам 7 30.05.2009 12:55
Озвучка Orodret Общие вопросы C/C++ 2 18.04.2009 14:45
Таймер на паузу yulia Общие вопросы Delphi 16 02.12.2008 18:09
Как атрибут поставить delphin100 Общие вопросы Delphi 9 14.01.2008 23:15