Main Content

オーディオの録音と再生

システム上のオーディオ入出力デバイスから、MATLAB® での処理用にオーディオ データを録音して再生します。MATLAB Online™ および MATLAB Web App Server™ でのオーディオの再生と録音は、Google Chrome® でサポートされています。

オーディオの録音

システムに接続されたマイクなどのオーディオ入力デバイスからデータを録音します。

  1. audiorecorder オブジェクトを作成します。

  2. record メソッドまたは recordblocking メソッドを呼び出します。

    • record では、録音が進行中でも、呼び出し元の関数やコマンド プロンプトに対する即時制御が返されます。録音の長さを秒単位で指定するか、または stop メソッドを使って録音を終了します。オプションとして、pause メソッドと resume メソッドを呼び出します。録音が非同期実行されます。

    • recordblocking では録音が完了するまで制御が保留されます。録音の長さを秒単位で指定します。録音が同期実行されます。

  3. getaudiodata メソッドを使用して、信号データに対応する数値配列を作成します。

次の例では、recordblocking メソッドおよび record メソッドの使用方法を説明します。

マイク入力の録音

この例では、マイク入力の録音、録音の再生、録音したオーディオ信号の数値配列への格納を行う方法を説明します。まず、マイクをシステムに接続しなければなりません。

オーディオ入力を録音するために、recObj という名前の、既定のプロパティをもつ audiorecorder オブジェクトを作成します。

recObj = audiorecorder
recObj = 

  audiorecorder with properties:

          SampleRate: 8000
       BitsPerSample: 8
         NumChannels: 1
            DeviceID: -1
       CurrentSample: 1
        TotalSamples: 0
             Running: 'off'
            StartFcn: []
             StopFcn: []
            TimerFcn: []
         TimerPeriod: 0.0500
                 Tag: ''
            UserData: []
                Type: 'audiorecorder'

audiorecorder は、8000 Hz、8 ビット、1 チャネルの audiorecorder オブジェクトを作成します。

音声を 5 秒間録音します。

recDuration = 5;
disp("Begin speaking.")
recordblocking(recObj,recDuration);
disp("End of recording.")

録音を再生します。

play(recObj);

データを倍精度配列 y に格納します。

y = getaudiodata(recObj);

オーディオ サンプルをプロットします。

plot(y);

異なるサウンド カードからの 2 チャネルの録音

2 つの異なるサウンド カードにそれぞれマイクを接続し、各オーディオを個別に録音するには、次の手順に従います。

  1. audiodevinfo を呼び出して、使用可能なサウンド カードをリストします。たとえば、次のコードは、システム上にある入力および出力オーディオ デバイスをすべて含む構造体配列を返します。

    info = audiodevinfo;
    
    使用するサウンド カードの名前を特定して、その ID 値を書き留めます。

  2. 2 つの audiorecorder オブジェクトを作成します。たとえば、次のコードは、デバイス 3 の単一チャネルを 44.1 kHz、サンプルあたり 16 ビットで録音するための audiorecorder オブジェクト recorder1 を作成します。コードでは次に、デバイス 4 の単一チャネルを 48 kHz で録音するための audiorecorder オブジェクト recorder2 を作成します。

    recorder1 = audiorecorder(44100,16,1,3); 
    recorder2 = audiorecorder(48000,16,1,4);
    

  3. 各オーディオ チャネルを個別に録音します。

    record(recorder1);
    record(recorder2); 
    pause(5);
    
    最初の record の呼び出しがブロックされないため、複数の録音が同時に実行されます。

  4. 録音を停止します。

    stop(recorder1);
    stop(recorder2);
    

録音の音質の指定

既定では、audiorecorder オブジェクトによって 8000 Hz のサンプル レート、8 ビットの深度 (サンプルあたり 8 ビット)、および単一のオーディオ チャネルが使用されます。これらの設定を用いると、必要なデータ ストレージの量は小さなものとなります。録音の音質を上げるには、サンプル レートまたはビット深度の値を増やします。

たとえば、CD では 44,100 Hz のサンプル レート、16 ビットの深度、および 2 つのオーディオ チャネルが使用されます。audiorecorder オブジェクトを作成して、上記の設定で録音を行います。

myRecObj = audiorecorder(44100,16,2);

利用可能なプロパティと値の詳細は、audiorecorder のリファレンス ページを参照してください。

オーディオの再生

オーディオのインポートまたは録音を行った後、そのデータを再生するために MATLAB ではいくつかの方法がサポートされています。

  • 単一の関数呼び出しを使用する単純な再生には、sound または soundsc を使用します。たとえば、信号とサンプル レートのデータを含むサンプル用 MAT ファイルを読み込み、オーディオを再生します。

    load chirp.mat
    sound(y,Fs)
    
  • 一時停止、再開、コールバックの定義など、再生に柔軟性をもたせるには、関数 audioplayer を使用します。audioplayer オブジェクトを作成してから、メソッドを呼び出してオーディオを再生します。たとえば、gong サンプル ファイルを再生します。

    load gong.mat
    gong = audioplayer(y,Fs);
    play(gong);
    

    その他の例は、関数内でのオーディオの録音と再生を参照してください。

サンプル レートを指定しない場合、sound は 8192 Hz で再生を行います。任意の再生において、ゆっくり再生するには小さなサンプル レートを、速く再生するには大きなサンプル レートを指定します。

メモ

ほとんどのサウンド カードでは、およそ 5000 ~ 192,000 Hz のサンプル レートがサポートされます。この範囲外のサンプル レートを指定すると、予期せぬ結果が発生する場合があります。

関数内でのオーディオの録音と再生

関数内で audioplayer オブジェクトまたは audiorecorder オブジェクトを作成する場合、そのオブジェクトが存続するのは関数の持続時間のみとなります。たとえば、playFile というプレーヤー関数と単純なコールバック関数 showSeconds を作成します。

function playFile(myfile)
   load(myfile)
   
   obj = audioplayer(y,Fs);
   obj.TimerFcn = 'showSeconds';
   obj.TimerPeriod = 1;
   
   play(obj);
end

function showSeconds
   disp("tick")
end

コマンド プロンプトから playFile を呼び出して、ファイル handel.mat を再生します。

playFile("handel.mat")

毎秒 8192 サンプルのサンプル レートで録音した場合、ファイル内の 73,113 サンプルの再生には約 8.9 秒がかかります。ただし、関数 playFile は通常、再生が完了する前に終了し、audioplayer オブジェクト obj は消去されます。

再生や録音を完了させるには、以下のオプションを検討してください。

  • playrecord の代わりに playblockingrecordblocking を使用します。ブロック メソッドでは、再生や録音が完了するまで制御が保留されます。制御をブロックすると、再生や録音の間は他のコマンドやメソッド (pauseresume など) を一切発行できません。

  • 使用する関数に、ベース ワークスペースでオブジェクトを作成する出力引数を作成します。たとえば、関数 playFile を変更して出力引数を含めます。

    function obj = playFile(myfile)
    

    関数を呼び出します。

    h = playFile("handel.mat");
    

    h はベース ワークスペースにあるため、コマンド プロンプトから再生を一時停止できます。

    pause(h)
    

参考

| | |

関連するトピック