They are on github here. I just followed the instructions:
Copy the File Templates and Project Templates folders to the following path in your home directory, creating any missing intermediate directories if needed:
I'm a little rusty with Xcode (and it's become more and more like flying the space shuttle or something. Still, I was able to recycle this old project, while changing it just a bit.
One funny thing, I couldn't figure out how to hook up the text field outlet in the old way. I had to use bindings, and of course I did so for the popup as well (both Content and Selected Index).
I don't have a lot of time to fool with Xcode any more, but I do want to check out Greg's blog. Thanks again.
Here's the AppDelegate:
#-*- coding: utf-8 -*- from Foundation import * from AppKit import * class SpeakerAppDelegate(NSObject): TF = objc.ivar('TF') voiceL = objc.ivar('voiceL') nameL = objc.ivar('nameL') selectedIndex = objc.ivar('selectedIndex') notSpeaking = objc.ivar('notSpeaking') pretext = 'Hi, my name is ' def init(self): s = NSSpeechSynthesizer.alloc().initWithVoice_(None) self.speaker = s self.speaker.setDelegate_(self) self.setVoices() self.notSpeaking = True self.setSelectedIndex_(0) return self def setTF_(self, value): if value != self.TF: self.TF = value def setSelectedIndex_(self, value): if value != self.selectedIndex: self.selectedIndex = value name = self.nameL[self.selectedIndex] self.setTF_(self.pretext + name) def setVoices(self): L = NSSpeechSynthesizer.availableVoices() self.voiceL = L DL = [NSSpeechSynthesizer.attributesForVoice_(v) for v in L] nL = [D.objectForKey_('VoiceName') for D in DL] self.nameL = NSMutableArray.arrayWithArray_(nL) NSLog("%s" % self.nameL) @objc.IBAction def speak_(self,sender): i = self.selectedIndex NSLog("%i Say: %s" % (i, self.TF)) self.speaker.setVoice_(self.voiceL[i]) self.notSpeaking = False self.speaker.startSpeakingString_(self.TF) pass def speechSynthesizer_didFinishSpeaking_(self,speechSyn,flag): NSLog("didFinishSpeaking_") self.notSpeaking = flag