How to correctly pipe output into "say" in terminal
Based on mankoff's answer, this works:

leave +1 2&gt;&amp;1 | while read line ; do echo $line | say ; done


although leave no longer vanishes into the background and lets you carry on typing. Similarly:

leave +1 2&gt;&amp;1 | while read line ; do echo $line | say ; done &amp;


will make it vanish into the background, but will also speak a (harmless) process ID number as well. So neither is quite perfect, but both work.

(I was looking for a solution to:

ping google.com | say


which suffers a similar problem, and someone suggested the above as a solution. I didn't add this as a comment to mankoff's answer because I can't work out how to put spaces and newlines in comments.).