Tuesday, September 04, 2007

Emacspeak Video Demo: Looking Up The Weather

In the first of a sequence of posts demonstrating live emacspeak user interaction, I'll give an overview of what it feels like to use Emacspeak's powerful Web Command Line provided by its rich collection of web gadgets made up of search wizards and smart url templates

Here are a few things to note about this and all the subsequent video demos in this series:

  • All demos were recorded using recordmydesktop on an Ubuntu laptop running Linux (Ubuntu Dapper).
  • The text-to-speech is produced by the IBM ViaVoice engine, this can now be purchased from a couple of sources in the US and Europe.
  • All demos are recorded with the speech rate at which I use Emacspeak. These demos are primarily intended to show the efficiency of the environment, and slowing down the speech would detract significantly from that goal.
  • Frequent users of text-to-speech will still find the output comprehensible. For the rest, you can match it up with what you see on the screen ;-)
  • Careful listeners will notice some jitter/clipping in the audio --- this appears to be an artifact of using recordmydesktop that I was unable to eliminate.
  • In each of these articles, I'll enumerate the actions I take, and their effect. I'll enumearate actual keystrokes, but I suggest readers focus more on the atomic commands being executed, rather than individual keypresses.

Looking Up The Weather

Looking up current weather is a sufficiently common action where browsing to a weather site, typing in ones zip-code and reviewing the resulting page is three steps too many. This is also why most modern desktop environments provide gadgets that display such live information with minimal user intervention. This first video shows Emacspeak smart url RSS Weather From Wundergroundin action.

Here is the RSS Weather Demo. This is an OGG/Theora video and should play with tools like mplayer. The table below shows a brief description of each user action and its effect.

ActionKeyEffect
Access GadgetsC-e uPrompts for gadget
Pick Weather Gadgetrss tabpartial input completes to RSS Weather From Wunderground
Pick Default LocationreturnCA/SanJose
Speaks weather forecast
QuitqStops speech, dismisses weather forecast, and speaks current context. In this case the shell becomes current and you hear the relevant information.

A Transcript Of What You Hear

Users who could see the video half of this demo but were not frequent text-to-speech users reported that it would be useful to see a transcript of what is being spoken. I'm revising this entry to have an annotated transcript. Note that the transcript may not be accurate to the last word, since I'm typing it in by hand; however it should give one a sense of what information emacspeak chooses to speak.

Access Gadgets
The spoken prompt is Resource:.
Pick Gadget
You hear me type RS and then you hear Emacspeak completing my input to RSSWeather. Half way through that utterance, I know it's found the right gadget, so I hit enter, and that stops the utterance RSSWeather half-way through and speaks the next prompt. Notice that you also hear auditory icons to indicate that a prompt input area just opened.
Location
With the gadget now selected, you hear the City/State prompt generated by the weather gadget. It also produces a default location of CA/San_Jose. In the demo, you hear the State/City prompt, along with the default value. I hit enter midway through that utterance, again the speech flushes immediately. The gadget now has enough information to do its work; it pulls the RSS feed from Wunderground, converts it to XHTML (using XSLT) and displays the page using Emacs/W3. Once displayed, it starts speak the forecast you see on the screen.
Forecast
Here is a rough transcript of what you hear as the weather forecast is spoken. The forecast starts with the words: Conditions 73 degrees F Partly cloudy 4:50pm PDT August 18 ... This is in a lower-pitched (deeper) voice since it was generated from the title of the corresponding RSS item. Emacspeak uses Aural CSS to produce such audio formatted information. The contents of the item are spoken in the default voice starting with the utterance Temperature 73 degrees F 23 degrees C ... Conditions partly cloudy ... When I've heard enough, I hit q to quit.
Quit
When I quit the weather gadget, a number of things happen.
  • You hear auditory icon close-object to indicate the weather forecast being dismissed.
  • You hear context information indicating that the Emacs shell buffer has now become current.
  • For this context information, you hear it speak the working directory of the shell buffer and the word shell

Friday, August 31, 2007

Emacspeak And GMail

See this article by my Google colleague Srinivas Annam that outlines the availability of GMail Filters from the basic HTML interface. This was the final piece that remained to convince me to use my GMail account for email --- now, keeping the GMail Inbox clean and free of clutter has become a snap.

To go with this, I've added a few smart URL templates to Emacspeak's Web Command Line. Once you've signed in, you can use template GMail Search to type a search term, and find matching mesages. Note that GMail uses CSS class msg to tag the actual contents of a message. You can use this to advantage by hitting e c on a message link, and specifying msg as the class value to filter the message.

At some point I'll add a couple of Emacspeak wizards for creating filters; the present HTML interface is still a bit too click intensive for my liking. But cudos to Srinivas for doing the hard work that lets me discover the pain points in the HTML interface; until now these were completely invisible to me since I couldn't use GMail from the Emacspeak environment.

Emacs/W3 note: Note that signing in to GMail from the main GMail screen defeats W3. An easy work-around, and something that is more efficient anyway is to use the glogin.xml form found in Emacspeak --- use C-e ?/ in Emacspeak to pick that form. Once you're signed in to Google, you can:

  • Open your inbox
  • Perform searches to find the message you want

Friday, August 17, 2007

AMixer And Emacspeak: Controlling The Sound Card

In the days of OSS, Emacspeak had a nice Emacs-interface to aumix and it is a piece of functionality that I have missed even more under ALSA, given that one can do many more sophisticated tweaks to one's sound-card. Tool alsamixer --- a full-screen terminal application is bewilderingly confusing (at least to me), and amixer though usable required me to go find out how it worked each time I needed to do something new. The final straw came last weekend when I tried to record some Emacspeak demos using recordmydesktop and needed to configure ALSA so that it would capture sound directly from the PCM output, rather than the microphone.

To cut a short story even shorter, I ended up writing an Emacs wrapper around amixer called --- well, you guessed it, amixer. The code is checked in as amixer.el. The Emacspeak keybinding C-e ( formerly used to manipulate aumix is now ALSA-aware and will intelligently default to using the new amixer tool if /usr/bin/amixer is available.

Tuesday, August 07, 2007

The Web The Way You Want

While working on miscellaneous Web related things including:

  • Working on the W3C TAG in trying to understand how HTML TagSoup and well-formed markup might co-exist on the Web --- without the bad perennially driving out the good,
  • Thinking about the Web Command Line, and placing various Web gadget/widget technologies in perspective,
  • Building Emacs-G-Client --- an Emacs client for Google services,
  • Connecting Emacs and Firefox via MozREPL to get the best of both worlds ,
  • Refactoring some of the Web-related code in Emacspeak to better reflect the underlying ideas,
  • Adding additional Web goodies to Emacspeak including Google Suggest in the Emacs minibuffer,
  • And items too numerous to fit in this margin ...

I also wrote a draft chapter on specialized Web browsing. Given the set of things I have been working on, the end result is to point out that given the architecture and underlying design principles of the Web as embodied by HTTP, URIs and HTML, specialized Web browsing is in fact not so specialized after all.

Thursday, August 02, 2007

Google Suggest: Minibuffer Completion When Googling

Google Suggest has been available until now as a Firefox extension --- it displays a dynamically generated list of completions as one does Google searches in Firefox. The prefered way of Googling on the Emacspeak audio desktop --- using Emacspeak's Websearch facility available via C-e ? is now Google-Suggest enabled. This means that when doing Google searches via C-e ?g, you can type a partial query, and hit TAB to get a list of possible completions for the query.

Tuesday, July 24, 2007

Emacspeak WebMarks: Online Bookmarks Using Google

Emacspeak module emacspeak-webmarks adds support for adding, viewing and finding Google Bookmarks. Google Bookmarks allows you to store your bookmarks at Google; this module adds support similar to that provided by Firefox Bookmarklets for Google Bookmarks implemented in JavaScript. Note that this module though relatively small was one of the motivators for the code refactoring described in Web Interaction in Emacspeak.

Usage Tips

  • To use Webmarks, you need to be signed into Google.
  • Signing in to Google is easily done using the Webform provided as xml-forms/glogin.html in the Emacspeak distribution --- invoke it via key C-e?/.
  • In addition, the very first time you use Google Bookmarks, add your first bookmark using form xml-forms/bookmark-add.html. Fill out that form, hit submit, and extract the value the zx parameter returned by the server.
  • Use emacs Custom to save the value of the zx parameter as Emacs option emacspeak-webmarks-key.

Web Interaction In Emacspeak

Users running out of SVN will have noticed that the emacspeak codebase has seen a significant number of updates over the last couple of weeks. During this time, I've refactored the Web interaction code in Emacspeak to meet the following goals:

  • All Emacspeak Web smarts have now been re-factored to be independent of any given Web browser. In practice, this avoids code duplication between W3 and W3M support.
  • The interface to XSLT has been significantly improved.
  • When using W3, Emacspeak automatically builds a cache of CSS classnames and ids occuring on the page. These are then used to provide interactive completion when invoking commands emacspeak-extract-by-id (bound to e i in Web pages) and emacspeak-we-extract-by-class (bound to e c in Web pages).
  • Module emacspeak-we holds all code related to editing Web pages before they are displayed.
  • Module emacspeak-webutils holds all Web utility code.
  • Atom and RSS feeds are now pulled using Emacs-22 built-in library url rather than via libxslt. This has the advantage that the feeds are pulled with any cookies the browser may have set during the session.
  • All url templates, search wizards and related Web utilities should now be capable of working similarly under W3 and W3M.
  • Module emacspeak-moz provides a basic level of integration with Firefox --- see my related blog post on FireBox.
  • Module emacspeak-w3m still needs work to take advantage of all of these changes; I myself do not use W3M much, so those updates will happen as and when W3M users contribute the necessary time and patches.

Emacs-G-Client: Leveraging New Picasa API Features

The Google Picasa team announced a set of useful additions to the Picasa Web API yesterday. I've added support for most of these new features in module gphoto that is part of my Emacs G-Client package.

You can get the latest version of package Emacs-G-Client via SVN. Note that this development version of package Emacs-G-Client also includes a light-weight client for finding and playing YouTube videos.

Thursday, July 19, 2007

Emacspeak And Beautiful Code

In the fall of 2006, I was invited by O'Reilly Media to participate in an innovative book project called Beautiful Code. The project put together a set of chapters that focused on capturing the collected insight from creating real software. A particularly attractive aspect of this book was that it focused on code --- unlike many book projects in the field of software engineering, here the goal was to explicitly focus on real code and how it could be made beautiful.

The final book is now available in print. The chapter on Emacspeak is being published on this Web site under a Creative Common Licence --- this HTML version includes Chapter 31: Emacspeak --- The Complete Audio Desktop and the Afterword section from the book.

Friday, July 06, 2007

Searching The Emacspeak Knowledge Base

Information about Emacspeak and its use is available from a collection of Web sites, and being able to restrict the search to these authoritative sources is a good way of quickly finding the right document, without being distracted by the numerous hits one finds when doing a search across the whole Web. You can now search the Emacspeak Knowledge Base by using search form emacspeak-search.html; access it via Emacspeak command emacspeak-websearch and specify /to bring up the list of available forms. This form is also the default search form on the Emacspeak Web site.

HowTo: Implement Emacspeak Knowledge Base Search

Implementing the above using CSE is trivial --- all I needed to do was:

  1. Checked in an HTML file into the Emacspeak repository at Knowledge Base.
  2. Create a CSE that uses the above document.

Emacs G-Client, Reader, And CSE: Searching Past Articles From Google Reader

So I use module greader (part of package G-Client to read a large number of ATOM and RSS feeds. I have long missed the ability to search for articles I remember having read a few weeks or months ago; though I typically find it with an appropriately phrased Google Search, I've always wanted to have the ability to restrict the search to the feeds I subscribe to --- this makes formulating the query much easier.

The advent of CSEs --- see my earlier blog post entitled On The Fly Custom Search combined with Google Reader's ability to export ones subscription list as an OPML file gives me exactly what I needed.

HowTo: Enable Searching Of Past Articles From Google Reader

  • Since you need to be signed in to access the subscription list, the CSE magic cannot directly retrieve your subscription list at present. as a consequence, you need to retrieve and save your list of feeds to a location that is publicly accessible. Feature Request: Would be nice if Reader did this automatically by talking to CSE on behalf of the signed-in user --- that would obviate the next manual step.
  • Export your subscription list using command greader-opml. You'll need to do an svn update to get the above command; alternatively, sign in to Google and retrieve your subscription list.
  • Finally, customize emacspeak option emacspeak-url-template-reading-list-opml to the location of the saved OPML file.

Now, you can use Emacspeak url template reader subscription search from the Emacspeak Web Command Line to search articles you remember having seen in your Google Reader. This is also an excellent means of finding articles of interest that one might have missed in the past. As an example, I recently became interested in Selenium --- an extremely powerful Web application testing framework. Finding articles from the past that I ought to have read but hadn't was a snap using the feature describe here.

Tuesday, July 03, 2007

Google Books In Emacspeak

To coincide with today's announcement of gull-text access to public domain works from Google Books, I've updated the corresponding emacspeak Web Command-Line wizard. Use C-e u to invoke URL templates and type google books to access it.

Thursday, June 28, 2007

Making Search Fly: On-The-Fly Custom Search Engines

The Custom Search Engine team at Google recently released CSE On The Fly a truly amazing feature. Incidentally Google Custom Search is the same piece of magic that brought us Accessible Search last year.

So in the spirit of continuing to enhance the Web Command Line in Emacspeak for every smart Web tool that becomes available, I've checked in two new url templates that demonstrate how one can leverage this to be smart and selective about what one reads.

Searching Favorite Feeds
So I read a lot of Blogs, my current Blog Reader is Google Reader via --- you guessed it -- Emacs module GReader (part of the Emacs G-Client package). But I often feel the need to search my favorite feeds. URL-template Reader Subscriptions lets you do this; what's more it's not specific to Google Reader. All you need do is to publish an OPML file listing your favorite feeds and customize Emacs variable emacspeak-url-template-reading-list-opml to point to that location.
Official GoogleBlog Search
Google has a large number of Google-specific Blogs --- I usually read them through this aggregated feed: All GoogleBlog Stream Emacspeak wizard Official GoogleBlog Search builds a CSE from this feed to let you search articles from all of Google's blogs.

Eventually, I'll also add a meta search wizard that lets one construct any CSE on the fly --- with Lisp such meta-programming is a snap!

Later yesterday evening, I checked in a third url-template called On The Fly CSE that prompts for a search term and the URL for the feed of feeds that specifies the content to search.

Tuesday, June 26, 2007

Emacs-G-Client: Uploading Photos To PicasaWeb

The SVN version of package Emacs-G-Client at g-client now includes a new module gphoto.el that can create albums and upload photos to Google's PicasaWeb site --- as an example, see my photo gallery. Emacspeak users are likely to find the RSS and ATOM feeds for photo albums more useful in general; package gphoto provides easy access to previewing these feeds as well as viewing/editting the metadata that goes along with the pictures. As an example of such a feed, here is Hubbell Labrador's Graduation album.

Multilingual Dictionary Lookup Via Google

From the every useful Google tool deserves a Web Command -line equivalent ...

I just checked in an Emacspeak url-template for accessing multilingual dictionary lookup via Google. Invoke it like any other url-template using C-e u and type mult tab. Specify the word to look up, and the source-target language pair using two letter codes --- this is analogous to how the Emacspeak Translation Via Google tool works. And remember, if there is something you find yourself doing often on the Web, there is most likely an Emacspeak Web Command Line gadget for it --- well, at least that is true for the things I find myself doing often;-)

Friday, June 22, 2007

FireBox: Put The Fox In The Box

I've finally found the right development environment for myself for writing and debugging Web Applications that use JavaScript to implement client-side interaction. It turns out that it wasn't just me who found the thought of programming inside the Web browser a painful experience --- pleasant though the final end-user interaction that those results deliver might be for the final user. I discovered MozRepl --- a read-eval-print loop for Firefox. MozRepl is a Firefox extension that allows you to open a connection to a running Firefox session and gain access to a JavaScript interpreter context that can access all aspects of the Firefox runtime.

This is quite neat, I can now use the power of Emacs to write and debug end-user JavaScript applications. But wait, there is more. So in general, as someone who doesn't need to suffer from the hit on cycles and memory that running an X environment involves, I usually dont start GDM --- the graphical desktop --- on my Linux box. Believe me, running just at the console, especially with the LCD turned off makes my laptop run a lot longer. So challenge: How do you take the fox's head off Firefox? How do you run a headless Firefox?

Turns out that the original X Windows developers didn't always have access to all the displays that they were developing X applications for --- so they created XVFB --- the X Virtual Frame Buffer server. Like all good things in the Open Source world, XVFB continues to survive --- even though today, X developers hardly if ever resort to XVFB. But in the fine UNIX tradition of Get out of my way or I'll turn you into a shell script XVFB also turns out to be just what I needed in order to run FireFox as a headless application.

So in summary: I'm typing this blog on the shuttle bus riding home, with the monitor turned off, and Firefox running headless as I debug some of the code I've been writing. If you want to put the fox's head in a box yourself, here is a pointer to FireBox -- share and enjoy!

Thursday, June 14, 2007

Emacspeak And Beautiful Code

Beautiful Code is a collection of essays on software design, with all proceeds going to Amnesty International. It includes a chapter on the use of Lisp advice to speech-enable Emacs --- AKA Emacspeak. I'll eventually publish an HTML version of my article on the emacspeak Web site. In the meantime, I highly recommend the complete book --- which if you need an accessible version can probably be obtained from organizations like BookShare.

Wednesday, May 23, 2007

Google Group For Package G-Client

I've created a Google Group for package G-Client here: Emacs-G-Client. If you are using package G-Client you can use this group to discuss your experiences with other users. Note that the codebase for this package is evolving actively under SVN at lisp/g-client .

Saturday, May 19, 2007

An Essay On Eyes-Free Computing

I just posted an essay on eyes-free computing to my MathZomeblog. This essay highlights the relevance of ZomeTool in teaching mathematical concepts to students who are visually impaired. More generally, it describes my experiences as a mathematician who cannot see. I'm posting the abstract here; the complete essay can be found on my Web site.

The experiences described in this essay have influenced the software I have built and use on a daily basis; it should be of interest to:

  • Emacspeak users wishing to understand why things look like the way they do in Emacspeak.
  • Students with visual impairments who are entering the field of mathematics.
  • Teachers working with visually impaired students.
  • And the generally curious mathematician who wishes to view the world from a different perspective.

Abstract

This essay outlines some of my experiences as a mathematician who cannot see. Note that I transitioned to being a Computer Scientist during Graduate School. However I strongly believe in the edict Once a mathematician, always a mathematician! — my training in mathematics continues to influence the way I think.

I've been unable to see since the age of 14, which means that I've studied and practiced mathematics predominantly in an eyes-free environment. This essay is my first conscious attempt at asking the question What is involved in doing mathematics when you cannot see? I hope that some of the experiences outlined here will prove insightful to mathematicians at large. At its heart, mathematics is about understanding the underlying structure inherent in a given area of interest — and where no such structure exists — to define the minimal structure that is needed to make forward progress.

The general perception that mathematics might be hard to do in an eyes-free environment probably traces itself to the common view of mathematics as a field where one performs copious calculations on paper. I'll illustrate some of the habits and abilities one evolves over time to compensate for the lack of ready access to scratch memory provided by pencil and paper when working in an eyes-free environment. In this essay, I hope to demonstrate that mathematics in its essence is something far bigger. By being bigger than calculations on paper, not being able to see rarely if ever proves an obstacle when it comes to doing mathematics; the challenges one needs to overcome are primarily centered around gaining access to mathematical material, and communicating ones insights with fellow mathematicians. Thus, a large portion of this essay focuses on solutions to the challenges inherent in mathematical communication.

Wednesday, May 16, 2007

Updates To G-Client

If you use g-client within Emacspeak to access Google Services, you might want to read G-Client Updates.

Wednesday, May 09, 2007

Web 2.0 And The Emacspeak Audio Webtop

Blogging while at WWW 2007. I attended the W3C AC meeting the first two days of the week. The highlight for me from the AC (Advisory Committee meeting was a panel consisting of TimBL and Tim OReilly at the end of the day yesterday. It was fun to hear Tim OReilly define Web-2.0 --- he is credited with originally coining the term, but in the last year, Web 2.0 has often been lightly equated to dynamic Web applications that use JavaScript to the extent that many assume that anything that doesn't use JavaScript is not Web-2.0!

The gist of Tim O's definition of Web-2.0 was to point out that once the Web had gained sufficient coverage and scale, it became possible to build application services on this Web that drew their value from aggregating the data on the Web; his examples ranged from Google to Amazon. His comments were insightful --- my own view now is that Web-2.0 should have been called Web^2 i.e. this current revolution is about applying the power of the Web to itself.

The other amusing piece while running around at the conference and observing what everyone is working on is to realize that now that Web Gadgets and the like are popular, it's now considered a fine idea to write light-weight site-specific tools. Notice that Emacspeak has had this since the late 90's in the form of first the websearch module, to be later joined by url-templates. I believe these innovations arrived earlier on the Emacspeak Webtop as compared to the rest of the Web for the following reasons:

  • Emacspeak relied on Emacs/W3 for Web functionality,and when that browser stopped being maintained, there was a strong need to develop Web tools in the context of Emacspeak.
  • The visual Web was getting too complex for use via speech output, and given the flexibility of the Emacs environment, and the arrival of XSLT in 1999, things were well set up to build a powerful set of Web access wizards.
  • Task-oriented Web tools in Emacspeak led to the conceptual Web Command Line in Emacspeak at a time when command-line interfaces were considered passe'.

Incidentally when I showed others working in the field of accessibility these Emacspeak tools during their early days, they were promptly dismissed as site-specific hacks that wouldn't scale in the face of generic screenreaders that would handle every web page. With the visual Web getting too busy for everyone mainstream users now have access to productivity solutions such as Apple's Dashboard Widgets, IGoogle modules that can be placed on a Web page or the desktop, and other comparable tools. It will be interesting to see how much longer blind users saddled with commercial screenreaders will have to wait before seeing similar tools emerge in their world --- just remember, when that does arrive, Emacspeak had them in 2000!

Thursday, May 03, 2007

Emacspeak 26.0 --- LeadDog Unleashed!

Emacspeak Inc (NASDOG: ESPK) announces the immediate world-wide availability of Emacspeak-26 --a powerful audio desktop for leveraging today's evolving data and service-oriented semantic Web.

Major Enhancements

  1. Added support for ESpeak -- a freely available TTS engine.
  2. Added support for Ocropus -- a freely available OCR engine.
  3. Updated Websearch tools.
  4. Updated URL templates to enhance the Web Command Line.
  5. Support for Google Services like Blogger via package G-Client.
  6. Updated productivity tools in the wizards package.
  7. Fully tested against the upcoming Emacs22.
  8. Better integration between W3 and W3M.

This release contains many user contributed patches including:

  • ESpeak patches from the Oralux project.
  • W3M patches from RDC.

You can visit Emacspeak at SourceForge. The latest development snapshot of Emacspeak is available via subversion from Google Code Hosting. You can subscribe to the emacspeak mailing list emacspeak@cs.vassar.edu by sending mail to the list request address emacspeak-request@cs.vassar.edu.

Tuesday, March 20, 2007

See You At CSUN 2007

After a gap of 7 years, I will once again attend CSUN in LA this year. This will also be Bubbles' first CSUN --- I attended CSUN 6 years in a row with Aster between 1994 and 1999. Anyway, if you're an Emacspeak user and are coming to CSUN this year, look for me at the Google booth. This is also Google's first year at CSUN; I will be there with other Googlers working on accessibility. I arrive Wed morning and leave early Friday morning --- look forward to seeing you there.

Friday, March 02, 2007

An Emacs Client For Google Services

1 An Emacs Interface To Google Services

Google offers a number of services using a Google account. Many of these services also expose a Web API. this package provides a set of Emacs modules for accessing these services from inside Emacs. These modules are designed with an Emacs-centric, rather than a Web-browser centered view of the world. Where necessary Emacs package browse-url is used to invoke the Web browser of choice.

The current distribution can be downloaded from Google Code Hosting and the source code is available via Subversion. Note that this is still work in progress. I'm releasing it as part of the Emacspeak project since I believe the package already has sufficiently useful functionality for users who spend a large amount of their time inside Emacs. There is no dependency on Emacspeak, and all clients provided here can be used without Emacspeak loaded.

1.1 Installation

These are needed only if installing package g-client stand-alone, i.e. outside of Emacspeak.

  • Unpack the tar archive and place the resulting g-client directory on your emacs load-path.
  • Type make to compile the code.
  • In your .emacs, add (load-library "g") to set it up.

1.2 How It Works

Clients are implemented using Google APIs based on Atom Publishing Protocol APP and Google Data APIs (GData). We use curl to retrieve content via HTTPS and xsltproc to transform the retrieved content to browsable HTML.

Clients sign you in the first time you invoke commands that require authentication. Once signed in, the session cookie is cached for future use. Session cookies presently expire in 30 minutes, and clients check for expired cookies when authentication is needed. If the cookie has expired, clients retrieve a fresh cookie using the authentication credentials provided earlier. Note that authorization tokens etc are specific to a given service.

1.3 Top-level Customizations

All clients in this package use Emacs' customize interface to set user preferences. The most commonly used ones are enumerated below.

  • g-user-email Default email-id to use. Individual clients typically override this via user option <clientname>-user-email.
  • g-html-handler Name of function that handles HTML content.

1.4 Google Blogger gblogger

This client implements posting, editting and deleting of blog entries using the new Blogger API --- it replaces the now obsolete atom-blogger that implemented similar functionality using the old Blogger API. It uses value of customization option g-user-email by default; this can be overridden via option gblogger-user-email. See Blogger GData API for the underlying APIs used. For editing posts, I recommend installing nxml-mode.

  • Browse Command gblogger-blog brings up the list of blogs owned by the currently authenticated user.
  • Posting Command gblogger-new-entry takes a post URL and sets up a special buffer where you can compose your article. the post url is obtained from the feed of blogs above, use the post link for the blog to which you wish to post.
  • Browsing Command gblogger-atom-display displays the atom feed for a specified blog as a browsable HTML page. In addition to reading your blog, this helps you find the edit url for individual posts.
  • Editting Command gblogger-edit-entry takes the edit url of a previously posted entry. It retrieves the entry, and sets up a special composition buffer where you can edit the entry.
  • Submitting The special composition buffer created by commands gblogger-new-entry and gblogger-edit-entry provide a special command gblogger-publish (bound to C-c C-c) that submits the entry to blogger.
  • Deleting Command gblogger-delete-entry deletes an entry specified by its edit url.

1.5 Google Calendar gcal

This client can be used to view, add or delete events from the Google Calendar for the authenticated user. It uses value of customization option g-user-email by default; this can be overridden via option gcal-user-email. Commands that display calendar items optionally accept the feed url of the calendar to view; this can be used to view calendars to which the authenticated user has read access. See GData Calendar API for the underlying APIs used.

  • View Command gcal-calendar-agenda displays the default calendar for the authenticated user. A prefix arg prompts for the calendar to display. This command is best used from inside the Emacs calendar; in this case, it uses the date under point when showing the agenda.
  • Add Command gcal-add-event prompts for event details and adds it to the calendar.
  • Accept Command gcal-accept-event accepts an event. Event is specified using the edit url of the event.
  • Delete Command gcal-delete-event deletes an event. Event is specified using the edit url of the event.

1.6 Google Reader greader

This client allows the authenticated user to read, browse and subscribe/unsubscribe to feeds. It uses value of customization option g-user-email by default; this can be overridden via option g-user-email.

  • Reading Command greader-reading-list displays the reading list (river of news).
  • Browsing Command greader-feed-list displays a browsable Web page with pointers to subscribed feeds.
  • Finding Command greader-find-feeds searches for matching feeds to subscribe.
  • Subscribing Commands greader-subscribe-feed and greader-unsubscribe-feed are used to subscribe and unsubscribe.
  • Labeling Command greader-star and greader-add-label are used to label articles.
  • Reading Starred articles can be read by providing a prefix argument to command greader-reading-list. Thus, C-u M-x greader-reading-list will prompt for the specific set of articles to retrieve.

Author: T.V Raman <raman@cs.cornell.edu>>

Date: 2007/03/02 10:36:07

Monday, February 12, 2007

Emacspeak Downloads On GoogleCode

I've now made all Emacspeak releases available from the download area on Googlecode. Going forward, all Emacspeak releases will be made at the GoogleCode site --- not SourceForge. This is because uploading code to GoogleCode is significantly easier than making releases on SourceForge.

But even more importantly, once uploaded, grabbing a release from GoogleCode is significantly easier than on SourceForge's release mechanisms. You can always find a link to the latest releases from Emacspeak on GoogleCode by starting from the Emacspeak GoogleCode page. Follow the link labeled Featured Downloads to download the newest release. I've also made all past releases from the download area --- follow the link labeled downloads on the Emacspeak GoogleCode page.

Here is a brief summary of why I chose to start making releases on GoogleCode, it can be viewed as a short summary of the positives in making the switch.

  • GoogleCode makes it possible to create download URLs that can be bookmarked. No more clicking through multiple pages before getting to the file you want, you can simply point wget, curl or your favorite download tool at a meaningful URL. For instance, here is a pointer to Emacspeak 25 release.
  • The above is more than a convenience --- it's in line with good Web architecture. I've been looking for an alternative to SourceForge ever since that site decided to turn meaningful download URLs from the past into obfuscated pointers into their content management system; this left me with a feeling of having created Open Source Software only to have it locked away in someone else's vault with no easy mechanism for end-users to retrieve what had been released as free software.

Share And Enjoy --- and let's hope we never have download sites that say Glad to be of service as they close behind you with a sigh of a job well done.

Friday, December 22, 2006

IBM Software TTS On Ubuntu 6

I had earlier reported the IBM TTS engine segfaulting on my home Ubuntu 6 machine; I'm still to fix that problem. Surprizingly though, I tried it on a different Ubuntu 6 machine, and there, installing

sudo apt-get install libstdc++2.10-glibc2.2
on top of the regular Ubuntu install was enough to get the TTS working. The segfault on my home machine occurs inside libc, and as best I can tell the two machines have identical libc installs. So on the positive front, it's only my home machine that appears broken; on the negative side, the fact that the breakage is hard to explain and hence fix doesn't inspire confidence in upgrading. Others have reported not having any problems on Edgy -- so the problem is hopefully transitory.

Thursday, December 14, 2006

Web Command Line Tool For Google Patent Search

From the every new Google search tool gets a corresponding Emacspeak wizard dept:

Google just introduced Patent Search an easy to use search interface for US patents. In the spirit of the Web Command Line, Emacspeak now sports a Patent Search From Google smart URL like other smart URLs on the Emacspeak Audio Desktop, this places executing patent searches just a few keystrokes away. To use this new wizard, do the following:

  • Update your working copy of Emacspeak from SVN. The patent search wizard will be part of the next official Emacspeak release slated for May 2007.
  • Invoke the Smart URL tool by pressing C-e u
  • Type the first few characters of the phrase patent search from Google and hit tab to complete the name of the smart URL.
  • Hit enter, specify what you're searching for and hit enter again.

happy inventing ---

Friday, November 24, 2006

Emacspeak 25.0 (ActiveDog) Unleashed

I released Emacspeak 25.0 (ActiveDog) yesterday. Here are the release notes.

While trying to release it on Sourceforge I ran into a couple of show-stoppers --- first off the SourceForge download mechanism has changed yet again and it's now gotten sufficiently convoluted that software released via SourceForge's file release system is becoming well-nigh impossible to download except for the most motivated user. Worse, as I released the file, upload services on SourceForge hung, with a consequence that it created a 0 sized emacspeak-25.tar.bz2 file --- the SourceForge mechanism made it well-nigh impossible to clean up the 0-sized file.

Given this mess, I decided to keep things simple by placing the release on the Emacspeak site directly -- this suffers from the disadvantage of the release not getting mirrored on the various Sourceforge download archives; it has the advantage of allowing users to grab the release with one click.

The other thing to note about this release is that there are no RPMs built --- a first in 7 years. I've now switched to Ubuntu on my home machine and dont have the ability to build RPMs so I'll leave this to individual distributions. I've also not built Debian packages this time around, mostly because I've not gotten around to understanding Debian's packaging system sufficiently well to do this. Moreover I prefer minimalistic packaging solutions --- and in general though Debian's packaging is nice, it still feels a little too heavy-weight for something like the Emacspeak source tarball which needs a simple make; sudo make install to get set up. So for now, I'll rely on folks like Jim Van Zandt to build downstream Debian packages for incorporating with the various distributions like Debian and Ubuntu --- this way, packages can be built to match particular distributions.

Thursday, October 05, 2006

Emacspeak Smart URL For Google Code Search

Every useful Web tool deserves a Web short-cut. Google just announced a new service called Code Search that lets you search the codebases of Open Source projects. It's a great way of finding source code relevant to ones programming projects.

I just checked in a corresponding URL Template --- as a reminder, url templates in Emacspeak are smart URLs that provide web short-cuts to create a conceptual Smart Web Command Line. To use:

  • Invoke the url templatetool via the default key-binding C-e u.
  • Select the Code Search Via Google tool by typing cod and pressing the tab key.
  • Specify the search query --- see the Google Code Search help instructions for the types of queries that are allowed.

Thursday, September 28, 2006

Using Helix Player From Emacspeak

In the spirit of You can never have sufficiently many media players, I now have Helix Player working under Emacspeak i.e., I can now run Helix Player without having to start up X. This is useful because there are still media streams on the Web that sometimes fail with mplayer, and from the minimal testing I've done so far, Helix Player is successful in those cases.

What Is It?

HelixPlayer --- installable on modern Linux distributions as hxplay from package HelixPlayer is the community-supported version of RealPlayer 10. The well-distributed and documented client, hxplay is capable of playing a wide variety of audio and video formats over HTTP and RTSP/RTP, and specifically, can handle RealPlayer10 formats which includes support for 5.1 audio.

A lesser known set of tools available from Helix --- Helix DNA Client is a bare-bones UI-less player which can be used effectively at the shell. You can download pre-built binaries for your flavor of Linux (GCC3.2 or later vs GCC 2.95 based systems) note that these are nightly builds. You can also download a source zip archive. Note that all of these requires you to accept a End Users License Agreement (EULA) before being taken to the download link.

The links on the page above can be confusing; Here are pointers to the specific packages you need to grab if you want a player that has all of the functionality described above.

Binary
Sep 26, 2006 build for Linux GCC 3.2
Sources
Source archive from September 27, 2006

Using The Binary Distribution

Here is what I did you set up the binary distribution on my Ubuntu 6.0.6 (Dapper) machine

  • Unpacked binary package under /usr/lib.
  • Created a symlink /usr/lib/splay to point to the directory created by unpacking the binary package.
  • Created the following shell script /usr/bin/hsplay to launch the player:
    #!/bin/sh
    #Use Simple Helix Player:
    #
    SPLAY_LIB=/usr/lib/splay
    export HELIX_LIBS=$SPLAY_LIB
    exec /usr/bin/aoss $SPLAY_LIB/splay -iss -s "$@"
    
  • The above script assumes you have the alsa-oss package nstalled; you will need this to have Helix Player use ALSA --- something that is essential if you want to be able to use your sound card with other applications while playing media streams.

With this setup, you can launch one or more media streams (both local, as well as remote HTTP/RTSP/RTP streams) from a shell. This player successfully plays the BBC Radio4 LW stream, something mplayer fails to play on my Ubuntu box.

Tuesday, September 12, 2006

Emacspeak, Ubuntu And Software Dectalk

On the positive side with respect to software synthesis, the Software Dectalk does work out of the box on Ubuntu --- out of the box that is if you first install alsa-oss the ALSA->OSS compatibility layer. I've updated the Emacspeak speech server for Software Dectalk to use alsa-oss where available; performance is not as responsive as the Emacspeak Viavoice server using the native ALSA APIs, but it's a good backup option.

Monday, September 11, 2006

Emacspeak 24 On Ubuntu 6

I upgraded my home FC3 machine to Ubuntu 6.0.6 (Dapper) over the weekend. Here is a short summary for things to watch out for as an emacspeak user.

The Good, The Bad, And The Painful

Good
One of my friends helped with the install and it is remarkably quick when everything works (in my case the Ubuntu LTS 6.0.6 installer had trouble with the NVidea display card and came up correctly at the third attempt).
Bad
A one CD install is nice -- but after it you have remarkably little installed from the perspective of an emacspeak user. You end up with a very nice GUI but very little else --- the reasoning being that the average user wont need much more, and the savvy user can always run apt-get.
Bad
Worse, Ubuntu does not install openssh-server --- it limits itself to installing openssh-client. This means that you cannot bootstrap yourself by logging in from another machine until you install openssh-server off the network. If there was one thing I would ask the Ubuntu maintainers, it would be to rectify this situation.
Painful
In my case, the apt suite of tools appeared to have a problem --- they died saying /var/lib/dpkg/available: no such file or directory. Googling showed this to be a known problem with apt and the fix is to run dselect update -- but if you're new to Debian/ubuntu, this is less than obvious.
Good
Once you overcome the above, apt-get got me emacspeak-17.0 which was sufficient to let me bootstrap the rest of the process on my own using my trusted Dectalk Express to produce speech.
Painful
Note that you should install tcl8.3 and tclx8.3 --- rather than the newest (8.4) versions of these packages. This is because as of 8.4, the maintainers of those packages no longer build a stand-alone tcl (extended TCL) shell. This is something that will have to be handled by Emacspeak in the future.
Good
I was able to get everything I needed (and more) installed using a combination of apt-get and aptitude.
Bad
The IBM TTS engine no longer works --- under FC3 and friends, you needed to install package libstdc++-compat to get it to work. Well, there is no corresponding package for Ubuntu/Debian from what I could find out, and pulling in the RPM for libstdc++-compat, converting it via alien and installing the result produces a segfault when you run the TTS engine.
Bad
For the same reason, the old command-line trplayer will also not work on Ubuntu 6.0. This is not as painful --- since mplayer works --- though I had to build mplayer from source. It would be nice to create a command-line player on top of the HelixPlayer code base. At present, the missing trplayer means that the etc/rivo.pl provided by emacspeak no longer works. You can use mplayer to convert realaudio to mp3; however mplayerdoes not have a command-line option to specify the duration of playback, something that script etc/rivo.pl needs.

Thursday, September 07, 2006

Google Archive News Search

To mark the arrival of Google News Archive search, I checked in a Archive News Search url-template yesterday morning. To use it, hit C-e u followed by arc tab and specify your search term.

The above is checked into the SVN repository at Emacspeak GoogleCode.

Friday, August 25, 2006

Update: Emacspeak On Google Code Hosting

The initial experiment of moving emacspeak development to Subversion at Google Code Hosting has been largely successful. After a few bumps along the road, mostly a consequence of my being new to SVN, things are looking good, and I have stopped updating the CVS repository on SourceForge.

Some additional goodies as a consequence of the move to SVN:

  • SVN Tags contains snapshots of prior releases.
  • Future releases will come with an SVN Revision number that allows one to reliably recreate a released version.

Sunday, August 13, 2006

Emacspeak Codebase Via Subversion From GoogleCode

I've checked in the Emacspeak codebase into the Subversion repository provided by Google Project Hosting . The project page is Emacspeak at GoogleCode. You can find Emacspeak --- complete with its code history going back to the point where I started using CVS at Emacspeak SVN Repository.

For now, the Emacspeak Web site will continue to live at Sourceforge; The Emacspeak mailing list will continue to live at Vassar as before. To checkout the code from SVN, follow the instructions on Emacspeak SVN. If you run into any hitches in checking out the code, please report it on the Emacspeak mailing list. Note that you can anonymous checkout the code from the above location entirely from the shell command-line without ever having to point a browser at anything.

Emacspeak users presently running out of SourceForge CVS might want to do an SVN checkout in a separate directory and make sure things work, in preparation for a permanent switch-over to svn. Here are the minimal steps you need to perform:

  • svn checkout http://emacspeak.googlecode.com/svn/trunk/ emacspeak
  • The above will create a directory called emacspeak with the code under it; obviously, you should do this somewhere different from where you have your current copy of emacspeak.
  • For now, I recommend renaming the directory created in the above step to svn-emacspeak so that you can easily tell which snapshot you're looking at.

Note that reading these is not a replacement for learning about SVN --- there is an excellent on-line book available at SVN Manual.

Thursday, August 10, 2006

Zipping Through Web Pages

Zipping Through Web Pages With Emacspeak/W3

I just added an experimental zip through Web pages shortcut to emacspeak-w3. The command is called emacspeak-w3-speak-next-block and is bound to z in all W3 buffers. It is useful for quickly moving through Web pages that have logically separate content units in separate blocks where a block is one of:

  • HTML div.
  • HTML tables.
  • HTML p elements.

In general this provides an effective means of skimming many large Web pages.

Sunday, July 23, 2006

Summary Of Emacspeak Features Compared To Other Alternatives

Introduction

I've received a number of queries asking about the differences between Emacspeak and Speechdel ---especially given some of the somewhat confusing assertions made in recent Speechdel release announcements. I'm posting this article in the hope of clearing up some of this confusion.

1 Emacspeak And Speechdel -*- mode:org -*-

1.1 Background

Emacspeak speech-enables Emacs by advising core emacs functionality. Speech services are provided by a simple Emacspeak speech-server. Additionally, Emacspeak implements speech-extensions for popular emacs modules --- see the speech-enabled applications list.

Emacspeak was first released in 1995, and then (as now), there was limited speech access to the Linux GUI. Therefore, to be useful as a complete access solution, Emacspeak has always needed to enable the user to do everything from within Emacs, not just regular editing operations. As a case in point, emacspeak users are probably one of the last remaining communities that use Emacs for browsing the Web.

1.2 Speech Dispatcher (SpeechD)

The idea of SpeechD --- peech Dispatcher as an intermediate layer between speech clients and TTS engines was first floated sometime in the late 90's. Such a common layer is a laudible goal but is something that takes time and effort to get right. Additionally, you have the challenge of geting existing software e.g., emacspeak, to abandon their own speech abstraction and re-implement against a supposedly more generic, but completely untested and untried intermediate layer.

The developers of SpeechD initially incorporated some of the Emacspeak code into an Emacs wrapper (speechdel) that called SpeechD, but later decided to go their own way -- and present speechdel is the result.

Like Emacspeak, speechdel uses Emacs Lisp's advice facility to add spoken feedback to core editing commands; speech output is produced by calling out to speech-dispatcher.

The summary of feature differences between Emacspeak and speechdel in the next section is from examining the speechdel code-base; I have not run speechdel since its dependency chain resulting from speechd was difficult to resolve on my FC3 64bit machine.

1.3 Emacspeak Features Not Found In SpeechDel

  1. Emacspeak implements Aural CSS ACSS, and uses it to provides the aural analog of font-lock.
  2. Emacspeak provides pronunciation dictionaries. Pronunciations can be defined on a per-mode, per-buffer or per-directory basis. Directory and mode specific pronunciations are persisted across sessions. This allows Emacspeak to leverage Emacs' intelligence about the semantics of a given application; thus, you can have it say "p arrow x" for "p->x" when editing C code. Per-directory pronunciations are useful for reading electronic books. Per-buffer pronunciations are useful for succinctly speaking long lines of shell output e.g. when compiling complex software.
  3. By advising core Emacs functionality, Emacs modes work out of the box with Emacspeak. But in most cases, Emacspeak goes one step further by providing light-weight speech-modules that specialize spoken output for a given mode. As an example, advising next-line to speak the current line is sufficient to use dired-mode --- but having to listen to the entire line of dired output is not a pleasant experience. The dired-specific module in Emacspeak advises all interactive dired commands to speak the "right" information. As an another example, GUD interaction automatically speaks the line of source-code without leaving the Gud buffer.
  4. Emacspeak comes with many "Emacs Applets" for performing tasks that most users would perform outside of Emacs. Examples include playing CDs, playing multimedia streams etc. Fortunately, I have not had to write too many of these since there are always Emacs users other than myself who also create such Emacs applications --- so where Emacs applications already exist, I merely speech-enable them with a small set of advice definitions, and in some cases add a few additional interactive commands.
  5. Emacs applications are plentiful for most tasks; one exception is the Web. Since emacs/w3 development was abandoned sometime around 1998, I have added significant Web interaction functionality to Emacspeak using Emacs/W3 as the basis. Today, a lot of this has also been ported to Emacs/W3M thanks to other enthusiasts on the Emacspeak mailing list. Examples include:
    1. WebSearch module --- prompts for query and processes response to focus on the results.
    2. XSLT pre-processing: Allows pre-processing of complex pages before rendering via W3. Used to enable smart screen-scrapers using XPath.
    3. URL-Tempaltes: Originally motivated by webjump.el, this provides url templates that enable easy access to a variety of Web tasks rangig from looking up flight times to listening to your favorite NPR or BBc show. Think early cut at a "Web Command Line in the minibuffer".
  6. Customization via Custom, including additional keymaps. Comes with additional keymap files for the Linux console to enable hyper, super, and alt prefix keymaps.
  7. Module emacspeak-wizards iplements a large collection of Emacs wizards that enable common tasks that you would otherwise perform at the shell e.g., checking display status on a laptop. The additional prefix keymaps come in handy!
8)Finally, note that all modules (except the core) are loaded on demand.All code is compiled with byte-compile-dynamic set to =T= and individual application-specific modules are kept completely independent of one another. Given the size of the Emacspeak codebase, this is a pre-requisite for both efficiency and developer sanity.

Author: TV Raman <raman@users.sf.net>

Thursday, July 20, 2006

Emacspeak And Accessible Search Via Google

Google has released an early experiment that favours easy to read Web content --- checkout the relevant Blog post here. Emacspeak has always had a set of Google Websearch tools --- and this set has now been enhanced with a shortcut to Accessible Search. Below, I'll summarize the set of Google Websearch tools in Emacspeak.

All Emacspeak Websearch tools are reached via the key-sequence C-e?. Specific search tools are selected by single-letter keystrokes following C-e? --- I'll enumerate some of these below.

i
Accessible Search --- Google Web Search that favors accessible content.
g
Vanila Google Search.
space
Google I'm Feeling Lucky --- takes you directly to the first search hit.
n
Google News Search.
e
EmapSpeak Via Google Maps.
u
Google Usenet Search.

Note that in addition, module emacspeak-url-template provides a number of Google tools as smart URLs.

Friday, June 23, 2006

ALSA And Emacspeak: Closing The Legacy Loop With ALSA-OSS

And now, with ALSA working well with software TTS and cooperating with ALSA_aware streaming applications such as mplayer it's time to close the legacy loop for those few applications that still have the old OSS API hard-wired.

One such useful application is trplayer --- the command-line real player that has not been updated in over 4 years. For the most part, the functionality provided by trplayer is subsumed by the newer --- and actively maintained --- mplayer but it's still useful to have trplayer for times when mplayer hits gliches with slow-responding RTSP streams.

The ALSA way of handling such legacy applications is through the ALSA OSS emulation layer; Emacspeak now contains a script etc/atrplayer that invokes trplayer via aoss. Incidentally for the more observant Emacspeak user running out of CVS, script atrplayer is not new; it has been around for about a year, but until now it used command vsound to stream the converted audio to command aplay. I needed to do this until ALSA 1.0.11 since trplayer used to fail sporadically if run through the AOSS emulation layer. But those problems now seem to be in the past with the upgrade to ALSA 1.0.11. As usual with cutting edge technology like ALSA, your mileage with all of this will vary; so let me end with the usual disclaimer --- if it breaks, you get to keep both pieces.

Monday, June 19, 2006

SpeakFreely, Software TTS And ALSA

In ALSA and ASYM I mentioned that speakfreely appeared to have stopped working. As it turns out, this had nothing to do with the switch to ASYM. I believe that in the past I had run speakfreely by first killing software TTS --- since by default speakfreely uses OSS.

Getting speakfreely working with ALSA without losing software TTS required the following steps;

  1. Retrieve the latest tarball speak_freely-7.6a.tar.gz
  2. Uncomment the ALSA specific line in its Makefile
  3. In file audio_alsa.c, change the default audio device from plughw:0,0 to default. Without this change, speakfreely will try to access the sound card directly; setting it to default on line 41:
    char *devAudioOutput = "default";
    
    matches things up with the pcm.default that was configured in the .asoundrc.

With this, you can now talk using speakfreely and continue to use software TTS.

Tuesday, June 06, 2006

Emacspeak, TTS, Alsa And ASYM

This is a continuation of the earlier thread about using ALSA for software TTS using DMix --- see ASoundrc And Emacspeak.

I've now updated the CVS version of ASoundRC to use the ASYM plugin for the default ALSA device. The ASYM plugin allows you to configure both the playback and capture device, which removes the annoyance of having to specify an ALSA device when calling arecord --- as used to be the case when using DMIX in the pcm.default device.

Possible Caveats: I am having trouble getting speakfreely to work reliably --- I've used it with ALSA in the past --- though I'm not sure if the ASYM plugin is the culprit.

Monday, May 22, 2006

ASoundrc Parameters For Reliably Using ALSA Powered Software TTS

Advanced Linux Sound Architecture ALSA is a boon for software TTS users --- you can now use your soundcard to produce spoken output while not losing audio output from other applications such as music players and streaming radio stations.

Emacspeak implements an ALSA-enabled TTS server for the IBM ViaVoice engine --- using this server effectively requires appropriately tuning the parameters in the user's asoundrc file to:

  • Enable the DMix plugin to enable software mixing of multiple channels of audio.
  • To configure the various parameters ALSA itself uses.

Depending on how well your sound-card is supported by ALSA, the above can be either trivially simple or a tedious process of trial and error. I'm writing this up to:

  • Collect a list of sound cards on which the asoundrc provided with Emacspeak works as expected.
  • In the hope that the wider ALSA community discovers and helps flesh out this material; my hope is that the ALSA community has more insight into how these settings work.

For the above, works effectively means the following:

  • The TTS engine speaks without perceptible stuttering or other audio artifacts.
  • The engine is responsive with respect to starting and stopping speech; especially when typing fast at high speech rates.
  • The TTS engine does not interfere with other alsa-enabled applications, e.g. mplayer.

At the end of this entry, you can find the relevant section from the asoundrc file from the Emacspeak distribution, with comments indicating which sound cards perform well. An example of a card that does not work well with these settings is the Audigy-LS from Creative; the TTS engine works on that card, but performs degrades:

  • mplayer cannot use the audio device; (aplay and mpg321 are able to share the card with the TTS engine.)
  • Speech does not stop immediately as on the soundcards enumerated in the asoundrc file.
  Id: asoundrc,v 1.3 2006/05/23 00:22:16 raman Exp $
#these numbers work on the following:
# aplay -l | head 1
# I82801DBICH4 [Intel 82801DB-ICH4] (IBM Thinkpads)
# ICH6 [Intel ICH6],

#  default device is a mixer

pcm.!default {
    type plug
    slave.pcm "dmixer"
}

pcm.dmixer  {
    type dmix
    ipc_key 1024
    slave {
        pcm "hw:0,0"
        format s16_LE
        period_time 0
        period_size 1024
        buffer_size 4096
        rate 44100
    }
    bindings {
        0 0
        1 1
    }
}

Wednesday, May 03, 2006

Listening To The Web Through A Mobile Lens

The similarities between Web access issues faced by mobile users and those confronting eyes-free Web browsing are striking, and these similarities have often been used to advocate the creation of well-structured, accessible Web content. As an example of mobile-friendly content being a blessing for eyes-free spoken access to WebFormation, Emacspeak provides a mobile lens via the Google Mobile transcoder.

Here are a few convenient means of using the above within the Emacspeak Audio Desktop:

  • While browsing the Web using w3, press t on a link (command: emacspeak-w3-transcode-via-google) to view that link through the mobile transcoder.
  • Note that all links in the resulting mobile view automatically go through the transcoder.
  • To undo the effect of automatically viewing links in the mobile view through the transcoder, use t with a interactive prefix argument i.e., press C-u t to follow a link to view it in its original form.
  • Additionally, I bind command emacspeak-wizards-google-transcode to a convenient key so that I can launch Web sites using the mobile view.

I use this tool on a regular basis while commuting to work to browse mainstream news sites, it provides speech-friendly content that has the added benefit of downloading fast over a wireless link --- after all, this is Mobile content.

Tuesday, May 02, 2006

Announcing Emacspeak 24.0 (LiveDog)

For Immediate Release

San Jose, CA, (May 3, 2006)
Emacspeak-Alive: --- Bringing Live Access For Enlightened Users
--Zero cost of ownership makes priceless software affordable!

Major Enhancements

  1. emacspeak-muse: Speech-enabled Muse Mode
  2. emacspeak-ruby: Speech-enabled Ruby Mode
  3. emacspeak-m-player: Updated for new MPlayer
  4. emacspeak-sudoku.el: Speech-enabled SuDoKu
  5. New Option: tts-strip-octals
  6. emacspeak-keymap.el Updated keybindings
  7. lisp/atom-blogger.el Light-weight blogging tool
  8. emacspeak-atom-blogger: Speech-enables above
  9. voice-setup.el Custom support
  10. Multispeech related patches
  11. User contributed patches

Friday, March 10, 2006

W3: Minor Patch To Handle Content-Type application/xhtml+xml

Here is a minor patch to w3.el to allow it to handle content-type application/xhtml+xml. For all practical purposes (at least as far as W3 is concerned), this can be handled by the html parser/renderer; however since that content-type did not exist at the time W3 was written, it offers to download/save documents of that type. The attached patch fixes this, and also adds a fix to a minor irritant with decoding of multimedia attachments.

Index: w3.el
===================================================================
RCS file: /cvsroot/w3/w3/lisp/w3.el,v
retrieving revision 1.32
diff -b -c -r1.32 w3.el
*** w3.el	12 Jan 2003 22:10:25 -0000	1.32
--- w3.el	11 Mar 2006 02:24:52 -0000
***************
*** 34,39 ****
--- 34,40 ----
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  (require 'w3-sysdp)
+ (eval-when-compile (require 'mm-decode))
  (require 'w3-cfg)
  
  (or (featurep 'efs)
***************
*** 325,331 ****
  				  (mm-handle-media-type handle)))))
        ;; Fixme: can handle be null?
        (cond
!        ((equal (mm-handle-media-type handle) "text/html")
  	;; Special case text/html if it comes through w3-fetch
  	(set-buffer (generate-new-buffer " *w3-html*"))
  	(mm-disable-multibyte)
--- 326,333 ----
  				  (mm-handle-media-type handle)))))
        ;; Fixme: can handle be null?
        (cond
!        ((or (equal (mm-handle-media-type handle) "application/xhtml+xml")
!          (equal (mm-handle-media-type handle) "text/html"))
  	;; Special case text/html if it comes through w3-fetch
  	(set-buffer (generate-new-buffer " *w3-html*"))
  	(mm-disable-multibyte)

Wednesday, March 08, 2006

Blogging From Emacs: Additional Atom-Blogger Documentation

Thanks to Jason Dunsmore for writing up some additional step-by-step documentation on using atom-blogger.

Thursday, February 23, 2006

Emacspeak: Connecting Lynx And W3

Emacs/W3 is still the best Web page rendering option inside Emacspeak given the ability to apply XSL transforms, as well as obtaining aural styling via ACSS. However W3's url handling layer often breaks when faced with multiple redirects, especially when some of these happen through the Host: HTTP header. Additionally, HTTPS authentication sometimes fails mysteriously in the presence of redirects.

In many of these cases, lynx happily fetches the pages correctly; however you're then stuck using a fairly weak auditory interface in that Emacspeak degrades to being aterminal level screenreader.

An effective solution to this problem is to use lynx within an Emacs terminal, and after finding the content that is worth reading, handing off that content to Emacs/W3. The next few paragraphs show how.

The lynx-site.cfg File

This is where you add site-specific configurations. Here are the lines I have in my lynx-site.cfg to integrate lynx and Emacs. Before you use any of this, make sure you have executed M-x server-start in your running Emacs, and make sure that all is well by experimenting with emacsclient to ensure that external programs can hand-off editting tasks to the currently running Emacs.

#site defaults
#for bookshare:
DOWNLOADER:BKS Unpack:bks.pl  %s %s:TRUE 
PRINTER:Edit:emacsclient %s:TRUE
KEYMAP:???:EDITTEXTAREA	# use external editor to edit a form textarea
PRETTYSRC:TRUE
SOURCE_CACHE:MEMORY
SAVE_SPACE:~/.wget/
BOLD_HEADERS:TRUE
PRINTER:W3:emacsclient -e '(w3-open-local "%s")':TRUE

Below, I'll describe what each of the above lines do:

  • DOWNLOADER:BKS Unpack:bks.pl %s %s:TRUE
    The above line creates an additional item in the download menu that invokes the BookShare unpacker. Script bks-unpack.pl invokes the BookShare unpack tool with the appropriate options.
  • PRINTER:Edit:emacsclient %s:TRUE
    This creates an Edit item in the print menu. Invoking this menu item causes the current page to be handed off to Emacs for editting. If you want to edit the source, first switch to source view by hitting \ before invoking print.
  • KEYMAP:???:EDITTEXTAREA # use external editor to edit a form textarea
    This sets lynx up so that when editting a multiline textarea, you can hand off the editting job to Emacs. This is particularly useful for editting Wiki pages. Replace the ?? with the desired key sequence.
  • PRETTYSRC:TRUE
    SOURCE_CACHE:MEMORY

    The above two settings make the edit source functionality more pleasant to use.
  • PRINTER:W3:emacsclient -e '(w3-open-local "%s")':TRUE
    The above creates a W3 menu item in the print menu. Invoking this causes Emacs/W3 to display the current page --- again switch to source view before invoking this so that Emacs/W3 gets handed the HTML markup.

Script bks-unpack.pl

#!/usr/bin/perl -w
#$Id: bks.pl,v 1.1 2003/07/04 15:41:55 tvraman Exp tvraman $
#Description: Bookshare downloader for Lynx
use strict;
my $location="$ENV{HOME}/books/book-share";
my $password = 'xxxxxxx';
my $grabbed = shift;
my $target = shift;
my $dir =qx(basename $target .bks);
chomp $dir;
my $where = "$location/$dir";
qx(mkdir -p $where);
qx(mv $grabbed  $where/$target);
chdir $where;
qx(echo $password | bks-unpack -q $target 1>&- 2>&- &);

Tuesday, February 21, 2006

Emacspeak, SuDoKu And History

Here is a small enhancement to playing SuDoKu in Emacspeak. The feature is probably generally useful i.e., it's not specific to eyes-free interaction, but its presence encourages one to try different solution strategies.

Commands emacspeak-sudoku-history-push bound to m and emacspeak-sudoku-history-pop bound to M allow one to mark interesting states in the game and return to these prior states with a single keystroke. This means that when one is confronted with one of two choices, with no apparent additional information on which route to take, it becomes possible to push that state on to the history stack, try one of the alternatives and backtrack if necessary.

Monday, February 20, 2006

Emacspeak And Voice Locking Using Aural CSS

This is slightly reformatted from what was posted to the Emacspeak mailing list as separate message.

  1. Emacspeak defines a number of voice overlays such as voice-bolden, and voice-lighten that can be applied to a given voice to change what it sounds like.
  2. Voice overlays are defined in terms of Aural CSS (ACSS) to keep them independent of a specific TTS engine.
  3. For each such overlay there is a corresponding <overlay-name>-settings variable that can be customized via custom.
  4. The numbers in voice-bolden-settings as an example:
Setting Value
family nil
average-pitch 1
pitch-range 6
stress 6
richness nil
punctuation nil
Unset values (nil) show up as "unspecified" in the customize interface.
  1. Do not directly customize voice-bolden and friends, instead customize the corresponding voice-bolden-settings, since that ensures that all voices that are defined in terms of voice-bolden get correctly updated.
  2. Discovering what to customize:

Command emacspeak-show-personality-at-point (bound by default to C-e M-v) will show you the value of properties personality and face at point. A recent update I implemented last weekend makes this more useful, so make sure you do a CVS update; earlier this command used to display the ACSS setting --- now it displays the abstract name. Describe-variable on these names should tell you what to customize; so as an example:

Put point on a comment line, and hit C-e M-v: you will hear

Personality emacspeak-voice-lock-comment-personality
Face font-lock-comment-delimiter-face

Describe-variable of emacspeak-voice-lock-comment-personality gives:

emacspeak-voice-lock-comment-personality's value is acss-p0-s0-all

Documentation:
Personality used for font-lock-comment-face
This personality uses  voice-monotone whose  effect can be changed globally by customizing voice-monotone-settings.

How It All Works

Here is a brief explanation of the connection between voice-bolden and its associated voice-bolden-settings.

  1. Voice settings are initially in voice-bolden-settings which is a list of numbers.
  2. That list of numbers needs to be translated to appropriate device-specific codes to send to the TTS engine.
  3. You do not want to do this translation each time you speak something.
  4. So when voice-bolden is defined, the definition happens in two steps:
  • The list of settings is stored away in voice-bolden-settings,
  • A corresponding voice-name is generated --- acss-a<n>-p<n>-r<n>-s<n> and the corresponding control codes to send to the device are stored away in a hash-table keyed by the above symbol.
  • Finally, voice-bolden is assigned the above symbol.

What this gives is:

  1. The ability to customize the voice via custom by editting the list of numbers in voice-bolden-settings
  2. When that list is editted, voice-bolden is arranged to be updated automatically.

Other Useful Commands

In addition, commands emacspeak-wizards-generate-voice-sampler can be useful in generating a buffer that shows what the various ACSS settings sound like. Command emacspeak-wizards-voice-sampler can be used to apply a specific voice to a region of text while experimenting with the various settings.

Saturday, February 11, 2006

Playing SuDoKu Using Auditory Feedback

Emacspeak speech-enables SuDoKu implemented by sudoku.el. Speech-enabling games is an effective means of discovering what additions one needs to make to an auditory interface for working effectively in an eyes-free environment --- this was aptly demonstrated a few years ago by identifying interesting conversational gestures by speech-enabling the game of Tetris --- see Conversational Gestures For The Audio Desktop from Assets 1998.

Advicing Interactive Commands

As with speech-enabling any Emacs module, emacspeak-sudoku advices all interactive commands to produce spoken feedback. In addition to speaking the cell moved to, all navigation commands produce an auditory icon that is a function of whether the cell value is mutable --- original values cannot be changed and this is indicated with a distinctive icon.

Additional Interactive Commands

Playing SuDoKu effectively requires one to build a good mental image of the state of the board as well as the ability to effectively query the game for currently active constraints. The eye's ability to quickly move around the board and perceive row, column and sub-square constraints needs to be compensated for in an eyes-free environment. As an example, it is too difficult to build the necessary mental model by just listening to the board spoken aloud, or by listening to idnividual cells by navigating to them.

Here are the set of additional interactive commands that needed to be added in order to be able to play the game effectively.

r
Speak current row.
c
Speak current column
s
Speak current sub-square.
R
Speak number of remaining cells in current row.
C
Speak number of remaining cells in current column.
S
Speak number of remaining cells in current sub-square.
d
Move to the sub-square below the current sub-square.
u
Move to the sub-square above the current sub-square.
n
Move to the next sub-square.
p
Move to the previous sub-square.
a
Move to the beginning of current row.
e
Move to the end of the current row.
t
Move to the top of the current column.
b
Move to the bottom of the current column.
,
Speaks information about the overall distribution of numbers on the board.
  • d --- Conveys how many instances of each digit have been filled in.
  • s --- Conveys number of remaining cells in each sub-square.
  • r --- Conveys number of remaining cells in each row.
  • c --- Conveys number of remaining cells in each column.
/
Speaks number of remaining cells in the current board.
.
Speaks value in current cell.

Notes on how invormation is spoken:

  • Numbers are spoken in groups of 3 to achieve effective intonation.
  • When navigating by sub-squares, point always moves to the top left corner of the sub-square.
  • Additional commands bound to M-r, M-c and M-s erase the current row, column or sub-square respectively. These commands would probably be convenient to have independent of whether one is using visual output.

Effectiveness Of The Resulting Interface

With the above interface in place, the simpler levels of the game are a breeze, levels difficult and evil are sufficiently challenging to be fun.

Friday, January 27, 2006

Browsing Sourceforge Download Servers

Sourceforge is a nice service, but it can also be painful to use because of the heavy-weight Web page design, and the need to repeatedly click before you get the download you want.

The most irksome of these is the download mechanism provided by Sourceforge --- where you first need to browse a list of download servers, pick a mirror, and then download what you want. Emacspeak implements a Smart URL that enables one to download from Sourceforge in a single step.

By default, this uses a North American mirror; the behavior can be customized if outside the US. Use smart URL Sourceforge Browse Mirror and specify the name of a SF hosted project when prompted. This brings up the index page for the project's download area, sorted by date. Move to the bottom of the page and hit b to move to the latest available download.

The smart URL sets up the W3 buffer with a context-sensitive download function; when on a download link, hit C-d to start downloading. This command will prompt for the URL; rather than hitting return (which would bring you to the browse mirrors page, hit M-p to get the download URL for your SF mirror. Note that this wizard uses GNU wget to perform the download via Emacs module w3-wget.

BBC Channels On Emacspeak

Since the BBC's various channels are what I listen to the most, launching BBC channels has always been a couple of keystrokes in Emacspeak. As a first step, directory realaudio/radio contains shortcut files for launching live streams from the various BBC channels.

In addition, module emacspeak-url-template defines a number of Smart URLs for single-click access to BBC programs. The ones I use the most are:

  • Smart URL BBC Channels On Demand, and
  • Smart URL BBC Genres On Demand

These smart URLs prompt for the channel or genre respectively and bring up a Web page that lists the various shows that are available --- note that the BBC archives shows for a whole week. The resulting Web page is easy to browse in W3; the most effective way to skim the buffer is to repeatedly hit i which moves through the various items on the page. Hitting e e (that's the letter e twice) while on a hyperlink will launch the corresponding media stream by calling a context-aware command that knows about transforming the URL to one that accesses the program stream; --- note that simply following the hyperlink will get you first to a page about the program, rather than to the program stream itself.

To find out what channels and genres are available, browse the BBC Web site --- channel and genre names are not hard-wired into Emacspeak since these can change over time with channels and genres being added or renamed.

Thursday, January 26, 2006

Emacspeak World Clock For Timezone Travel

Command emacspeak-speak-time bound to C-e t speaks the current time. An additional convenience offered by this keystroke is to get the time at a specified time zone using Emacs' completion facility.

To use this feature, simply precede the keystroke with an interactive prefix arg i.e., use C-u C-e t. This will prompt for the timezone in the minibuffer. Using two C-u C-u will set the default timezone after speaking the time --- a useful way of avoiding jet-lag as you travel.

Sunday, January 22, 2006

Emacspeak Web Wizards: Obtaining Context From The Calendar

Emacspeak implements a number of smart URLs in module emacspeak-url-template.el --- see earlier post on Web Command Line. Many of these smart URLs prompt the user for the date, e.g. you can use smart URL NPR On Demand to play archived NPR shows.

The most intuitive means of specifying a date is of course using a calendar that functions as a date-picker, and Emacs has a very powerful built-in calendar. Emacspeak ties these two together by arranging for commands that prompt for a date to use the current date in the Emacs Calendar as the default. So the easiest way to play NPR Morning Edition for Monday, January 2, 2006 is to do the following:

  • Switch to the Emacs Calendar and move to the desired date Monday January 2, 2006 by pressing gd.
  • Invoke the NPR On Demand smart URL by pressing C-e u RET NPR RET
  • Specify the program code for Morning Edition by pressing me RET
  • Hit enter to pick the default date that is offered in the minibuffer.
  • Sit back and listen ...

Tuesday, January 17, 2006

Viewing Atom Feeds Within Emacspeak

The most effective way of viewing Atom Feeds in Emacspeak is to use command emacspeak-atom-display and specifying the URL of the feed when prompted. Thus, M-x emacspeak-atom-display RET http://emacspeak.blogspot.com/atom.xml displays a Web page generated from the Emacspeak Blog.

Notice the following in the generated Web page:

  • It starts with a navigable table of contents.
  • Each Blog entry has a link labeled edit next to it.
  • Each Blog entry ends with a link labeled Bookmark.
  • There is a link labeled Post at the top of the page.

The above links help you easily create and edit posts to the Blog if you have write access using commands provided by module atom-blogger. Eventually, I may add commands to these hyperlinks to automatically invoke the appropriate command from atom-blogger; for now, I find it sufficiently convenient to copy the URL under point to the kill-ring and later yank it back into the minibuffer when prompted by atom-blogger.

Finally, note that this and subsequent posts to this Blog will show up automatically on the Emacspeak Mailing List at Vassar.

Viewing Formatted Source Code In Emacs/W3

While reading online texts on programming in Python and Ruby, I noticed that Emacspeak was not announcing indented lines in preformatted source-code examples, even with audio indentation turned on. The reason is that many of these texts use an HTML non-breaking space for indentation, and though W3 was rendering these correctly, the default syntax table in W3 had not defined the resulting octal 240 to be of class white-space. Consequently, Emacspeak's audio indentation code was not treating the non-breaking space as white space.

I've checked in a patch to emacspeak-w3.el that modifies the syntax table in w3-mode by adding the appropriate lines to w3-mode-hook.

Saturday, January 14, 2006

Speech-Enabled ATOM-Blogger

Module atom-blogger is a light-weight Emacs client for creating or editting blogger posts using ATOM. Emacspeak bundles atom-blogger and speech-enables it via module emacspeak-atom-blogger.

Module emacspeak-setup.el has been updated to set up the Emacs' load-path to locate package atom-blogger, so if correctly installed, Emacspeak users should be able to launch and use atom-blogger with no further configuration.

Thursday, January 12, 2006

Emacspeak And Ruby

Emacspeak now speech-enables ruby-mode to support developing Web applications using Ruby On Rails. I presently use nxml-mode for editing the .rhtml files, but am looking for an alternative to using multi-mode or its variants when editing the embedded Ruby code. Sadly, one has to turn off nxml-mode's validity checking while editing .rhtml files --- otherwise it complains about the <% directives.

Monday, January 02, 2006

Emacspeak Wizard: Recording Audio Streams For Later Playback

Emacspeak includes a large collection of wizards implemented in module emacspeak-wizards.el One of these ---emacspeak-wizrds-rivo works hand-in-hand with script etc/rivo.pl to provide a simple record for later playback facility that can be used to record live realaudio streams for future playback. This is useful for listening to live broadcasts at a more convenient time.

Wizard emacspeak-wizrds-rivo prompts for the time at which to record, the length of the recording, the stream to record, and the location in which the recording is to be stored. It then uses command trplayer (text-mode RealPlayer) with command vsound to capture the audio stream, and converts the result to MP3 using command lame. ToDo: With mplayer now able to play RealAudio streams, the etc/rivo.pl script should be updated to use mplayer since this will :

  • Remove the vsound dependency.
  • Enable us to record more than just RealAudio streams.