录制和播放音频
通过系统音频输入和输出设备录制和播放音频数据,以便在 MATLAB® 中进行处理。Google Chrome® 支持在 MATLAB Online™ 和 MATLAB Web App Server™ 中进行音频回放和音频录制。
录制音频
从音频输入设备(例如与系统相连的麦克风)录制数据:
创建
audiorecorder对象。调用
record或recordblocking方法,其中:record将当前的控制权返回给调用函数或命令提示符,甚至在录制进行过程中也是如此。可以指定录制时长(秒)或者使用stop方法结束录制。也可以选择调用pause和resume方法。录制以异步方式进行。recordblocking会一直保留控制权,直至录制完成。指定录制时长(秒)。录制以同步方式进行。
使用
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);
录制来自不同声卡的两个通道
要独立地录制来自两个不同的声卡(并且每个声卡都连接了一个麦克风)的音频:
调用
audiodevinfo以列出可用的声卡。例如,以下代码返回一个结构体数组,其中包含系统上的所有输入和输出音频设备。通过名称确定您要使用的声卡,并记录其info = audiodevinfo;
ID值。创建两个
audiorecorder对象。例如,以下代码创建audiorecorder对象recorder1,用于以 44.1 kHz 和每样本 16 位的方式录制设备 3 的单个通道。然后,代码创建audiorecorder对象recorder2,用于以 48 kHz 录制设备 4 的单个通道。recorder1 = audiorecorder(44100,16,1,3); recorder2 = audiorecorder(48000,16,1,4);
独立录制每个音频通道。
当对record(recorder1); record(recorder2); pause(5);
record的首个调用不排他时,会同时进行录制。停止录制。
stop(recorder1); stop(recorder2);
指定录制质量
默认情况下,audiorecorder 对象使用 8000 Hz 的采样率、8 位(每个样本 8 位)的深度和单个音频通道。使用这些设置时,所需的数据存储量很低。要获取更高质量的录音,可增加采样率或位深。
例如,光盘使用 44,100 Hz 的采样率、16 位位深和两个音频通道。创建一个 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。
对于完整的回放或录制,请考虑以下选项:
使用
playblocking或recordblocking而不是play或record。排他方法会一直保留控制权,直至播放或录制完成。如果对控制权实施排他,则无法在回放或录制过程发出任何其他命令或方法(例如pause或resume)。为在基础工作区中生成对象的函数创建一个输出参量。例如,修改
playFile函数以包括输出参量。function obj = playFile(myfile)
调用函数。
h = playFile("handel.mat");因为
h存在于基础工作区中,所以可以从命令提示符暂停回放。pause(h)
另请参阅
audioplayer | sound | soundsc | audiorecorder