自分なりに改造してみた。
取り敢えず非同期に & >>447 の機能をいれた。
> 文字列から言語判別出来るようにすればよさそうだな
これはできてない。
あと、エラーになったときにバッファやファイルが削除されないかも。

(defun speech-callback (status &rest cbargs)
  (unwind-protect
  (progn
  (set-buffer-multibyte nil)
  (goto-char (point-min))
  (lexical-let ((temp-file (make-temp-file "speech-" nil ".mp3")))
  (let ((coding-system-for-read 'binary)
  (coding-system-for-write 'binary)
  (cmdlist (split-string (format speech-sound-player temp-file))))
  (write-region (search-forward-regexp "\n\n") (point-max) temp-file nil 'silent)
  (set-process-sentinel (apply 'start-process (car cmdlist) nil cmdlist)
  (lambda (process event)
  (delete-file temp-file))))))
  (kill-buffer)))

(defun speech-message (text &optional lang)
  "指定された文章を音声再生する。"
  (interactive (list (read-string "Message: " (thing-at-point 'word))))
  (let ((coding-system-for-read 'binary)
  (coding-system-for-write 'binary)
  (url-privacy-level 'paranoid)
  (url-request-extra-headers '(("User-Agent" . "Emacs/URI Safari/0"))))
  (url-retrieve (format "http://translate.google.com/translate_tts?sl=en&tl=%s&q=%s"
  (or lang speech-default-language) (url-hexify-string text))
  'speech-callback)))