\section{Built-in Module \sectcode{macspeech}}
\bimodindex{macspeech}

\renewcommand{\indexsubitem}{(in module macspeech)}

This module provides an interface to the Macintosh Speech Manager,
allowing you to let the Macintosh utter phrases. You need a version of
the speech manager extension (version 1 and 2 have been tested) in
your \code{Extensions} folder for this to work. The module does not
provide full access to all features of the Speech Manager yet.  It may
not be available in all Mac Python versions.

\begin{funcdesc}{Available}{}
Test availability of the Speech Manager extension (and, on the
PowerPC, the Speech Manager shared library). Return 0 or 1. 
\end{funcdesc}

\begin{funcdesc}{Version}{}
Return the (integer) version number of the Speech Manager.
\end{funcdesc}

\begin{funcdesc}{SpeakString}{str}
Utter the string \var{str} using the default voice,
asynchronously. This aborts any speech that may still be active from
prior \code{SpeakString} invocations.
\end{funcdesc}

\begin{funcdesc}{Busy}{}
Return the number of speech channels busy, system-wide.
\end{funcdesc}

\begin{funcdesc}{CountVoices}{}
Return the number of different voices available.
\end{funcdesc}

\begin{funcdesc}{GetIndVoice}{num}
Return a voice object for voice number \var{num}.
\end{funcdesc}

\subsection{voice objects}
Voice objects contain the description of a voice. It is currently not
yet possible to access the parameters of a voice.

\renewcommand{\indexsubitem}{(voice object method)}

\begin{funcdesc}{GetGender}{}
Return the gender of the voice:\ 0 for male, 1 for female and $-1$ for neuter.
\end{funcdesc}

\begin{funcdesc}{NewChannel}{}
Return a new speech channel object using this voice.
\end{funcdesc}

\subsection{speech channel objects}
A speech channel object allows you to speak strings with slightly more
control than \code{SpeakString()}, and allows you to use multiple
speakers at the same time. Please note that channel pitch and rate are
interrelated in some way, so that to make your Macintosh sing you will
have to adjust both.

\renewcommand{\indexsubitem}{(speech channel object method)}
\begin{funcdesc}{SpeakText}{str}
Start uttering the given string.
\end{funcdesc}

\begin{funcdesc}{Stop}{}
Stop babbling.
\end{funcdesc}

\begin{funcdesc}{GetPitch}{}
Return the current pitch of the channel, as a floating-point number.
\end{funcdesc}

\begin{funcdesc}{SetPitch}{pitch}
Set the pitch of the channel.
\end{funcdesc}

\begin{funcdesc}{GetRate}{}
Get the speech rate (utterances per minute) of the channel as a
floating point number.
\end{funcdesc}

\begin{funcdesc}{SetRate}{rate}
Set the speech rate of the channel.
\end{funcdesc}

