39 lines
982 B
Scheme
39 lines
982 B
Scheme
|
#!/usr/bin/env ikarus --r6rs-script
|
||
|
|
||
|
(import (ikarus) (objc) (Cocoa helpers))
|
||
|
|
||
|
(define-class NSSpeechSynthesizer)
|
||
|
|
||
|
(define (get-voice-name)
|
||
|
(if (= 2 (length (command-line)))
|
||
|
(cadr (command-line))
|
||
|
#f))
|
||
|
|
||
|
(define (make-speaker voice)
|
||
|
(define base-string "com.apple.speech.synthesis.voice.")
|
||
|
(define (synthesizer x)
|
||
|
[$ [$ NSSpeechSynthesizer alloc]
|
||
|
initWithVoice:
|
||
|
(and x (nsstring (string-append base-string x)))])
|
||
|
(define (voice->synthesizer voice)
|
||
|
(or (synthesizer voice)
|
||
|
(begin
|
||
|
(printf "~a is not available\n" voice)
|
||
|
(synthesizer #f))
|
||
|
(error #f "cannot initialize voice")))
|
||
|
(let ([st (voice->synthesizer voice)])
|
||
|
(lambda (x)
|
||
|
[$ st startSpeakingString: (nsstring x)])))
|
||
|
|
||
|
(define speak (make-speaker (get-voice-name)))
|
||
|
|
||
|
(speak "may I help you?")
|
||
|
(let loop ()
|
||
|
(printf "> ")
|
||
|
(let ([x (get-line (current-input-port))])
|
||
|
(unless (eof-object? x)
|
||
|
(speak x)
|
||
|
(loop))))
|
||
|
(newline)
|
||
|
|