[C#] Rozpoznávání řeči jako služba

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod SigmaError 12. 5. 2016 21:36

Zdravím,

chtěl jsem si vytvořit program, který by rozpoznal mluvená slova a následně po nich konal viz sample.

Kód: Vybrat vše
            sSynth = new SpeechSynthesizer();
            pBuilder = new PromptBuilder();
            sRecognize = new SpeechRecognitionEngine();

            Choices sList = new Choices();
            sList.Add(new string[] { "systemrestart", "systemshutdown", "lockdown"});
            Grammar gr = new Grammar(new GrammarBuilder(sList));
            try
            {
                sRecognize.RequestRecognizerUpdate();
                sRecognize.LoadGrammar(gr);
                sRecognize.SpeechRecognized += sRecognize_SpeechRecognized;
                sRecognize.SetInputToDefaultAudioDevice();
                sRecognize.RecognizeAsync(RecognizeMode.Multiple);
                sRecognize.Recognize();
            }
            catch (Exception ex) {

                using (StreamWriter sw = new StreamWriter("C:\\error.txt"))
                {
                    sw.WriteLine(ex.Message);
                    sw.Close();
                }

            }


K tomu nějaká ta metoda na reakci rozpoznávání.

Kód: Vybrat vše
        private void sRecognize_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            switch (e.Result.Text)
            {
                case "systemrestart":
                    Process.Start("shutdown", "-r");
                    break;

                case "systemshutdown": 
                    Process.Start("shutdown", "-s -t 0");
                    break;

                case "lockdown":
                    Process.Start("rundll32.exe", "user32.dll, LockWorkStation");
                    break;
            }
        }


To funguje krásně, jenže pokud to chci spustit jako službu, tak najednou na mikrofón program nereaguje a vykoná nic.

Službu jsem úspěšně přes InstallUtil nainstaloval do systému a "funguje" (čti je spuštěná a v eventlogu nejsou žádné chyby). Napadá někoho jak by se dal tento problém vyřešit?

Díky za hinty.
SigmaError
Junior

Odeslat příspěvekod Nargon 13. 5. 2016 07:22

Napadá mě problém zde: sRecognize.SetInputToDefaultAudioDevice();
To by mělo snímat zvuk z "výchozího zařízení". Což se nejspíše liší pro každého uživatele a uživatel pod kterým je ta služba spuštěná nemá nastavený mikrofon jako výchozí zařízení pro záznam zvuku.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod SigmaError 13. 5. 2016 13:10

Ok, tomu rozumím, tzn. že buď spustit službu jako aktuální uživatel, což by teoreticky šlo, ale zase služba by tak jako tak nefungovala korektně např. při Windows loginu, což byl jeden z mých záměrů.
Další možností tedy je nasměrování na stejný vstup i pro uživatele LocalSystem. Je vůbec tato možnost reálná? Jak by se dalo řešit. Pokud jsem hledal správně, tak jsem nic takového nenašel viz. Stackoverflow, kde někdo jiný řešil stejný problém, ale odpověď neměla efekt.
SigmaError
Junior

Odeslat příspěvekod piErcE 13. 5. 2016 14:56

Založ v systému nového uživatele pro tuto službu .. a službu pak v ovlaádacím panelu nastav, aby běžěla pod tímto uživatelem.

služba pak samozrejmě poběží v kontextu daného uživatele, i když přihlášen bude někdo jiný (nebo nebud epřihlášen nikdo).
Garmin DriveLuxe 50 - iPhone SE - Octavia III 1.4 110 kW DSG
piErcE
Junior

Odeslat příspěvekod SigmaError 14. 5. 2016 19:24

No to není tak jednoduché, protože (opravte mě pokud se mýlím) jediný uživatel který běží pořád je ten systémový účet (NT AUTHORITY\SYSTEM), právě pod ním bych rád spustil tuto službu aby měla přístup k mikrofonu už při windows loginu.

Z dostupných zdrojů jsem se bohužel dočetl, že MS nemá žádné veřejné API ke správě výchozího zvukového zařízení, aby vše bylo v režii uživatele :/
SigmaError
Junior

Odeslat příspěvekod piErcE 14. 5. 2016 19:46

Kdyz te servise v ovladacich paneluch nastavis uzivatele, pod kterym ma bezet, pobezi pod danym uzivatelem i kdyb byl prihlasen uplne nekdo jiny.

Vyzkousej to, pak mudruj.
piErcE
Junior

Odeslat příspěvekod SigmaError 14. 5. 2016 20:12

Ok sorry, už jsem to pochopil. Ačkoliv teď běží v kontextu aktuálního uživatele, hlas z mikrofonu to stejně nedetekuje. Nemá někdo nějaký další nápad?
SigmaError
Junior

Odeslat příspěvekod rudidlo 25. 5. 2016 12:09

A C:\\error.txt je také prázdný?
Jsou dva druhy uživatelů počítačů. Ti první o svá data už přišli.
rudidlo
Junior
Uživatelský avatar

Odeslat příspěvekod mracka michal 26. 5. 2016 11:12

SigmaError píše:Ok sorry, už jsem to pochopil. Ačkoliv teď běží v kontextu aktuálního uživatele, hlas z mikrofonu to stejně nedetekuje. Nemá někdo nějaký další nápad?


Skus sa pod tym pouzivatelom raz prihlasit (aby sa vytvoril profil). Ked uz budes prihlaseny, rovno skontroluj nastavenie audio zariadenia.

Ak to ma bezat pod systemovym uctom - mas v nastaveniach sluzby povolenu interakciu s desktopom?
„You don't need a reason to help people.”
~Zidane Tribal, Final Fantasy IX
--
Pouzivam suborovy manazer Nomad.Net.
mracka michal
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků