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는 8000Hz, 8비트, 1채널 audiorecorder 객체를 생성합니다.

자신의 음성을 5초간 녹음합니다.

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

녹음을 재생합니다.

play(recObj);

배정밀도 배열 y에 데이터를 저장합니다.

y = getaudiodata(recObj);

오디오 샘플을 플로팅합니다.

plot(y);

서로 다른 사운드 카드에서 두 개의 채널 녹음하기

두 개의 다른 사운드 카드에서 오디오를 독립적으로 녹음하려면 각 사운드 카드에 마이크를 연결한 상태에서 다음 절차를 수행하십시오.

  1. audiodevinfo를 호출하여 사용 가능한 사운드 카드를 나열합니다. 예를 들어, 다음 코드는 시스템에 있는 모든 입/출력 오디오 장치를 포함하는 구조체형 배열을 반환합니다.

    info = audiodevinfo;
    
    사용하려는 사운드 카드를 이름으로 식별하고 해당 ID 값을 기록해 둡니다.

  2. 두 개의 audiorecorder 객체를 만듭니다. 예를 들어, 다음 코드는 샘플당 44.1kHz와 16비트로 장치 3의 단일 채널을 녹음하기 위해 audiorecorder 객체 recorder1을 만듭니다. 그런 다음 코드는 48kHz로 장치 4의 단일 채널을 녹음하기 위해 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 객체는 8000Hz의 샘플 레이트, 8비트의 심도(샘플당 8비트), 단일 오디오 채널을 사용합니다. 이러한 설정을 사용할 경우, 필요한 데이터 저장공간은 크지 않습니다. 녹음 품질을 높이려면 샘플 레이트나 비트 심도(Bit Depth)를 증가시키십시오.

예를 들어, 콤팩트 디스크에는 44,100Hz의 샘플 레이트와 16비트의 심도 및 2개의 오디오 채널이 사용됩니다. audiorecorder 객체를 만들고 위의 설정을 사용하여 녹음합니다.

myRecObj = audiorecorder(44100,16,2);

사용 가능한 속성과 값에 대한 자세한 내용은 audiorecorder 함수 도움말 페이지를 참조하십시오.

오디오 재생하기

오디오를 가져오거나 녹음하고 나면 MATLAB은 다음과 같이 데이터를 청취할 수 있는 여러 가지 방법을 지원합니다.

  • 단일 함수 호출을 사용하는 단순한 재생에는 soundsoundsc를 사용합니다. 예를 들어, 신호 데이터와 샘플 레이트 데이터가 포함된 샘플 MAT 파일을 불러오고 오디오를 듣습니다.

    load chirp.mat
    sound(y,Fs)
    
  • 일시 중지, 재개, 콜백 정의를 비롯하여, 재생 중에 더욱 유연성을 발휘하려면 audioplayer 함수를 사용합니다. audioplayer 객체를 만든 다음, 오디오를 재생하는 메서드를 호출합니다. 예를 들어, 다음과 같이 gong 샘플 파일을 청취합니다.

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

    추가 예제는 함수 내에서 오디오를 녹음하거나 재생하기 항목을 참조하십시오.

샘플 레이트를 지정하지 않으면 sound는 8192Hz로 재생합니다. 어떤 재생에서든, 샘플 레이트를 작게 지정할수록 더 느리게 재생되고, 샘플 레이트를 크게 지정할수록 더 빠르게 재생됩니다.

참고

대부분의 사운드 카드는 약 5000Hz~192,000Hz 사이의 샘플 레이트를 지원합니다. 이 범위를 벗어난 샘플 레이트를 지정하면 예기치 않은 결과가 발생할 수 있습니다.

함수 내에서 오디오를 녹음하거나 재생하기

함수 내에 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를 지웁니다.

완전한 재생이나 녹음을 보장하려면 다음 옵션을 고려하십시오.

  • play 또는 record 대신 playblocking 또는 recordblocking을 사용합니다. blocking 메서드는 재생이나 녹음이 완료될 때까지 컨트롤을 유지합니다. 컨트롤을 차단(Blocking)하면 재생이나 녹음 중에 다른 명령이나 메서드(예: pause 또는 resume)를 실행할 수 없습니다.

  • 함수에 출력 인수를 지정하여, 기본 작업 공간에 객체가 생성되도록 합니다. 예를 들어, 출력 인수를 포함하도록 playFile 함수를 수정합니다.

    function obj = playFile(myfile)
    

    함수를 호출합니다.

    h = playFile("handel.mat");
    

    h가 기본 작업 공간에 존재하므로, 명령 프롬프트에서 재생을 일시 중지할 수 있습니다.

    pause(h)
    

참고 항목

| | |

관련 항목