주요 콘텐츠

audioDeviceReader

사운드 카드에서 녹음

설명

audioDeviceReader System object™는 컴퓨터의 오디오 입력 장치를 사용하여 오디오 샘플을 읽어옵니다.

오디오 장치 리더의 데이터 흐름에 대한 자세한 설명은 Audio I/O: Buffering, Latency, and Throughput 항목을 참조하십시오.

오디오 장치 리더는 드라이버, 장치 및 장치의 특성, System object에서 출력되는 데이터형과 크기를 지정합니다.

오디오 장치에서 데이터를 스트리밍하려면 다음을 수행하십시오.

  1. audioDeviceReader 객체를 만들고 속성을 설정합니다.

  2. 함수를 호출하듯이 인수를 사용하여 객체를 호출합니다.

System object의 작동 방식에 대한 자세한 내용은 System object란? 항목을 참조하십시오.

생성

설명

deviceReader = audioDeviceReader는 오디오 입력 장치를 사용하여 실시간으로 오디오 샘플을 읽어오는 System object deviceReader를 반환합니다.

deviceReader = audioDeviceReader(sampleRateValue)SampleRate 속성을 sampleRateValue로 설정합니다.

deviceReader = audioDeviceReader(sampleRateValue,sampPerFrameValue)SamplesPerFrame 속성을 sampPerFrameValue로 설정합니다.

deviceReader = audioDeviceReader(___,Name,Value)는 각 속성 Name을 지정된 Value로 설정합니다. 지정되지 않은 속성은 디폴트 값을 가집니다.

예: deviceReader = audioDeviceReader(16000,'BitDepth','8-bit integer')는 16kHz 샘플 레이트와 8비트 정수 비트 심도에서 동작하는 System object deviceReader를 생성합니다.

속성

모두 확장

달리 나타내지 않는 이상 속성은 조정 불가형입니다. 즉, 객체를 호출한 후에는 그 값을 변경할 수 없습니다. 호출하면 객체가 잠기며 release 함수를 사용하여 잠금을 해제할 수 있습니다.

속성이 조정 가능형인 경우 언제든지 해당 값을 변경할 수 있습니다.

속성값 변경에 대한 자세한 내용은 MATLAB에서 System object를 사용하는 시스템 설계를 참조하십시오.

오디오 장치에 액세스하는 데 사용되는 드라이버로, 'DirectSound', 'ASIO' 또는 'WASAPI'로 지정됩니다.

  • ASIO™ 드라이버는 Windows® 컴퓨터에 사전 설치되어 제공되지 않습니다. 'ASIO' 드라이버 옵션을 사용하려면 MATLAB® 외부에 ASIO 드라이버를 설치하십시오.

    참고

    Driver'ASIO'로 지정된 경우 asiosettings를 사용하여 사운드 카드 버퍼 크기를 audioDeviceReader System object의 SamplesPerFrame 값으로 설정합니다.

  • WASAPI 드라이버는 배타적 모드에서만 지원됩니다.

ASIO 드라이버와 WASAPI 드라이버는 샘플 레이트 변환을 제공하지 않습니다. ASIO 드라이버와 WASAPI 드라이버의 경우 SampleRate를 오디오 장치에서 지원하는 샘플 레이트로 설정하십시오.

이 속성은 Windows 컴퓨터에만 적용됩니다. Linux® 컴퓨터는 항상 ALSA 드라이버를 사용합니다. Mac 컴퓨터는 항상 CoreAudio 드라이버를 사용합니다.

데이터형: char | string

오디오 샘플을 수집하는데 사용할 장치로, 문자형 벡터 또는 string형으로 지정됩니다. 선택한 드라이버에 사용 가능한 장치를 나열하려면 getAudioDevices를 사용하십시오.

데이터형: char | string

오디오 장치에서 수집하는 입력 채널의 개수로, 정수로 지정됩니다. NumChannels의 범위는 오디오 하드웨어에 따라 다릅니다.

종속 관계

이 속성을 활성화하려면 ChannelMappingSource'Auto'로 설정하십시오.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

오디오 장치에서 읽어오는 프레임 크기로, 양의 정수로 지정됩니다. SamplesPerFrame은 장치 버퍼의 크기이며 audioDeviceReader 객체에서 반환된 출력 행렬의 열 개수이기도 합니다.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

오디오 데이터를 수집하기 위해 장치에서 사용할 샘플 레이트(단위: Hz)로, 양의 정수로 지정됩니다. SampleRate의 범위는 오디오 하드웨어에 따라 다릅니다.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

오디오 데이터를 수집하기 위해 장치에서 사용할 데이터형으로, 문자형 벡터 또는 string형으로 지정됩니다.

데이터형: char | string

오디오 입력 장치의 채널과 출력 행렬의 열 간 매핑의 소스로, 'Auto' 또는 'Property'로 지정됩니다.

  • 'Auto' –– 디폴트 설정은 장치 채널과 출력 행렬 간 매핑을 결정합니다. 예를 들어, 오디오 장치에 6개의 사용 가능한 채널이 있고 NumChannels를 6으로 설정했다고 가정하겠습니다. 오디오 장치 리더 호출의 출력값은 6열 행렬입니다. 열 1은 채널 1에 대응하고, 열 2는 채널 2에 대응하는 식입니다.

  • 'Property' –– ChannelMapping 속성은 오디오 장치의 채널과 출력 행렬의 열 간 매핑을 결정합니다.

데이터형: char | string

오디오 입력 장치의 채널과 출력 행렬의 열 간 디폴트가 아닌 매핑으로, 유효한 채널 인덱스로 구성된 벡터로 지정됩니다. 자세한 내용은 audioDeviceReader에 대한 채널 매핑 지정하기 항목을 참조하십시오.

종속 관계

이 속성을 활성화하려면 ChannelMappingSource'Property'로 설정하십시오.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

출력값의 데이터형으로, 문자형 벡터 또는 string형으로 지정됩니다.

참고

OutputDataType'double' 또는 'single'로 지정된 경우 오디오 장치 리더는 [-1, 1] 범위의 데이터를 출력합니다. 다른 데이터형의 경우 범위는 지정된 데이터형의 [min, max]입니다.

데이터형: char | string

사용

설명

audioFromDevice = deviceReader()는 선택된 오디오 입력 장치에서 한 프레임의 오디오 샘플을 반환합니다.

예제

[audioFromDevice,numOverrun] = deviceReader()deviceReader에 대한 마지막 호출 이후 오디오 리더의 대기열이 오버런된 샘플 수를 반환합니다.

예제

참고:  audioDeviceReader System object를 호출하면 Device 속성으로 지정된 오디오 장치가 잠깁니다. 오디오 장치는 한 번에 하나의 audioDeviceReader에 의해서만 잠길 수 있습니다. 오디오 장치를 해제하려면 audioDeviceReader 객체에 대해 release를 호출하십시오.

출력 인수

모두 확장

장치에서 읽어온 오디오 신호로, 행렬로 반환됩니다. 지정된 채널 개수와 SamplesPerFrame 속성에 따라 행렬 크기가 결정됩니다. 행렬의 데이터형은 OutputDataType 속성에 따라 다릅니다.

데이터형: single | double | int16 | int32 | uint8

deviceReader에 대한 마지막 호출 이후 오디오 리더의 대기열이 오버런된 샘플 수

데이터형: uint32

객체 함수

객체 함수를 사용하려면 System object를 첫 번째 입력 인수로 지정합니다. 예를 들어 이름이 obj인 System object의 시스템 리소스를 해제하려면 다음 구문을 사용하십시오.

release(obj)

모두 확장

getAudioDevices사용 가능한 오디오 장치 나열
infoGet audio device information
clone중복 System object 생성
isLockedDetermine if System object is in use
release리소스 해제 및 System object 속성값과 입력 특성 변경 허용하기
resetSystem object의 내부 상태 재설정
stepSystem object 알고리즘 실행
setupOne-time set up tasks for System objects

예제

모두 축소

마이크로 10초간 음성을 녹음하고 출력을 WAV 파일로 보냅니다.

디폴트 설정을 사용하여 audioDeviceReader 객체를 만듭니다. setup을 호출하여 오디오 스트림 루프에서 초기화의 계산 부하를 줄입니다.

deviceReader = audioDeviceReader;
setup(deviceReader)

dsp.AudioFileWriter System object를 만듭니다. 쓰려는 파일 이름과 유형을 지정합니다.

fileWriter = dsp.AudioFileWriter('mySpeech.wav','FileFormat','WAV');

10초간 음성을 녹음합니다. 오디오 스트림 루프에서, 장치에서 오디오 신호 프레임을 읽어와서 지정된 파일에 씁니다. 파일은 현재 폴더에 저장됩니다.

disp('Speak into microphone now.')
Speak into microphone now.
tic
while toc < 10
    acquiredAudio = deviceReader();
    fileWriter(acquiredAudio);
end
disp('Recording complete.')
Recording complete.

오디오 장치를 해제하고 출력 파일을 닫습니다.

release(deviceReader)
release(fileWriter)

입력 장치 버퍼로 인한 대기 시간은 하나의 데이터 프레임을 수집하는 데 걸리는 시간 지연입니다. 이 예제에서는 audioDeviceReader 객체의 디폴드 속성을 수정하여 대기 시간을 줄입니다.

디폴트 설정을 사용하여 audioDeviceReader 객체를 만듭니다.

deviceReader = audioDeviceReader
deviceReader = 
  audioDeviceReader with properties:

             Device: 'Default'
        NumChannels: 1
    SamplesPerFrame: 1024
         SampleRate: 44100

  Show all properties

장치 버퍼로 인한 대기 시간을 계산합니다.

fprintf('Latency due to device buffer: %f seconds.\n',deviceReader.SamplesPerFrame/deviceReader.SampleRate)
Latency due to device buffer: 0.023220 seconds.

audioDeviceReader 객체의 SamplesPerFrame 속성을 64로 설정합니다. 대기 시간을 계산합니다.

deviceReader.SamplesPerFrame = 64;
fprintf('Latency due to device buffer: %f seconds.\n',deviceReader.SamplesPerFrame/deviceReader.SampleRate)
Latency due to device buffer: 0.001451 seconds.

audioDeviceReader System object의 SampleRate 속성을 96000으로 설정합니다. 대기 시간을 계산합니다.

deviceReader.SampleRate = 96000;
fprintf('Latency due to device buffer: %f seconds.\n',deviceReader.SamplesPerFrame/deviceReader.SampleRate)
Latency due to device buffer: 0.000667 seconds.

오버런은 오디오 스트림 루프가 장치와 속도를 맞추지 못하는 경우 발생하는 입력 신호 누락을 나타냅니다. 오디오 스트림 루프의 오버런을 확인하고, 오디오 스트림 루프에 인위적인 계산 부하를 추가한 다음, audioDeviceReader 객체의 속성을 수정하여 오버런을 줄입니다. 결과는 컴퓨터에 따라 다릅니다.

SamplesPerFrame256으로 설정하고 SampleRate44100으로 설정하여 audioDeviceReader System object를 생성합니다. setup을 호출하여 오디오 스트림 루프에서 초기화의 계산 부하를 줄입니다.

deviceReader = audioDeviceReader( ...
    'SamplesPerFrame',256, ...
    'SampleRate',44100);
setup(deviceReader)

dsp.AudioFileWriter 객체를 만듭니다. 쓰려는 파일 이름과 데이터형을 지정합니다.

fileWriter = dsp.AudioFileWriter('mySpeech.wav','FileFormat','WAV');

5초간 음성을 녹음합니다. 오디오 스트림 루프에서, 장치에서 오디오 신호 프레임을 읽어와서 지정된 파일에 씁니다.

totalOverrun = 0;
disp('Speak into microphone now.')
Speak into microphone now.
tic
while toc < 5
    [input,numOverrun] = deviceReader();
    totalOverrun = totalOverrun + numOverrun;
    fileWriter(input);
end
fprintf('Recording complete.\n')
Recording complete.
fprintf('Total number of samples overrun: %d.\n',totalOverrun)
Total number of samples overrun: 0.
fprintf('Total seconds overrun: %d.\n',double(totalOverrun)/double(deviceReader.SampleRate))
Total seconds overrun: 0.

audioDeviceReader 객체와 dsp.AudioDeviceWriter 객체를 해제하고 카운터 변수를 0으로 설정합니다.

release(fileWriter)
release(deviceReader)
totalOverrun = 0;

pause를 사용하여 오디오 스트림 루프에 인위적인 계산 부하를 추가합니다. 계산 부하로 인해 오디오 스트림 루프가 장치보다 느려지고 이로 인해 수집된 샘플이 삭제됩니다.

disp('Speak into microphone now.')
Speak into microphone now.
tic
while toc < 5
    [input,numOverrun] = deviceReader();
    totalOverrun = totalOverrun + numOverrun;
    fileWriter(input);
    pause(0.01)
end
fprintf('Recording complete.\n')
Recording complete.
fprintf('Total number of samples overrun: %d.\n',totalOverrun)
Total number of samples overrun: 97536.
fprintf('Total seconds overrun: %d.\n',double(totalOverrun)/double(deviceReader.SampleRate))
Total seconds overrun: 2.211701e+00.

audioDeviceReader 객체와 dsp.AudioFileWriter 객체를 해제하고 SamplePerFrame 속성을 512로 설정합니다. 장치 버퍼 크기가 증가하여 이제 장치가 데이터 프레임을 수집하는 데 더 오랜 시간이 걸립니다. 카운터 변수를 0으로 설정합니다.

release(fileWriter)
release(deviceReader)
deviceReader.SamplesPerFrame = 512;
totalOverrun = 0;

수정된 SamplesPerFrame 속성을 사용하여 오디오 스트림 루프의 총 오버런을 계산합니다.

disp('Speak into microphone now.')
Speak into microphone now.
tic
while toc < 5
    [input,numOverrun] = deviceReader();
    totalOverrun = totalOverrun + numOverrun;
    fileWriter(input);
    pause(0.01)
end
fprintf('Recording complete.\n')
Recording complete.
fprintf('Total number of samples overrun: %d.\n',totalOverrun)
Total number of samples overrun: 0.
fprintf('Total seconds overrun: %f.\n',totalOverrun/deviceReader.SampleRate)
Total seconds overrun: 0.000000.

audioDeviceReader에 대한 디폴트가 아닌 채널 매핑을 지정합니다. 이 예제는 특정 하드웨어를 가정합니다. 이 예제에서는 컴퓨터에 두 개의 사용 가능한 채널이 있는 디폴트 오디오 입력 장치가 있다고 가정합니다.

디폴트 설정을 사용하여 audioDeviceReader 객체를 만듭니다.

deviceReader = audioDeviceReader;

디폴트 채널 개수는 1입니다. 인수 없는 함수처럼 audioDeviceReader 객체를 호출하여 오디오 장치에서 하나의 데이터 프레임을 읽어옵니다. 출력 데이터 행렬에 1개의 열이 있는지 확인합니다.

x = deviceReader();
[frameLength,numChannels] = size(x)
frameLength = 1024
numChannels = 1

info를 사용하여 지정된 DriverDevice 구성에서 사용할 수 있는 최대 입력 채널 개수를 확인합니다.

info(deviceReader)
ans = struct with fields:
                  Driver: 'DirectSound'
              DeviceName: 'Primary Sound Capture Driver'
    MaximumInputChannels: 2

ChannelMappingSource'Property'로 설정합니다. 이 속성을 변경하려면 audioDeviceReader 객체의 잠금을 해제해야 합니다.

release(deviceReader)
deviceReader.ChannelMappingSource = 'Property'
deviceReader = 
  audioDeviceReader with properties:

             Driver: 'DirectSound'
             Device: 'Default'
    SamplesPerFrame: 1024
         SampleRate: 44100

  Show all properties

기본적으로 ChannelMappingSource'Property'로 설정된 경우 사용 가능한 모든 채널이 출력에 매핑됩니다. audioDeviceReader 객체를 호출하여 오디오 장치에서 하나의 데이터 프레임을 읽어옵니다. 출력 데이터 행렬에 2개의 열이 있는지 확인합니다.

x = deviceReader();
[frameLength,numChannels] = size(x)
frameLength = 1024
numChannels = 2

ChannelMapping 속성을 사용하여 장치의 채널과 출력 행렬의 열 간 다른 매핑을 지정합니다. 출력 열에 대응하는 인덱스에 입력 채널 번호를 표시합니다. 이 속성을 변경하려면 먼저 audioDeviceReader 객체의 잠금을 해제해야 합니다.

release(deviceReader)
deviceReader.ChannelMapping = [2,1];

이제 audioDeviceReader를 호출하면 다음이 적용됩니다.

  • 장치의 입력 채널 1은 출력 행렬의 두 번째 열에 매핑됩니다.

  • 장치의 입력 채널 2는 출력 행렬의 첫 번째 열에 매핑됩니다.

입력 장치에서 특정 채널을 수집합니다.

deviceReader.ChannelMapping = 2;

audioDeviceReader를 호출하면 장치의 입력 채널 2가 출력 벡터에 매핑됩니다.

확장 기능

모두 확장

버전 내역

R2016a에 개발됨