Sunday, March 14, 2010

Read Clipboard in Ubuntu

If your like me lazy in reading stuff then TTS like espeak, festival is perfect. For me it doesn't matter if it speaks like computer but as long as someone thing can read it for me its perfect. So in this journey i had made 2 scripts that could help you. This was testing in Ubuntu 9.04 with python, espeak and metacity as default.

First, create a python script or download this file, please rename the file to your folder of choice, for our example we would use /home/almondmendoza/clipboard/getClipboardContents.py
import gtk
clip = gtk.clipboard_get(selection='PRIMARY')
print clip.wait_for_text()


The previous script would get our clipboard, now to speak it we would use espeak coz its build in by default, we would have to created a shell script or download this (this change voice to en-r and speed to 200), please rename the file, for our example /home/almondmendoza/clipboard/speakClipboard.sh
#!/bin/sh
word=`/usr/bin/python /home/almondmendoza/clipboard/getClipboardContents.py`
espeak ". $word"


Now we need to make the shell script executable with 777 permission
sudo chmod a+x /home/almondmendoza/clipboard/speakClipboard.sh
sudo chmod 777 /home/almondmendoza/clipboard/speakClipboard.sh


You could execute it now to speak the clipboard by
/home/almondmendoza/clipboard/speakClipboard.sh

For the fun part we would bind this to a key combination, but first we need to create a symbolic link to /usr/bin where it could be executed properly (i really dont know the reason but it works)
sudo ln /home/almondmendoza/clipboard/speakClipboard.sh /usr/bin/speakMyClipboard

Next bind it to a key combination, i bind it to the first command with Ctrl + Alt + C
gconftool-2 -s /apps/metacity/keybinding_commands/command_1 -t string 'speakMyClipboard'
gconftool-2 -s /apps/metacity/global_keybindings/run_command_1 -t string '<Control><Alt>C'


There are some error/bugs on gtk when i was doing this, i just updated my ubuntu and it was fixed. Another error was most of the time it cannot speak the whole clipboard or couldn't speak at all, i think its espeak's problem so i cant help on this one, just press the combination again and again. If anyone has a better way to do this please post a comment.

Hope this helps.


Some comments from Almondmendoza
#!/bin/bash
number=$((RANDOM%100))
word=`/usr/bin/python //home/mylo9000/Scripts/clipboard/getclipboardcontents.py`

espeak -p $number -v “en+m” “. $word . . . . end of line. $number” –stdout | aplay



for those using ubuntu jaunty as a bug fix change espeak command to:

espeak ” $word ” –stdout | aplay

espeak package in jaunty is not playing nice with port audio.


I love this script its so easy to setup. i have however needed to modify it a little.
firstly i needed to have the alsa-oss package installed (i’m using Ubuntu 8.10)
i then changed the sh file to invok espeak using:
aoss espeak -v “en+m2″ “. $word . . . . ”
doing this allows speakMyClipboard.sh to work while other apps are using the sound card. if you don’t and you have music playing then it won’t work.

the extra periods at the end are there to add a bit of a pause to the end of whats being said.
otherwise aoss cuts off the buffer too soon and you don’t get the last word of the selection.

i also have a launcher in my gnome pannel that i can click on and it will speak the clipboard. this is if i’m feeling lazy and won’t want to use the key combo.

i hope this info helps because this has been a great script for me and i really appreciate it.