Guest User

Untitled

a guest
Oct 21st, 2015
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 4.51 KB | None | 0 0
  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. type gender = M | F
  83.  
  84. let getFromSemantics<'a> (key: String) (defaultValue: 'a) (result: RecognitionResult) =
  85.     if result = null || result.Semantics = null
  86.     then defaultValue
  87.     else if result.Semantics.ContainsKey(key)
  88.         then result.Semantics.[key].Value :?> 'a
  89.        else defaultValue
  90.  
  91. let getNumber(result: RecognitionResult) =
  92.    let tensO = getFromSemantics "tens" 0 result
  93.    let unitsO = getFromSemantics "units" 0 result
  94.    let teensO = getFromSemantics "teens" 0 result
  95.    tensO + unitsO + teensO
  96.  
  97. let pickForm number strings =
  98.    if List.length strings = 1
  99.    then strings.Head
  100.    else
  101.        match number with
  102.        | 1 -> strings.Head
  103.        | x when x%10>=2 && x%10<=4 && x%100/10<>1 -> strings.Tail.Head
  104.        | _ -> strings.Tail.Tail.Head
  105.  
  106. let insertNumber (prefix: string list) (number: int) (gender: gender) (suffix: string list) =
  107.    let pb = new PromptBuilder()
  108.    pb.AppendText(pickForm number prefix)
  109.    match number, gender with
  110.    | 1, M -> pb.AppendText(" jeden ")
  111.    | 1, F -> pb.AppendText(" jedną ")
  112.    | 2, M -> pb.AppendText(" dwa ")
  113.    | 2, F -> pb.AppendText(" dwie ")
  114.    | _, _ -> pb.AppendTextWithHint(number.ToString(), SayAs.NumberCardinal)
  115.    pb.AppendText(pickForm number suffix)
  116.    new Prompt(pb)
  117.  
  118. [<EntryPoint>]
  119. let main argv =
  120.    polishSynth.Speak "Wybrałam liczbę od jeden do dziewięćdziesiąt dziewięć. Zgadnij jaka to liczba."
  121.    let random = new System.Random()
  122.    let pick = random.Next(99) + 1
  123.    let mutable loop = true
  124.    let mutable tryCount = 0
  125.    while loop do
  126.        let guess = polishRecognitionEngine.Recognize() |> getNumber
  127.        tryCount <- tryCount + 1
  128.        if guess = pick
  129.        then
  130.            loop <- false
  131.        else
  132.            if pick > guess
  133.            then polishSynth.Speak(insertNumber ["Moja liczba jest większa niż "] guess M ["."])
  134.            else polishSynth.Speak(insertNumber ["Moja liczba jest mniejsza niż "] guess M ["."])
  135.    polishSynth.Speak(insertNumber ["Brawo! Moją liczbą było właśnie "] pick M ["!"])
  136.    polishSynth.Speak(insertNumber ["Odgadnięcie zajęło ci tylko "] tryCount F [" próbę!"; " próby!"; " prób!"])
  137.    polishSynth.Speak "Dziękuję za grę."
  138.    0
Advertisement
Add Comment
Please, Sign In to add comment