Processing Ajax...







Are you sure you want to delete this item?


Are you sure you want to delete this item?

PabloMartinez's profile on
This script allows to recognize a speech after it has started. That can be used in a variety of situations, such as adjusting the volume of the sound, adjusting the brightness of the monitor, making any selection from two and more options, and many more.


using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Speech.Recognition;
using System.Speech.Recognition.SrgsGrammar;
using System.Xml;
using System.Xml.Linq;

// Add to references
// | System.Xml.Linq.dll | System.Core.dll | C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0\System.Speech.dll

public static class VoiceBotScript
    public static void Run()
        // Depending on the type you want, set the return type. E.g. <string> or <float> or <int> or other.
        var recogResult = SrHelper<int>();
        // Show\Say what recognize. Need for feedback. Can be removed.
        // or
        BFS.Speech.TextToSpeech(string.Format("I recognized {0}", recogResult));

        // your code goes here

    private static T SrHelper<T>()
        where T : IConvertible
        // Set Path to file
        var pathToFile = @"C:\VBotFiles\Recognizer\";

        // Set file name
        var fileName = "Volume";

        // Set your recognition language. Support languages: en-GB, en-US, de-DE, es-ES, fr-FR, ja-JP, zh-CN, zh-TW.
        // Selected language pack must be installed.
        var culture = new CultureInfo("en-US");
        // Check whether the selected culture is installed for selected speech recognition.
        if (!TestInstalledLanguages.TestLanguages(culture))
            return (T)Convert.ChangeType(null, typeof(T));
        // If the recognition does not recognize the first time set the flag to true
        // and set the number of recognition tries
        var flag = false;
        var maxTries = 3;
        // Set the range
        var rangeStart = 0;
        var rangeCount = 100;

        // Create list with range 0-100. Ex. for set volume in audio app.
        ///var valList = Enumerable.Range(rangeStart, rangeCount).ToList();

        // or create list with range 0-10-20...100
        var valList = Enumerable.Range(rangeStart, rangeCount + 1).Where(x => x % 10 == 0).ToList();

        // or create string list
        ///var valList = new List<string>
        ///     "Add", "the", "recognition", "commands", "you", "want"

        var ext = ".xml";
        var fullFileName = fileName + ext;
        // Open\save srgs file
        var srgsFile = SrgsDocumentCreator.GetSrgsFile(pathToFile, fileName, fullFileName, culture, valList);

        // Get recognition result
        var result = SpeechRecognition.Recognition(srgsFile, culture, flag, maxTries);
        // Return a nullable type not default(T)
        if (string.IsNullOrEmpty(result))
            return (T)Convert.ChangeType(null, typeof(T));

        return (T)Convert.ChangeType(result, typeof(T));

// Speech recognition. Initialize SpeechRecognitionEngine with selected language and return recognition result.
internal class SpeechRecognition
    public static string Recognition(string srgsFile, CultureInfo culture, bool flag, int maxTries)
        RecognitionResult result;
        var recogResult = string.Empty;
        var sre = new SpeechRecognitionEngine(culture);
        var grammar = new Grammar(srgsFile);
        var tries = 0;

            if(flag == false)
                result = sre.Recognize();
                if (result != null)
                    recogResult = result.Text;
                    BFS.Speech.TextToSpeech("I can't recognize what you say.");
            // If the recognition hasn't been successful the first time, try more.
                result = sre.Recognize();
                if (result != null)
                    recogResult = result.Text;
                BFS.Speech.TextToSpeech("I can't recognize what you say. Please try again");
            while (tries < maxTries);

        catch (Exception ex)


        return recogResult;

// Create Srgs file
internal class SrgsDocumentCreator
    public static string GetSrgsFile<T>(string pathToFile, string fileName, string fullFileName, CultureInfo culture, List<T> valList)
        // Check directory exist
        if (!Directory.Exists(pathToFile))

        var srgsFile = Path.Combine(pathToFile, fullFileName);

        // Check file exist and xml:lang value equals selected culture
        if (File.Exists(srgsFile))
            var xDoc = XDocument.Load(srgsFile);
            if (xDoc.Root != null && xDoc.Root.FirstAttribute.Value == culture.Name) 
                return srgsFile;

        // Create SrgsOneOf
        var values = new SrgsOneOf();

        // Add SrgsItem to SrgsOneOf
        foreach (var val in valList)
            values.Add(new SrgsItem(val.ToString()));

        // Create root rule
        var ruleVolume = new SrgsRule(fileName, values) {Scope = SrgsRuleScope.Public};

        // Create SrgsDocument with selected culture
        var srgsDoc = new SrgsDocument {Culture = culture};

        // Add rules to document

        // Set document root
        srgsDoc.Root = ruleVolume;

        // Save created srgsDoc to xml file
        var xmlWriter = XmlWriter.Create(srgsFile);

        return srgsFile;

internal class TestInstalledLanguages
    public static bool TestLanguages(CultureInfo culture)
        // Compare the selected speech recognition language with the installed
        var info = SpeechRecognitionEngine.InstalledRecognizers()
            .FirstOrDefault(x => string.Equals(x.Culture.Name, culture.Name, StringComparison.InvariantCultureIgnoreCase));

        if (info != null)
            return true;
        BFS.Dialog.ShowMessageError(string.Format("The selected language \"{0}\" is not installed", culture.Name));
        return false;
• Attachment: recog.txt [6,642 bytes]
Jul 29, 2017 (modified Jul 29, 2017)  • #1
Keith Lammers (BFS)'s profile on
Thanks for sharing this! We've posted it up to the repository :)
Aug 15, 2017  • #2
Subscribe to this discussion topic using RSS
Was this helpful?  Login to Vote(-)  Login to Vote(-)