|
SND 15 - Speech Manager の出力のキャプチャ
(98 年 5 月 18 日)
Q:
Speech Synthesis Manager
からの出力をキャプチャし、ファイルに保存したり、変更することはできるでしょうか。
A:
Speech Synthesis Manager
にはこれを直接行う方法はありませんが、間接的なやり方があります。
Speech Synthesis Manager は、soSoundOutput
セレクタを通じて、任意のサウンド出力デバイスにスピーチを送ることができます。Speech
Synthesis Manager
は、スピーチを含むバッファを作成し、そのバッファを Sound
Manager
で再生します。このため、Sound
Manager
の機能を使って任意のサウンド出力コンポーネントにサウンドを送ることができます。
この機能があるのは、Speech Synthesis Manager
が電話で話せるように設計されたためですが、用途はそれだけに限りません。再生されたサウンドを
(メモリまたはファイルに)
保存する、サウンド出力コンポーネントを作成すれば、Speech
Synthesis Manager
にこのサウンド出力コンポーネントにサウンドを送らせ、その出力をキャプチャすることができます。これでキャプチャしたサウンドは自由に使うことができます。
AIFF-Writer
という DTS
サンプルがあります。これは再生されたサウンドをすべて AIFF
ファイルに保存するサウンド出力コンポーネントのサンプルです。上記のサウンド出力コンポーネントを作成する際に利用するとよいでしょう。
コンポーネントマネージャを使うと、どのようなリソースファイルからもコンポーネントを登録することができます。普通、コンポーネントは“機能拡張”フォルダの個別のファイルに配置しますが、これは必要条件ではありません。例えば、個別のファイルではなく、アプリケーションのリソースフォークに置くこともできます。さらに、アプリケーションと
Mac OS
だけが使用できるようコンポーネントをローカルに登録することもできます。こうして
AIFF-Writer コンポーネントを (他のコンポーネントも)
こっそり使うことができます。ユーザにはアプリケーションが独自の
AIFF-Writer
コンポーネントをインストールしたことはわかりません。ユーザには全く気づかせずに、コンポーネントをインストール、選択、使用、解除できます。
|
注意:
独自のサウンド出力コンポーネントをインストールしても、インストールしたアプリケーションや他のアプリケーションの通常のサウンド再生には影響がありません。独自のサウンド出力コンポーネントに明示的に送られたサウンドだけが、そのコンポーネントを通じて再生されます。
|
|
注意:
独自のサウンド出力デバイスコンポーネントに送ったサウンドは聞こえません
(デフォルトのサウンド出力コンポーネントに行くわけではないからです)。聞こえるようにするには、サウンドを二度再生する必要があります。一度はデフォルトのサウンド出力デバイスに送って聞こえるようにし、もう一度は独自の出力デバイスに送ってキャプチャするのです。Sound
Manager
では同時に複数の異なる出力コンポーネントでサウンドを再生できるので、このように二度の再生を行っても余分な時間はかかりません。
|
次のサンプルコードは、独自のサウンド出力コンポーネントをインストールして
Speech Synthesis Manager を使う方法を示します。
OSErr theErr = noErr;
ComponentDescription writerOutputDev;
Component theWriterComponent = 0;
SpeechChannel theWriterSpeechChan = nil;
// リソースフォークから AIFF-Writer コンポーネントリソースをロードする
numCompsReg = RegisterComponentResourceFile (CurResFile(), 0);
writerOutputDev.componentType = kSoundOutputDeviceType;
writerOutputDev.componentSubType = 'AIFW';
writerOutputDev.componentManufacturer = kAppleManufacturer;
writerOutputDev.componentFlags = 0;
writerOutputDev.componentFlagsMask = 0;
// AIFF-Writer コンポーネントのインスタンスを探す
theWriterComponent = FindNextComponent (0, &writerOutputDev);
theErr = NewSpeechChannel (nil, &theWriterSpeechChan);
if (theErr != noErr)
return theErr;
// AIFF-Writer 経由で再生するよう出力デバイスを変更する
theErr = SetSpeechInfo (theWriterSpeechChan, soSoundOutput,
&theWriterComponent);
|
参考文献
Mark Cookson
Worldwide Developer Technical Support
[ Technical
Q&A's : Graphics &
Media : QuickTime : Sound :
SND15 ]
|