Older blog entries for rupert (starting at number 22)

Today concludes three weeks of intensive late night hacking with the computer that I've installed in my car. When I removed it from the trunk a month ago, its control interface was a minature VT100 terminal. When it's installed next week, control will be solely via speech recognition. In three weeks, I've spent days at a time pounding my head against the monitor, working through tough design problems. I've also learnt a ton about multi-threaded server / client design, data routing, sockets, lock objects, TCP, and the horrors of termios :-)

It's a great stage to be at, and I'm really glad that for the first time, I didn't just come up with losing hacks to get everything working. Having a solid core architecture to build this set of computing services on is going to make expanding it further so much easier!

I've named the project since I wrote last. The system is named Alice (and recognizes her name when spoken). The name was chosen partly because it's short, easily pronounced, and continues the long standing tradition of 'Alice Bots', a popular set of AI chatbots. Finally, Alice as in Alice in Wonderland, since I've been chasing down rabbit holes lately, and finding new worlds within :-)

The architecture I've built has an EDS (event distribution server) at its core, to which clients (speech processing module, MP3 module, LCD control module) connect, and send and recieve data, which is routed appropriately between the connected modules, which then process the data and perform the appropriate I/O.

Arguably the coolest piece of the system is the little speech processor that I've written. The system relies on an external application (CMU's Sphinx) to convert the speech waveform to a text string. The speech processor takes in the text string, and using a simple weighted network algorithm, causes the output of the module (which is passed to the EDS) to become progressively more accurate over time.

Everything's been written in Python so far, apart from the speech synthesizer and recognition systems, which are external (GPLed) applications. I've been programming in Python for about two years, but it took a big project like this to really drive home what an amazingly versatile and capable language it is. The structure of the language really made it easy to experiment, make rapid changes, and keep the code easy to read.

Now to put the system into the car, and drive with it for a few weeks. It'll be exciting to see how well it works, and I look forward to posting more regular diary entries with progress reports.

--- Rupert

26 Jun 2001 (updated 26 Jun 2001 at 08:10 UTC) »

Today was a slow day at work, so I started working on a couple of single frame comic strips, using the Windows paint tool. Slowly, Vinnie the Vulture, and his trusty pet, Dun, a TCP packet, emerged from the chaos, and set out on the first of their adventures. All of the strips are available on the embryonic Vinnie the Vulture page. Just pretend to laugh... the term "comic" is used loosely here, and most of the comic aspects consist of obscure inside jokes, and bad rhyming schemes. Fortunately, the quality of the art makes up for all of that.

Apart from this, I spent the day hunting down bugs, and trying to triage a departing coworker's bug queue into something slightly more manageable. Nothing very exciting, however I did have a nice Indian dinner with my friends Greg and Tague.

In hacking news, the speech recognition component of my car project is almost ready for installation. Most of the Python glue code to interface Sphinx with the LCD server and MP3 player applications is done, so I'm getting excited about the project again. What I really need to be doing is fixing bugs in the current installation (and there are many), but adding new features is much more fun!

First diary entry in a while... I've spent the last two weekends on the road, which has been pretty fun. On June 8, I went to Reno, Nevada for the 14th Blackbird Reunion, and this weekend, ventured down to San Diego to visit an old friend from school. Standing in the line to get my boarding pass for the flight back, I heard my name called, and looked up to see someone who I momentarily didn't recognize. It was my old geometry teacher from high school! We ended up sitting in the same row on the flight home, and had a nice time swapping stories and reminiscing about 'the old days'. He retired in 1997 after 32 years of teaching at the school, and seemed to be enjoying his retirement.

San Diego was great fun. I took Monday off work to spend an additional day down there, which turned out to be a good strategy (taking time off from work is never bad). Mike took me to see the downtown area, and we walked around by Horton Plaza and the El Cortez, before taking a Red Line tram back into the Old Town area. Stopped for a very welcome margarita and snack at a local TGI Friday's, then headed back to his home.

Monday, we drove around some more, and visited the San Diego Aerospace Museum, the Mission, La Jolla, and UCSD. It was fun seeing my brother's alma mater, and we wandered around above Black's Beach for a while, watching the gliders take off over the cliffs.

I don't have any new hacking news to report, apart from the fact that I finally got my 40 GB disk working, but I don't believe that that really counts :-P

Humor me while I rant about telecommunications again for a second...

I fail to understand how people think that war-dialing my work and cellphone numbers think that it's going to encourage me to talk with them, or put me in any better a mood. Leaving a voicemail and waiting for it to be returned isn't good enough for them, apparently. They war- dial your work and cell numbers for a couple of minutes (every 10 seconds or so), then finally work out that *gasp* they can leave voicemail! So they leave voicemail. Most sane people stop at this point, and wait for their call to be returned. However, they're not sane (or polite), so they continue war-dialing, alternating between numbers.

Eventually I just pulled my work phone out of the PBX jack, and powered down my cellphone. I'm half tempted to leave them both this way.

If there are any Nokia engineers out there reading this, why can't you guys build a simple call blocking feature into the firmware of your phones?!

It doesn't seem like it'd be that hard to do... (some pseudo-code to illustrate my point)..

display_call = 1
ring_style = 'ring'
cidbank = {}

cidbank[goodperson] = {} cidbank[goodperson][number] = 4159240024 cidbank[goodperson][block_call] = 0

cidbank[badperson] = {} cidbank[badperson][number] = 9095551234 cidbank[badperson][block_call] = 1

def process_call(name):

# If they're blocked, don't do anything... # go back to the event handler.

if cidbank[name][block_call] == 1: return

# If we don't know the number, or it's in the db # (and not blocked), ring the phone..

else: ring_phone(display_call, ring_style)

That's all my ranting for the day. Thanks for listening.
30 May 2001 (updated 30 May 2001 at 08:31 UTC) »

Read A.C. Weisbecker's Cosmic Banditos cover to cover tonight, and it's my new favourite book*. Banditos roaming in the realm of the Subatomic, with all of your favourite federal agencies thrown in for good measure :-). A great read!

* I have many favourite books, actually.

Finally got crystal out the door. It's a small server application that allows control of a CrystalFontz LCD screen via a TCP connection.

It's based on the very nice pyCFontz module by Ben Wilson, and uses a simple plaintext protocol for issuing commands (e.g. out 'foo', crlf, cls, etc..). It's a released pre-release version <grin>, so the full suite of control functions isn't in there just yet, but that should be resolved by the time 1.0 comes out. I'm just using the socket module for now, but I'd like to transition over to using the much nicer SocketServer class, which will allow me to handle multiple simultaneous connections, and be easier to maintain.

Eventually I'd like to add in some advanced features such as multiple LCD screen support, the ability to have a client program 'lock' a region on a screen for exclusive use, and have a set of templates in place that'll allow the submission of a list of data objects to the server that'll get pre-formatted and displayed. The protocol will probably change in the next couple of versions, and use enaml style commands, because they provide a better structure.

Not much else going on. Robey was kind enough to contribute some additional MP3View code, that permits the sequential play of songs, so this should be making its way into 2.2, along with LCD display support.

My brother finished Army basic training yesterday, and did amazingly well. Top of his platoon in marksmanship, and got several other distinctions. Congratulations! (although he's not much of a net person, and will probably never read this) :-P

Have a nice Memorial Day everyone!

Did a short interview with The Screen Savers show on ZDNet's TechTV, in conjunction with a piece on the Alameda County Computer Resource Center. I talked about the Beowulf that we've been building from scrap hardware and donations, and it went pretty well. If you have DSS, check out the show in two weeks or so if you'd like to see me!

Work work work, as usual. Had a nice relaxing dinner with tague tonight, in which we griped about software companies, and watched The Simpsons... a nice change.

Too tired to write anything more...

Goodnight world :)

Sent an email to Senator Richard Alston. Despite my joking re-write of Australia's National Anthem in previous diary entries, he's a fellow I would actually like to chat with. It'd be interesting to hear a little more about how he thinks about his role in Australian government as Minister for Communications, Information Technology and the Arts. His policies are decidedly conservative, and I wonder how much weight he gives to the enforceability of the policies he proposes (e.g. content filtering), or if the social impact is all that really matters to him...

Hopefully my request to meet him will be granted, and I'll be able to ask him these questions in person...

I began playing with CMU Sphinx speech recognition last night. Sphinx is a large vocabulary, speaker independent speech recognition system from Carnegie Mellon, developed with support from DARPA. The package was easy to install (configure, make, make install), but using it was a bit trickier, since there's only fragmentary documentation in the example code. I finally tried running the sphinx2-demo perl script, and was able to say words into the microphone, and see a relatively accurate transcription to the console, which was very very cool. In order to accurately recognize speech, the system requires a language model (lm), which contains a vocabulary file, and assorted support files which have coded pronunciations for each of the sentences and sentence fragments. The best way to generate an LM is to use CMU's web based Langua ge Modelling Tool, which takes in a CR separated list of sentences and vocabulary words, and returns a .tar.gz file containing all of the necessary files for a basic language model.

Also got Festival working for the first time with very little difficulty. It uses Scheme for control, which surprisingly isn't a bad language to work in. I've hacked up a very basic set of wrapper functions in Python, that simply do os.system() calls to the festival program to speak text, execute Scheme scripts, etc, from within Python. Dynamically generating speech is much slower than just pulling it from a WAV file, even on a machine of decent speed.

Not much else going on... it's raining here in SF, and I managed to break my car key off in my trunk lock this morning :-( ... I wish I knew the digital code for my car door keypad..

Composed in the early morning hours, in frustration about not having enough disk space on a server....

Holding Out For An Inode.
Rupert Scammell
April 9, 2001.

(to Holding Out For a Hero, by Bonnie Tyler)

Where has all the disk space gone,
and where are all the blocks?
and where's the rm -rf command to fight the rising odds?
Isn't there a gzip, upon a fiery steed,
Late at night I toss and turn, and dream of what I need...

I need some inodes, I'm holding out for some inodes 'till the end of the night...
The disk's got to be strong, and it's got to be fast, and it's got to be mounted read/write..
I need some inodes, I'm holding out for some inodes 'till the morning light..
I've got to have more, and it's got to been soon, and it's got to have ten gigabytes...

Somewhere after midnight, in my wildest fantasy,
Somewhere just beyond my reach,
There's SCSI-1 reaching back for me,
Racing on the read write head,
And air-cooled against the heat,
It's going to take an fsck to sweep me off my feet

I need some inodes, I'm holding out for some inodes 'till the end of the night...
The disk's got to be strong, and it's got to be fast, and it's got to be mounted read/write..
I need some inodes, I'm holding out for some inodes 'till the morning light..
I've got to have more, and it's got to been soon, and it's got to have ten gigabytes..

Up where the Mountain tapes meet the heavens above,
Up where the lightning splits the Seagate,
I would swear that there's a volume, somewhere, caching me

Through the hinv and the stack and the frames,
and the storm and the RAID,
I can feel its I/O like the fire in my 'Blade

I need some inodes, I'm holding out for some inodes 'till the end of the night...
The disk's got to be strong, and it's got to be fast, and it's got to be mounted read/write..
I need some inodes, I'm holding out for some inodes 'till the morning light..
I've got to have more, and it's got to been soon, and it's got to have ten gigabytes...

13 older entries...

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!