8 / 8 / 0
Регистрация: 19.04.2011
Сообщений: 102
1
.NET 4.x

Microsoft.Speech.Recognition в службе windows

24.08.2020, 23:14. Показов 517. Ответов 1

Студворк — интернет-сервис помощи студентам
Добрый вечер.
Создал простейшую службу windows с использованием в ней Microsoft.Speech.Recognition. Но после ее установки и запуска, на голос она не реагирует. Что я не учел? P.S. В Debug работает отлично.

Вот часть кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using Microsoft.Speech.Recognition;
using Microsoft.Speech.Synthesis;
using NLog;
using PCVoiceControl.model;
using System;
using System.Diagnostics;
using System.Threading;
using System.Linq;
 
namespace PCVoiceControl
{
    public class SpeechRecognition
    {
        static SpeechSynthesizer ss = new SpeechSynthesizer();
        static SpeechRecognitionEngine sre;
        static bool done = false;
        static bool speechOn = true;
        static Timer timer;
        static TimerCallback tm = new TimerCallback((object obj) => {
            speechOn = false;
            timer.Dispose();
        });
        public delegate void onStopEvent();
        public event onStopEvent StopEvent;
        private static Logger logger = LogManager.GetCurrentClassLogger();
 
        ControlCommand[] controlCommands = new ControlCommand[0];
 
        public async void Start()
        {
            try
            {
                logger.Info("Start_1");
                controlCommands = ControlCommands.GetCommands();
 
                ss.SetOutputToDefaultAudioDevice();
 
                System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("ru-RU");
                sre = new SpeechRecognitionEngine(ci);
                sre.SetInputToDefaultAudioDevice();
                sre.SpeechRecognized += sre_SpeechRecognized;
 
                logger.Info("Start_2");
                Choices ch_StartStopCommands = new Choices();
                ch_StartStopCommands.Add("компьютер");
                ch_StartStopCommands.Add("остановить службу");
                GrammarBuilder gb_StartStop = new GrammarBuilder();
                gb_StartStop.Append(ch_StartStopCommands);
                Grammar g_StartStop = new Grammar(gb_StartStop);
 
                sre.LoadGrammarAsync(g_StartStop);
                foreach (var command in controlCommands)
                {
                    foreach (var commandName in command.Commands)
                    {
                        var gb = new GrammarBuilder();
                        gb.Append(new SemanticResultKey(command.GroupName, new string[] { commandName }));
                        var g = new Grammar(gb);
                        sre.LoadGrammarAsync(g);
                    }
                }
 
                logger.Info("Start_3");
                sre.RecognizeAsync(RecognizeMode.Multiple);
 
                logger.Info("Start_4");
                while (done == false) {; }
                logger.Info("Start_5");
            }
            catch (Exception ex)
            {
                logger.Info("Start_6");
                logger.Error(ex.Message);
            }
        }
 
        public void Stop()
        {
            try
            {
                logger.Info("Stop_1");
                sre.RecognizeAsyncCancel();
                done = true;
                ss.Speak("прощай");
                StopEvent?.Invoke();
                logger.Info("Stop_2");
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
                logger.Info("Stop_3");
            }
        }
 
 
        void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            SemanticValue semantics = e.Result.Semantics;
            string txt = e.Result.Text;
            logger.Info(txt);
            float confidence = e.Result.Confidence;
 
            if (confidence < 0.40) return;
            if (txt.IndexOf("компьютер") >= 0)
            {
                ss.Speak("Говорите");
                speechOn = true;
                timer = new Timer(tm, null, 10000, 10000);
            }
            if (speechOn == false) return;
            if (txt.IndexOf("остановить службу") >= 0)
            {
                Stop();
            }
 
            var command = controlCommands.FirstOrDefault(f => f.GroupName == semantics.FirstOrDefault().Key);
 
            if(command != null)
            {
                ss.Speak("слушаюсь и повинуюсь");
                Process iStartProcess = new Process(); // новый процесс
                iStartProcess.StartInfo.FileName = command.ProcessPath;
                if(!String.IsNullOrEmpty(command.ProcessArguments)) iStartProcess.StartInfo.Arguments = command.ProcessArguments;
                if(command.IsHidden) iStartProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                iStartProcess.Start();
                timer.Dispose();
                timer = new Timer(tm, null, 10000, 10000);
            }
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using NLog;
using System;
using System.ServiceProcess;
using System.Threading.Tasks;
 
namespace PCVoiceControl
{
    public partial class MainService : ServiceBase
    {
        SpeechRecognition sr = new SpeechRecognition();
        private static Logger logger = LogManager.GetCurrentClassLogger();
 
        public MainService()
        {
            InitializeComponent();
            CanStop = true; // службу можно остановить
            CanPauseAndContinue = true; // службу можно приостановить и затем продолжить
            AutoLog = true; // служба может вести запись в лог
            sr.StopEvent += StopEventCallBack;
        }
 
        protected override void OnStart(string[] args)
        {
            logger.Info("OnStart_1");
            Task.Factory.StartNew(sr.Start);
            logger.Info("OnStart_2");
        }
 
        internal  void TestStartupAndStop(string[] args)
        {
            OnStart(args);
            Console.ReadLine();
            OnStop();
        }
 
 
        protected override void OnStop()
        {
            Task.Factory.StartNew(sr.Stop);
        }
 
        private void StopEventCallBack()
        {
            Stop();
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
namespace PCVoiceControl.model
{
    public class ControlCommand
    {
        /// <summary>
        /// Сок команд
        /// </summary>
        public string[] Commands { get; set; }
 
        /// <summary>
        /// Путь к выполняемой команде
        /// </summary>
        public string ProcessPath { get; set; }
 
        /// <summary>
        /// Параметры передаваемые процессу
        /// </summary>
        public string ProcessArguments { get; set; }
 
        /// <summary>
        /// указываем, если хотим запустить программу в скрытом виде
        /// </summary>
        public bool IsHidden { get; set; } = false;
 
        /// <summary>
        /// Название по которому группируются команды
        /// </summary>
        public string GroupName { get; set; }
    }
 
    public static class ControlCommands
    {
        public static ControlCommand[] GetCommands()
        {
            return new ControlCommand[]
            {
                new ControlCommand()
                {
                    Commands = new string[]
                    {
                        "включи музыку",
                        "запусти плеер"
                    },
                    ProcessPath = @"d:\dryn-da\Documents\batFiles\startwmplayer.bat",
                    GroupName = "wmplayer"
                },
                new ControlCommand()
                {
                    Commands = new string[]
                    {
                        "выключись"
                    },
                    ProcessPath = @"d:\dryn-da\Documents\batFiles\ShutDown.bat",
                    GroupName = "ShutDown"
                }
            };
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.08.2020, 23:14
Ответы с готовыми решениями:

Microsoft Speech Recognition Приложение
У меня есть приложение, которое распознаёт речь. Как его запустить на другом компьютере, где не...

Microsoft Speech Recognition Platform - как одновременно распознавать и русский, и английский
Добрый день. Использую Microsoft Speech Recognition Platform для распознавания голосового ввода....

Что лучше использовать для распознования русского языка System.Speech или Microsoft.Speech?
Здравствуйте, у меня проблемы со speech recognition c# в Windows 7, что мне лучше использовать...

Ошибка при создании Microsoft.Speech
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

1
8 / 8 / 0
Регистрация: 19.04.2011
Сообщений: 102
26.08.2020, 22:07  [ТС] 2
Понял в чем причина добавив обработчик события RecognizeCompleted и поймав в нем "ERROR System.InvalidOperationException: Audio output and input are not supported for non-active console sessions". Не поддерживается в службе работа с аудио.
Тему можно закрывать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2020, 22:07
Помогаю со студенческими работами здесь

Как сделать распознавание речи на Microsoft.Speech?
Привет всем, надо сделать распознавание речи на РУССКОМ ЯЗЫКЕ. Использую библиотеку...

Ошибка при работе с библиотекой Microsoft.Speech.dll
Всем доброго времени суток. Хочу поработать с распознаванием речи, но к сожалению возникли...

Воспроизведение звука в службе Windows
Здравствуйте, передо мной стоит задача воспроизведения звуковой сигнализации по условию....

Параллельное программирование в службе Windows
Здравствуйте. Делаю службу-сервер, которая общается с клиентами по TCP. Получает команду,...

Определение нажатой клавиши в службе Windows
Всем привет. Пишу службу для винды. Мне нужно определить нажата ли клавиша и заносить её текущее...

Передача данных от приложения службе Windows
Уважаемые знатоки, подскажите пожалуйста, как мне правильнее или вообще хоть как-нибудь передать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru