Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- open Microsoft.Speech.Synthesis
- open Microsoft.Speech.Recognition
- open System
- let polishSynth =
- let synth = new SpeechSynthesizer()
- let polishVoiceName =
- synth.GetInstalledVoices()
- |> Seq.find (fun v -> v.VoiceInfo.Culture.TwoLetterISOLanguageName = "pl")
- |> (fun v -> v.VoiceInfo.Name)
- synth.SelectVoice polishVoiceName
- synth.SetOutputToDefaultAudioDevice()
- synth
- let opt (gb: GrammarBuilder) =
- new GrammarBuilder(gb, 0, 1)
- let sem (str: string) (obj: Object) = new GrammarBuilder(new SemanticResultValue(str, obj))
- let pick (l: GrammarBuilder list) =
- let c = new Choices()
- for i in l do
- c.Add(i)
- new GrammarBuilder(c)
- let seqg (l: GrammarBuilder list) =
- let gb = new GrammarBuilder()
- for g in l do gb.Append g
- gb
- let seqk (l: SemanticResultKey list) =
- let gb = new GrammarBuilder()
- for g in l do gb.Append g
- gb
- let key (str: String) (gb: GrammarBuilder) = new SemanticResultKey(str, gb)
- let tens = opt(new GrammarBuilder(key "tens"<|pick [
- sem "dziesięć" 10;
- sem "dwadzieścia" 20;
- sem "trzydzieści" 30;
- sem "czterdzieści" 40;
- sem "pięćdziesiąt" 50;
- sem "sześćdziesiąt" 60;
- sem "siedemdziesiąt" 70 ;
- sem "osiemdziesiąt" 80;
- sem "dziewięćdziesiąt" 90 ]))
- let units = opt(new GrammarBuilder(key "units" <| pick[
- sem "jeden" 1;
- sem "dwa" 2;
- sem "trzy" 3;
- sem "cztery" 4;
- sem "pięć" 5;
- sem "sześć" 6;
- sem "siedem" 7;
- sem "osiem" 8;
- sem "dziewięć" 9
- ]))
- let teens = new GrammarBuilder(key "teens" <| pick[
- sem "dziesięć" 10;
- sem "jedenaście" 11;
- sem "dwanaście" 12;
- sem "trzynaście" 13;
- sem "czternaście" 14;
- sem "piętnaście" 15;
- sem "szesnaście" 16;
- sem "siedemnaście" 17;
- sem "osiemnaście" 18;
- sem "dziewiętnaście" 19
- ])
- let polishRecognitionEngine =
- let r =
- SpeechRecognitionEngine.InstalledRecognizers()
- |> Seq.find (fun r -> r.Culture.TwoLetterISOLanguageName = "pl")
- let recog = new SpeechRecognitionEngine(r)
- let grammar = new Grammar(pick[teens;seqg[tens; units]])
- recog.LoadGrammar(grammar)
- recog.SetInputToDefaultAudioDevice()
- recog
- let getFromSemantics<'a> (key: String) (defaultValue: 'a) (result: RecognitionResult) =
- if result.Semantics = null
- then defaultValue
- else if result.Semantics.ContainsKey(key)
- then result.Semantics.[key].Value :?> 'a
- else defaultValue
- let getNumber(result: RecognitionResult) =
- let tensO = getFromSemantics "tens" 0 result
- let unitsO = getFromSemantics "units" 0 result
- let teensO = getFromSemantics "teens" 0 result
- tensO + unitsO + teensO
- let pickForm number strings =
- if List.length strings = 1
- then strings.Head
- else
- match number with
- | 1 -> strings.Head
- | x when x%10>=2 && x%10<=4 && x%100/10<>10 -> strings.Tail.Head
- | _ -> strings.Tail.Tail.Head
- let insertNumber (prefix: string list) (number: int) (suffix: string list) =
- let pb = new PromptBuilder()
- pb.AppendText(pickForm number prefix)
- pb.AppendTextWithHint(number.ToString(), SayAs.NumberCardinal)
- pb.AppendText(pickForm number suffix)
- new Prompt(pb)
- [<EntryPoint>]
- let main argv =
- polishSynth.Speak "Wybrałam liczbę od jeden do dziewięćdziesiąt dziewięć. Zgadnij jaka to liczba."
- let random = new System.Random()
- let pick = random.Next(99) + 1
- let mutable loop = true
- let mutable tryCount = 0
- while loop do
- let guess = polishRecognitionEngine.Recognize() |> getNumber
- tryCount <- tryCount + 1
- if guess = pick
- then
- loop <- false
- else
- if pick > guess
- then polishSynth.Speak(insertNumber ["Moja liczba jest większa niż "] guess ["."])
- else polishSynth.Speak(insertNumber ["Moja liczba jest mniejsza niż "] guess ["."])
- polishSynth.Speak(insertNumber ["Brawo! Moją liczbą było właśnie "] pick ["!"])
- polishSynth.Speak(insertNumber ["Odgadnięcie zajęło ci tylko "] tryCount [" próbę!"; " próby!"; " prób!"])
- polishSynth.Speak "Dziękuję za grę"
- 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement