Advertisement
Guest User

Untitled

a guest
Feb 1st, 2014
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. open Microsoft.Speech.Synthesis
  2. open Microsoft.Speech.Recognition
  3. open System
  4.  
  5. let polishSynth =
  6.     let synth = new SpeechSynthesizer()
  7.     let polishVoiceName =
  8.         synth.GetInstalledVoices()
  9.         |> Seq.find (fun v -> v.VoiceInfo.Culture.TwoLetterISOLanguageName = "pl")
  10.         |> (fun v -> v.VoiceInfo.Name)
  11.     synth.SelectVoice polishVoiceName
  12.     synth.SetOutputToDefaultAudioDevice()
  13.     synth
  14.  
  15. let opt (gb: GrammarBuilder) =
  16.     new GrammarBuilder(gb, 0, 1)
  17.  
  18. let sem (str: string) (obj: Object) = new GrammarBuilder(new SemanticResultValue(str, obj))
  19.  
  20. let pick (l: GrammarBuilder list) =
  21.     let c = new Choices()
  22.     for i in l do
  23.         c.Add(i)
  24.     new GrammarBuilder(c)
  25.  
  26. let seqg (l: GrammarBuilder list) =
  27.     let gb = new GrammarBuilder()
  28.     for g in l do gb.Append g
  29.     gb
  30. let seqk (l: SemanticResultKey list) =
  31.     let gb = new GrammarBuilder()
  32.     for g in l do gb.Append g
  33.     gb
  34.    
  35. let key (str: String) (gb: GrammarBuilder) = new SemanticResultKey(str, gb)
  36.  
  37. let tens = opt(new GrammarBuilder(key "tens"<|pick [
  38.     sem "dwadzieścia" 20;
  39.     sem "trzydzieści" 30;
  40.     sem "czterdzieści" 40;
  41.     sem "pięćdziesiąt" 50;
  42.     sem "sześćdziesiąt" 60;
  43.     sem "siedemdziesiąt" 70 ;
  44.     sem "osiemdziesiąt" 80;
  45.     sem "dziewięćdziesiąt" 90 ]))
  46.  
  47. let units = opt(new GrammarBuilder(key "units" <| pick[
  48.     sem "jeden" 1;
  49.     sem "dwa" 2;
  50.     sem "trzy" 3;
  51.     sem "cztery" 4;
  52.     sem "pięć" 5;
  53.     sem "sześć" 6;
  54.     sem "siedem" 7;
  55.     sem "osiem" 8;
  56.     sem "dziewięć" 9
  57.     ]))
  58. let teens = new GrammarBuilder(key "teens" <| pick[
  59.     sem "dziesięć" 10;
  60.     sem "jedenaście" 11;
  61.     sem "dwanaście" 12;
  62.     sem "tuzin" 12;
  63.     sem "trzynaście" 13;
  64.     sem "czternaście" 14;
  65.     sem "piętnaście" 15;
  66.     sem "szesnaście" 16;
  67.     sem "siedemnaście" 17;
  68.     sem "osiemnaście" 18;
  69.     sem "dziewiętnaście" 19
  70.     ])
  71.  
  72. let polishRecognitionEngine =
  73.     let r =  
  74.         SpeechRecognitionEngine.InstalledRecognizers()
  75.         |> Seq.find (fun r -> r.Culture.TwoLetterISOLanguageName = "pl")
  76.     let recog = new SpeechRecognitionEngine(r)
  77.     let grammar = new Grammar(pick[teens;seqg[tens; units]])
  78.     recog.LoadGrammar(grammar)  
  79.     recog.SetInputToDefaultAudioDevice()
  80.     recog
  81.  
  82.  
  83. let getFromSemantics<'a> (key: String) (defaultValue: 'a) (result: RecognitionResult) =
  84.     if result = null || result.Semantics = null
  85.     then defaultValue
  86.     else if result.Semantics.ContainsKey(key)
  87.         then result.Semantics.[key].Value :?> 'a
  88.        else defaultValue
  89.  
  90. let getNumber(result: RecognitionResult) =
  91.    let tensO = getFromSemantics "tens" 0 result
  92.    let unitsO = getFromSemantics "units" 0 result
  93.    let teensO = getFromSemantics "teens" 0 result
  94.    tensO + unitsO + teensO
  95.  
  96. let pickForm number strings =
  97.    if List.length strings = 1
  98.    then strings.Head
  99.    else
  100.        match number with
  101.        | 1 -> strings.Head
  102.        | x when x%10>=2 && x%10<=4 && x%100/10<>1 -> strings.Tail.Head
  103.        | _ -> strings.Tail.Tail.Head
  104.  
  105. let insertNumber (prefix: string list) (number: int) (suffix: string list) =
  106.    let pb = new PromptBuilder()
  107.    pb.AppendText(pickForm number prefix)
  108.    pb.AppendTextWithHint(number.ToString(), SayAs.NumberCardinal)
  109.    pb.AppendText(pickForm number suffix)
  110.    new Prompt(pb)
  111.  
  112. [<EntryPoint>]
  113. let main argv =
  114.    polishSynth.Speak "Wybrałam liczbę od jeden do dziewięćdziesiąt dziewięć. Zgadnij jaka to liczba."
  115.    let random = new System.Random()
  116.    let pick = random.Next(99) + 1
  117.    let mutable loop = true
  118.    let mutable tryCount = 0
  119.    while loop do
  120.        let guess = polishRecognitionEngine.Recognize() |> getNumber
  121.        tryCount <- tryCount + 1
  122.        if guess = pick
  123.        then
  124.            loop <- false
  125.        else
  126.            if pick > guess
  127.            then polishSynth.Speak(insertNumber ["Moja liczba jest większa niż "] guess ["."])
  128.            else polishSynth.Speak(insertNumber ["Moja liczba jest mniejsza niż "] guess ["."])
  129.    polishSynth.Speak(insertNumber ["Brawo! Moją liczbą było właśnie "] pick ["!"])
  130.    polishSynth.Speak(insertNumber ["Odgadnięcie zajęło ci tylko "] tryCount [" próbę!"; " próby!"; " prób!"])
  131.    polishSynth.Speak "Dziękuję za grę."
  132.    0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement