高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先



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 ]