メインコンテンツ

カスタム ラベル付け関数

信号ラベラー アプリを使用すると、自動ラベル付けを実行できます。[ラベル] タブの [値の自動処理] ギャラリーには、ピークまたは谷として検出された点にラベルを付ける機能や、しきい値または範囲によって境界が設定された関心領域にラベルを付ける機能が含まれています。Audio Toolbox™ がある場合、このギャラリーには、音声検出機能、音声からテキストへの文字起こし機能、および音声信号内の関心領域にラベルを付けるサウンド分類機能が含まれています。属性、関心領域 (ROI)、点、時間-周波数 ROI など、ラベルのタイプごとにカスタムの自動ラベル付け関数を作成することもできます。

Automate Value gallery

時間領域ラベルのカスタム ラベル付け関数の作成

ラベルの定義が属性、ROI、および点である場合、すべてのカスタム自動ラベル付け関数の最初の行は、次の形式の定義ステートメントで構成されています。

function [labelVals,labelLocs] = fx(x,t,parentLabelVal,parentLabelLoc,varargin)
定義ステートメントには、関数名と、必須およびオプションの入力引数のセットが含まれています。

  1. x は入力信号。関数を記述する場合、x は各列にチャネルに対応するデータが含まれる行列であると想定します。チャネルの長さが異なる場合、x は列ベクトルの cell 配列であると想定します。

  2. t には時間値が格納されています。関数を記述する場合、t は各列にチャネルに対応する時間情報が含まれる行列であると想定します。チャネルの長さが異なる場合、t は列ベクトルの cell 配列であると想定します。

    メモ

    • 単一チャネル メンバーの場合、カスタム自動ラベル付け関数は、データと時間値を倍精度のベクトルとして取得します。

    • マルチチャネル メンバーの場合、カスタム自動ラベル付け関数は、データと時間値を行列または cell 配列として取得します。

    • カスタム自動ラベル付け関数は、メンバーのすべてのチャネルを入力として取得しますが、すべてを処理する必要はありません。関数が処理するチャネルを選択できます。

  3. parentLabelVal は、出力サブラベルに関連付けられた親ラベル値であり、数値、logical、または string スカラーが含まれます。この引数は、サブラベルのラベル付けを自動化する関数にのみ渡されます。関数が親ラベル用の場合は、parentLabelVal は空であると想定します。

  4. parentLabelLoc には、次が含まれます。

    • 親ラベルが属性の場合は、空のベクトル

    • 親ラベルが関心領域 (ROI) の場合は、ROI 範囲の 2 要素の数値行ベクトル

    • 親ラベルが点の場合は、点の位置を表す数値スカラー

    この引数は、サブラベルのラベル付けを自動化する関数にのみ渡されます。関数が親ラベル用の場合は、parentLabelLoc は空であると想定します。

    メモ

    • 親ラベルの場合、選択された各メンバーに対して自動ラベル付け関数が実行されます。

    • サブラベルの場合、選択されたそれぞれのメンバーについて、一度に 1 つの親ラベルのインスタンスに対して、自動ラベル付け関数が実行されます。

  5. 追加の入力引数を指定するには、varargin を使用します。追加の入力引数がない場合は、varargin を省略できます。追加の引数は、[自動ラベル付け] ボタンをクリックすると表示されるダイアログ ボックスに順序付きのコンマ区切りリストとして入力します。

出力引数には次が含まれます。

  1. labelVals には、ラベル値が含まれます。labelVals は以下でなければなりません。

    • 出力ラベルが属性の場合、数値、logical、または string スカラー

    • 出力ラベルが ROI または点の場合、数値、logical、または string 値を持つ列ベクトル

  2. labelLocs には、ラベルの位置が含まれます。labelLocs は以下でなければなりません。

    • 出力ラベルが属性の場合は、空のベクトル

    • 出力ラベルが ROI の場合は、ROI 範囲の 2 列の行列

    • 出力ラベルが点の場合は、点の位置の列ベクトル

アルゴリズムを実装するために、MATLAB® またはシステムにインストールされているいずれかのツールボックスの関数を使用できます。

詳細については、カスタム関数を使用した信号のラベル付けの自動化およびオーディオ信号内の発声された単語のラベル付けを参照してください。

例:平均 RMS 値

この関数は信号の平均 RMS 値を計算し、数値属性としてこの値を使用して信号にラベル付けします。メンバーに複数のチャネルがある場合、この関数は各チャネルの RMS 値を計算し、値を平均します。チャネルは異なる長さをもつことができます。

function [labelVals,labelLocs] = meanRMS(x,t,parentLabelVal,parentLabelLoc,varargin)
% Label signal with its mean RMS value as attribute

if iscell(x)
    labelVals = mean(cellfun(@rms,x))
else
    labelVals = mean(rms(x));
end
labelLocs = [];

end

例:ゼロクロッシング

この関数は、信号のゼロクロッシングを検出し、立ち上がり遷移の場合は "rising"、立ち下がり遷移の場合は "falling" としてラベル付けします。

function [labelVals,labelLocs] = transitions(x,t,parentLabelVal,parentLabelLoc,varargin)
% Label zero crossings as "rising" or "falling"

nchan = size(x,2);
tt = t(:,1);

labelVals = cell(nchan,1);
labelLocs = cell(nchan,1);

for kj = 1:nchan

    [rate,count,indices] = zerocrossrate(x,TransitionEdge="rising");
    rloc = tt(indices == 1);
    rval = repmat("rising",length(rloc),1);
    
    [rate,count,indices] = zerocrossrate(x,TransitionEdge="falling");
    floc = tt(indices == 1);
    fval = repmat("falling",length(floc),1);
    
    labelLocs{kj} = [rloc;floc];
    labelVals{kj} = [rval;fval];

end

labelVals = cat(1,labelVals{:});
labelLocs = cell2mat(labelLocs);

end

例:マルチチャネル ラベル付け

この論理関数は、次のようなマルチチャネル信号の領域を true としてラベル付けします。

  • 最初のチャネルの振幅が負である。

  • 3 番目のチャネルの振幅が、ユーザー指定の値 mx よりも大きい。mx を指定しない場合は、既定値の 0.1 が使用されます。

関数sigrangebinmaskを使用すると、有界領域に同様のラベル付けを実行できます。

function [labelVals,labelLocs] = greaterThan(x,t,parentLabelVal,parentLabelLoc,varargin)
% Label regions with negative first channel and third channel larger than a given value

if nargin<5
    mx = 0.1;
else
    mx = varargin{1};
end

xr = x(:,1);
xx = x(:,3);
tt = t(:,1);

ss = signalMask(xr < 0 & xx >= mx);
x = roimask(ss);

labelLocs = tt(x.ROILimits);
labelVals = logical(double(x.Value));

end

例:外部 API を使用した発声された単語の抽出

この関数は、IBM® Watson Speech to Text API と Audio Toolbox speech2text 拡張機能を使用して、オーディオ ファイルから発声された単語を抽出します。

function [labelVals,labelLocs] = stt(x,t,parentLabelVal,parentLabelLoc,varargin)

aspeechObjectIBM = speechClient("IBM",timestamps=true);

fs = 1/(t(2)-t(1));

tixt = speech2text(aspeechObjectIBM,x,fs);

unifiedTable = vertcat(tixt.TimeStamps{:});
numLabels = numel(unifiedTable,1);
labelVals = strings(numLabels,1);
labelLocs = zeros(numLabels,2);

for idx = 1:numLabels
    labelVals(idx) = unifiedTable{idx}{1};
    labelLocs(idx,1) = unifiedTable{idx}{2};
    labelLocs(idx,2) = unifiedTable{idx}{3};
end

end

時間-周波数領域ラベルのカスタム ラベル付け関数の作成

ラベルの定義が時間-周波数 ROI である場合、すべてのカスタム自動ラベル付け関数の最初の行は、次の形式の定義ステートメントで構成されています。

function [labelVals,labelLocsTime,labelLocsFreq] = fx(x,tf,t,f,tfOptions,varargin)
定義ステートメントには、関数名と、必須およびオプションの入力引数のセットが含まれています。

  1. x は入力信号。関数を記述する場合、x は時間領域の信号データを含む列ベクトルであると想定します。

  2. tf はスペクトログラムのパワー推定です。関数を記述する場合、tf は行列であると想定します。ここで、各列にはウィンドウ処理された時間セグメントのパワー推定に対応するデータが、各行には周波数ビンのパワー推定に対応するデータが格納されています。

  3. t には時間値が格納されています。関数を記述する場合、t は列ベクトルであると想定します。ここで、各要素の値はスペクトログラムのパワー推定におけるウィンドウ処理された各時間セグメントの中心を表します。

  4. f には周波数値が格納されています。関数を記述する場合、f は列ベクトルであると想定します。ここで、各要素の値はスペクトログラムのパワー推定における各周波数ビンの中心を表します。

  5. tfOptions には、パワー推定の計算方法に関する情報が格納されています。関数を記述する場合、tfOptionslabelSpectrogramOptions オブジェクトになると想定します。

  6. 追加の入力引数を指定するには、varargin を使用します。追加の入力引数がない場合は、varargin を省略できます。追加の引数は、[自動ラベル付け] ボタンをクリックすると表示されるダイアログ ボックスに順序付きのコンマ区切りリストとして入力します。

出力引数には次が含まれます。

  1. labelVals にはラベル値が格納されています。labelVals は、数値、logical、または string の値をもつ列ベクトルでなければなりません。

  2. labelLocsTime にはラベルの時間位置が格納されています。labelLocsTime は、ROI の時間範囲から成る 2 列の行列でなければなりません。

  3. labelLocsFreq にはラベルの時間位置が格納されています。labelLocsFreq は、ROI の周波数範囲から成る 2 列の行列でなければなりません。

アルゴリズムを実装するために、MATLAB またはシステムにインストールされているいずれかのツールボックスの関数を使用できます。

例:最大スペクトル エントロピー値

次の関数は、信号の最大スペクトル エントロピー値を計算し、その値を数値の時間-周波数 ROI として信号にラベル付けします。メンバーに複数のチャネルがある場合、関数は最初のチャネルの最大スペクトル エントロピー値を計算します。

function [labelVals,labelLocsTime,labelLocsFreq] = maxSpectralEntropy(x,tf,t,f,tfOptions,varargin)
% Label signal with its maximum spectral entropy at 3 time-frequency ROIs.

tLocMin = [0.3 0.5 0.7];
fLocMin = [0.5 0.2 0.6];

labelLocsTime = zeros(numel(tLocMin),2);
labelLocsFreq = zeros(numel(fLocMin),2);
labelVals = zeros(numel(tLocMin),1);

for i = 1:numel(tLocMin)
    labelLocsTime(i,:) = max(t)*[tLocMin(i) tLocMin(i)+0.1];
    labelLocsFreq(i,:) = max(f)*[fLocMin(i) fLocMin(i)+0.2];
    labelVals(i) = max(spectralEntropy(db2pow(tf),f,t, ...
        TimeLimits=labelLocsTime(i,:), ...
        Range = labelLocsFreq(i,:)));
end

end

ギャラリーへのカスタム ラベル付け関数の追加

カスタム自動ラベル付け関数を追加するには、[値の自動処理] ギャラリーの隣にある矢印をクリックして、[カスタム関数の追加] を選択します。ダイアログ ボックスで、以下のフィールドを指定します。

  • 名前 — 追加する関数の名前を指定します。

  • 説明 — 関数の機能の簡単な説明を追加し、オプションの入力引数について説明します。

  • ラベル タイプ — 関数が生成するラベルのタイプを指定します。[属性] (既定)、[ROI][点]、または [時間-周波数 ROI] を選択します。

    メモ

    指定した [ラベル タイプ] に基づいて、信号ラベラー[値の自動処理] ギャラリーの適切なカテゴリに関数を配置します。ラベルの定義を選択すると、ギャラリーでは、その定義タイプで使用できる関数のみが有効になります。

関数を書き込み済みでその関数が現在のフォルダーまたは MATLAB パスにある場合、[信号ラベラー] はその関数をギャラリーに組み込みます。関数をまだ書き込んでいない場合、[信号ラベラー] はエディターで空白のテンプレートを開きます。

ギャラリーでのカスタム ラベル付け関数の管理

必要に応じて、[値の自動処理] ギャラリーの [カスタム関数の管理] オプションを使用して、関数の編集、関数の説明の編集、または関数の削除ができます。

メモ

[カスタム関数の管理] オプションを使用すると、[値の自動処理] ギャラリーに表示される関数の説明のみが変更されます。関数を含むファイル内の説明を変更する場合は、ファイルを編集しなければなりません。

参考

アプリ

関数

トピック