Audio books

I've been listening to MP3 audio books during my daily commute to work for quite a few years.

The biggest problem with listening to books is losing your place or getting back to the place you left off after you've taken a break in listening.

During the first year or so, I used a CD MP3 player. Here there was no memory of where I'd left off at all. So the last thing I would do when I was finished listening was to note the track number and minutes/seconds into the track (I used to dial it on my cell phone; a great way to remember a number). When I got back in the car and wanted to resume listening I would have to go back to the correct track, minutes and seconds where I had left off. Very tedious!

After the CD player I had a Pocket PC (I got it from my work -- Destinator Technologies, makers of GPS navigation software). On the Pocket PC I could install a decent MP3 player, one that could help me to keep track of where I was in the book. I used Mirko Schenk's excellent open source MortPlayer. This player even has a special mode to use when playing audio books (which is something I later found out the best MP3 players (like iPod) have to help listen to audio books).

After leaving Destinator and my borrowed PPC behind, I had to find some new way of listening to books during my commute. Going back to the CD player was out of the question because it had a problem with playing tracks in the correct order. This led to life threatening situations where I'd try to find my place in some book while speeding down the highway. Not something I wanted to go back to.

As I also needed to get a cell phone, I thought that I might be able to combine the 2 functions and get a phone with an MP3 player. After much investigation, I got the Motorola MOTORazr V6 MAXX which was supposed to have good MP3 playing capabilities. It turns out that it is a nice phone (my first non-Nokia, and not bad at all) but completely useless for listening to audio books. There is no way to save your place in an MP3, or even in a play list. So each time you want to start a listening session, you would have to laboriously find your place.

So finally I bought a cheap little flash memory based MP3 player from a company called "Bross" (for some every time I turn the device on and I see the word Bross on the screen I always think of someone saying "Hey bro's, how's it goin'?"). Strangely enough, I haven't been able to find any reference to an MP3 player manufactured by Bross anywhere on the internet.

The device has 1GB (which is plenty for audio books), and cost only 140 Israeli Shekels (~$35). It works fine, though with some slightly annoying quirks. One quirk is that sometimes the first first track in a folder will be some file in the middle of the list of files (track 23 out of 100, for example). The tracks are all named uniformly and have no tag info at all. There is no reason I can see why the first track displayed for the folder would not be track 1... The device has a USB port for managing its memory.

Here's a blurry picture of the player taken with my phone's camera:


The device has the crucial feature required to allow it to be used for listening to audio books: it remembers where it was stopped even after turning it off and changing the batteries. This site has a detailed post about what to look for when buying an MP3 player for listening to audio books.

Unfortunately though, sometimes it does forget the previous location inside an MP3 track, forcing me to search through the track for the point I left off. To make this as painless as possible, I've written a script which ensures that my MP3 files are never longer than 5 minutes long each. The script is written in Python, and uses mpgedit to first make 1 huge MP3 file and mp3splt to split it into smaller files.

The script will accept arguments, but the defaults are such that if you run it in a folder with a bunch of MP3s that are in the correct playing order when sorted by name, you will get good results. Some other processing that might be useful to do to the MP3s is to increase the volume (this is done in the script using mp3gain but currently commented out) or to decrease the sample rate in case you are limited in space and have MP3s with a bit rate of over ~44kbps (not needed for speech recordings) -- easily done using lame.

Here's the script:
import getopt, sys, glob, shutil, os, re
from subprocess import call

def usage():
usage_text="""
usage: ebook-mp3.py [-n ] [-d ] [-p ]
"""
print usage_text

def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "n:d:p:")
except getopt.GetoptError:
# print help information and exit:
usage()
sys.exit(2)
mpgedit = r"D:\Program Files\mpgedit.org\mpgedit\mpgedit_nocurses.exe"
mp3splt = r"D:\etc\mp3splt-2.1\mp3splt.exe"
mp3gain = r"D:\Program Files\MP3Gain\mp3gain.exe"
new_name = None
dest_dir = "."
source_pattern = "*.mp3"
for o, a in opts:
if o in ("-n"):
new_name = a
if o in ("-d"):
dest_dir = a
if o in ("-p"):
source_pattern = a
source_files = glob.glob(source_pattern)
if new_name == None:
new_name = raw_input("Enter base name for split files:")
mpgedit_args = [mpgedit, '-o', new_name, '-e-']
mpgedit_args.extend(source_files)
call(mpgedit_args)
for filename in source_files:
os.remove("%s.idx" % filename[ : -4])
# call([mp3gain, "/r", new_name])
call([mp3splt, "-q", "-n", "-a", "-t", "5.0", "-d", dest_dir, new_name])
os.remove(new_name)
for filename in glob.glob("%s*.mp3" % new_name):
shorter_filename = re.sub(r"%s_(\d{3})\.00_(\d{3})\.00" % new_name,
r"%s_\1_\2" % new_name, filename)
os.rename(filename, shorter_filename)

if __name__ == "__main__":
main()