Re: Mac python programming

  • From: Dave <davidct1209@xxxxxxxxx>
  • To: programmingblind@xxxxxxxxxxxxx
  • Date: Sun, 2 Jan 2011 22:25:28 -0800

Played around with it a bit more--I'll send you a diff offlist.

It's kind of a dirty hack at this point; I have reg ex's filtering out
the raw tts commands obtained from stdin.  The official servers
(espeak, outloud, etc) are all written using tcl.  Tcl, after a little
reading, has a very nice feature where its commandloop will map
commands received through stdin directly to procedures defined in the
script.  In python, we have to do this parsing ourselves which sucks.
Also, multiple "q" (that's tts speak chunks) get sent at one time so I
still need to put in queueing on the server side...

But, yes, it "talks", but not really yet all that functional, though it's close.

On 1/2/11, Ken Perry <whistler@xxxxxxxxxxxxx> wrote:
> If you get it all working right can you send me what I need to do to get it
> working?  I don't have the time till next weekend at best to do more work on
> the python ttsserver.
>
> ken
>
> -----Original Message-----
> From: programmingblind-bounce@xxxxxxxxxxxxx
> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Dave
> Sent: Sunday, January 02, 2011 8:29 PM
> To: programmingblind@xxxxxxxxxxxxx
> Subject: Re: Mac python programming
>
> Also, I changed up my server to use the server's stdin to receive
> text.  Doing this via COcoa framework's to receive the callbacks when
> line's are received (via FileObserver's).
>
> On 1/2/11, Dave <davidct1209@xxxxxxxxx> wrote:
>> Thanks for the tip with mac ports and installing emacs through it.
>> Nice to have the dependencies pulled in for you.
>>
>> I've got emacspeak talking with a quick hack of dtk-speak.el.  It's
>> still passing over tts param's (pertaining to outloud which is the
>> default); gotta fix that and then figure out how to parse those
>> embeded commands.
>>
>> Otherwise, responsiveness is incredibly good; Alex just happens to be
>> super wrt latency so it's not a surprise.  Btw, characters seem to be
>> handled properly.
>>
>> On 1/2/11, Ken Perry <whistler@xxxxxxxxxxxxx> wrote:
>>> Nod which is why I started and will make this server in python first then
>>> once I have it in python I can quickly convert it over.
>>>
>>> Ken
>>>
>>> -----Original Message-----
>>> From: programmingblind-bounce@xxxxxxxxxxxxx
>>> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Dave
>>> Sent: Sunday, January 02, 2011 3:02 PM
>>> To: programmingblind@xxxxxxxxxxxxx
>>> Subject: Re: Mac python programming
>>>
>>> Ken,
>>>
>>> I think you misunderstood me.  You can make C++ calls within objective
>>> C methods (i.e.
>>>
>>> - (void)foobar {
>>> std::vector<std::string> x;
>>> x.push_back("asdf");
>>> MyCppClass.DoSomething();
>>> }
>>>
>>> I understand the argument convention's kinda funky, but it actually
>>> serves to self document the code
>>> i.e.
>>> [foobar performActionWtihName:bla forObject:bbla2 withTime:10
>>> inYear:2010 etc:blabla];
>>>
>>> Requires retuning of our "speech" delimiters when we parse it with our
>>> ears
>>> :).
>>>
>>> On 1/2/11, Ken Perry <whistler@xxxxxxxxxxxxx> wrote:
>>>> No it is not the same difference since c++ and python at least have
>>>> arguments and functions like I like I just have never liked the [object
>>>> argument1: argument 2: argument3 ] type of function naming.
>>>>
>>>> Ken
>>>>
>>>> -----Original Message-----
>>>> From: programmingblind-bounce@xxxxxxxxxxxxx
>>>> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Dave
>>>> Sent: Sunday, January 02, 2011 1:11 PM
>>>> To: programmingblind@xxxxxxxxxxxxx
>>>> Subject: Re: Mac python programming
>>>>
>>>> That's macports I assume?
>>>>
>>>> Also, objective C interoperates pretty well with C++ (only notable
>>>> exception is that an objc class can't inherit from a C++ class and
>>>> vice versa).  If you're messing about with emacspeak (and probably
>>>> then lisp), instead of paren's, you're using brackets (same
>>>> difference? sorta except for prefix operators in lisp).
>>>>
>>>> On 1/2/11, Ken Perry <whistler@xxxxxxxxxxxxx> wrote:
>>>>> Well it doesn't have to be objective c there are direct libraries to
>>>>> c++
>>>> as
>>>>> well.  I will decide if I want to mess with those funcky function
>>>>> headers
>>>> or
>>>>> not. I used to code in objective c some in linux so maybe it won't hurt
>>>> too
>>>>> much to think with brackets again.  First thing is first though I want
>>>>> to
>>>>> get this simple python ttsserver working so I can test it if it feels
>>>>> sluggish then I will think about converting it to some binary language.
>>>> Too
>>>>> bad the speechSynthisizer class doesn't seem to have a speak by
>>> character.
>>>>> I guess I could convert the character to a phoneme.
>>>>>
>>>>>
>>>>> As for how I made it I just downloaded the may 2010 bz2 file and did
>>>>> make
>>>>> config and make and it compiled as if I was on linux with no problems.
>>>>>
>>>>> Now I have to point out that I have ports installed which is where I
>>>>> get
>>>>> emacs and all the linux tools like bison flex etc from.  It seems to be
>>>>> working though.
>>>>>
>>>>> Ken
>>>>> -----Original Message-----
>>>>> From: programmingblind-bounce@xxxxxxxxxxxxx
>>>>> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Dave
>>>>> Sent: Sunday, January 02, 2011 12:35 PM
>>>>> To: programmingblind@xxxxxxxxxxxxx
>>>>> Subject: Re: Mac python programming
>>>>>
>>>>> That's good news; I haven't messed about with building emacspeak (my
>>>>> speech server had been used for another project).  Which build file
>>>>> did you use (I think the main build target tries to build the linux
>>>>> based speech servers as well)?
>>>>>
>>>>> I dug into emacspeak sources a bit and seems fairly easy to get it all
>>>>> working.  It looks like you just need to modify dtk-speak.el to be
>>>>> aware of the mac os server.  Looks like the lisp layer communicates
>>>>> with the server via (process-send-string ) which sends the string to
>>>>> the process using stdin.
>>>>>
>>>>> The way to go imo for efficiency is to write the server is native
>>>>> objective c and link against appkit directly.
>>>>>
>>>>> On 1/2/11, Ken Perry <whistler@xxxxxxxxxxxxx> wrote:
>>>>>>
>>>>>>
>>>>>> Ok I had to try it before I get back to work on Monday.  I just got
>>>>>> emacspeak to compile with no problems. Well I say no problems but
>>>>>> there
>>>>> were
>>>>>> about 8 warnings of packages I did not have installed to emacs but
>>>>>> they
>>>>> were
>>>>>> either all lisp packages or they could be replace for example it said
>>>>>> I
>>>>>> didn't have w3.  I just installed w3m which I think works fine with
>>>>>> emacspeak since it works fine with emacs.  If not I will go get the
>>> older
>>>>>> w3.el sources.  Of course none of the packages it warned about really
>>>> will
>>>>>> break emacspeak it just will not allow me to do a couple things till I
>>>> get
>>>>>> them installed.  So anyway I now have emacspeak compiled but I have
>>>>>> not
>>>>>> installed it yet because I want to see if I can jerry rig it to take
>>>>>> my
>>>>>> ttsserver.  Heck I might even dump python all together and rewrite
>>>>>> what
>>> I
>>>>>> have done in c++ for speed but we will see because I would rather get
>>>>>> it
>>>>> to
>>>>>> work first then make it faster.  At this rate though maybe I can get
>>>>>> emacspeak talking next weekend.
>>>>>>
>>>>>> I also want to see if I can find a way to have emacsspeak run in
>>>>>> console
>>>>>> output mode or something where it will write the text it would send to
>>>>>> a
>>>>>> file that would  be helpful.
>>>>>>
>>>>>> Ken
>>>>>>
>>>>>> -----Original Message-----
>>>>>> From: programmingblind-bounce@xxxxxxxxxxxxx
>>>>>> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Dave
>>>>>> Sent: Sunday, January 02, 2011 1:20 AM
>>>>>> To: programmingblind@xxxxxxxxxxxxx
>>>>>> Subject: Re: Mac python programming
>>>>>>
>>>>>> It's been a while lol...but looks like I went down the same road
>>>>>> before.  Here's my take on a server before.  Mac has a native
>>>>>> messaging loop (not sure what it is in terms of py objc context), but
>>>>>> in objc it's NSRunLoop.  Looks like you've found it though in
>>>>>> apphelper.
>>>>>>
>>>>>> This server uses an http server to receive text from a client.  Also,
>>>>>> would be interested in your luck compiling emacspeak on Snow Leopard.
>>>>>>
>>>>>>
>>>>>> """ begin server
>>>>>> """
>>>>>> import string,cgi,time, urllib
>>>>>> from os import curdir, sep, system
>>>>>> from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
>>>>>> from AppKit import NSObject
>>>>>> from AppKit import NSSpeechSynthesizer
>>>>>> """ WebServer
>>>>>> This script starts an http server and utilizes the Mac OS X speech
>>>>>> synthesis framework to generate speech received through the browser as
>>>>>> an url.
>>>>>> """
>>>>>> class SpeechSynthesizerDelegate(NSObject):
>>>>>>  def speechSynthesizer_didFinishSpeaking_(self, synthesizer, success):
>>>>>>    sys.stdout.write("finished speaking")
>>>>>>
>>>>>> class MyHandler(BaseHTTPRequestHandler):
>>>>>>  speechSynthesizer = NSSpeechSynthesizer.alloc().init()
>>>>>>  delegate_ = SpeechSynthesizerDelegate.alloc().init();
>>>>>>
>>>>>>  def __init__(self, request, client_address, socket):
>>>>>>      MyHandler.speechSynthesizer.setRate_(500)
>>>>>>      MyHandler.speechSynthesizer.setDelegate_(MyHandler.delegate_)
>>>>>>      BaseHTTPRequestHandler.__init__(self, request, client_address,
>>>>> socket)
>>>>>>
>>>>>>  def do_GET(self):
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>  MyHandler.speechSynthesizer.startSpeakingString_(urllib.unquote(self.path))
>>>>>>
>>>>>> def main():
>>>>>>  try:
>>>>>>      server = HTTPServer(('', 80), MyHandler)
>>>>>>      print 'started http server...'
>>>>>>      server.serve_forever()
>>>>>>  except KeyboardInterrupt:
>>>>>>      print '^C received, shutting down server'
>>>>>>      server.socket.close()
>>>>>>
>>>>>> if __name__ == '__main__':
>>>>>>  main()
>>>>>>
>>>>>>
>>>>>> On 1/1/11, Ken Perry <whistler@xxxxxxxxxxxxx> wrote:
>>>>>>> Oh one more thing Dave.  I was planning to replace the main function
>>>> part
>>>>>>> with a socket loop that would take from the stdin and from a tcip
>>> socket
>>>>>>> like the protocol says I just wanted to make sure the simple stuff
>>>> worked
>>>>>>> first.  I didn't see a character speak method in NSSpeechSynthesizer
>>>>>> either
>>>>>>> did you?  If not this his how I would add the function to that script
>>>>>>> I
>>>>>> just
>>>>>>> sent you to speak a character...  If you add this right after the
>>>> tts_say
>>>>>>> function this will make
>>>>>>>
>>>>>>> Ttsserver l <character>
>>>>>>>
>>>>>>> Work.
>>>>>>>
>>>>>>>
>>>>>>> #l c for speaking characters
>>>>>>> def l(text):
>>>>>>>     voice = NSSpeechSynthesizer.defaultVoice()
>>>>>>>     speech = NSSpeechSynthesizer.alloc().initWithVoice_(voice)
>>>>>>>     speech.setDelegate_(SpeechDelegate.alloc().init())
>>>>>>>     speech.startSpeakingString_(text)
>>>>>>> funcs['l']=l
>>>>>>>
>>>>>>> -----Original Message-----
>>>>>>> From: programmingblind-bounce@xxxxxxxxxxxxx
>>>>>>> [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Dave
>>>>>>> Sent: Saturday, January 01, 2011 9:05 PM
>>>>>>> To: programmingblind@xxxxxxxxxxxxx
>>>>>>> Subject: Re: Mac python programming
>>>>>>>
>>>>>>> Agreed on the crappy docs concerning this.
>>>>>>>
>>>>>>> Tried my hand at a speech server using py obj and had the *exact*
>>>>>>> same
>>>>>>> problem.
>>>>>>> Of course, implementing the delegate (NSSpeechSynthesizerDelegate if
>>>>>>> memory serves), with all methods of the protocol yields no errors at
>>>>>>> runtime; it simply just doesn't work.
>>>>>>> Would be curious to see if anyone has an answer as well.
>>>>>>>
>>>>>>> On 1/1/11, Ken Perry <whistler@xxxxxxxxxxxxx> wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> Has anyone created a command line application and made use of
>>> delegates
>>>>>>> with
>>>>>>>> pyobjc under Mac?  I am working on a project that uses the
>>>>>>>> NSSpeechSynthesizer  class in coco and I can make the program talk
>>> fine
>>>>>>> but
>>>>>>>> I am not getting the didFinishSpeaking delegate message. If you know
>>>>> what
>>>>>>> I
>>>>>>>> am talking about I can send you some simple sample code to check and
>>>> see
>>>>>>> if
>>>>>>>> I am doing this correct.  I have to say the pyobjc documentation and
>>>>>>> sample
>>>>>>>> programs suck.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Ken
>>>>>>>>
>>>>>>>>
>>>>>>> __________
>>>>>>> View the list's information and change your settings at
>>>>>>> //www.freelists.org/list/programmingblind
>>>>>>>
>>>>>>> __________
>>>>>>> View the list's information and change your settings at
>>>>>>> //www.freelists.org/list/programmingblind
>>>>>>>
>>>>>>>
>>>>>> __________
>>>>>> View the list's information and change your settings at
>>>>>> //www.freelists.org/list/programmingblind
>>>>>>
>>>>>>
>>>>>> __________
>>>>>> View the list's information and change your settings at
>>>>>> //www.freelists.org/list/programmingblind
>>>>>>
>>>>>>
>>>>> __________
>>>>> View the list's information and change your settings at
>>>>> //www.freelists.org/list/programmingblind
>>>>>
>>>>> __________
>>>>> View the list's information and change your settings at
>>>>> //www.freelists.org/list/programmingblind
>>>>>
>>>>>
>>>> __________
>>>> View the list's information and change your settings at
>>>> //www.freelists.org/list/programmingblind
>>>>
>>>> __________
>>>> View the list's information and change your settings at
>>>> //www.freelists.org/list/programmingblind
>>>>
>>>>
>>> __________
>>> View the list's information and change your settings at
>>> //www.freelists.org/list/programmingblind
>>>
>>> __________
>>> View the list's information and change your settings at
>>> //www.freelists.org/list/programmingblind
>>>
>>>
>>
> __________
> View the list's information and change your settings at
> //www.freelists.org/list/programmingblind
>
> __________
> View the list's information and change your settings at
> //www.freelists.org/list/programmingblind
>
>
__________
View the list's information and change your settings at
//www.freelists.org/list/programmingblind

Other related posts: