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

\setindexsubitem{(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.

\setindexsubitem{(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.

\setindexsubitem{(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}

