Спектральные дескрипторы

Audio Toolbox™ обеспечивает комплект функций, которые описывают форму, иногда называемую тембром, аудио. Этот пример определяет уравнения, используемые, чтобы определить спектральные функции, цитирует общее использование каждой функции и обеспечивает примеры так, чтобы можно было получить интуицию о том, что описывают спектральные дескрипторы.

Спектральные дескрипторы широко используются в машине и применении глубокого обучения и перцепционном анализе. Спектральные дескрипторы были применены к области значений приложений, включая:

  • Идентификация динамика и распознавание [21]

  • Акустическое распознавание сцены [11] [17]

  • Инструментальное распознавание [22]

  • Музыкальная классификация [16] [18] жанров

  • Распознавание настроения [19] [20]

  • Речевое обнаружение действия [5] [7] [8] [10] [12] [13]

Spectral Centroid

Спектральный центроидный ( spectralCentroid ) является взвешенной суммой частоты, нормированной невзвешенной суммой [1]:

μ1=k=b1b2fkskk=b1b2sk

где

  • fk частота в Гц, соответствующем интервалу k.

  • sk спектральное значение в интервале k. Спектр значения и спектр мощности оба обычно используются.

  • b1 и b2 ребра полосы, в интервалах, по которым можно вычислить спектральный центроид.

Спектральный центроид представляет "центр тяжести" спектра. Это используется в качестве индикации относительно яркости [2] и обычно используется в музыкальном анализе и классификации жанров. Например, наблюдайте скачки в центроиде, соответствующем высоким хитам шляпы в звуковом файле.

[audio,fs] = audioread('FunkyDrums-44p1-stereo-25secs.mp3');
audio = sum(audio,2)/2;

centroid = spectralCentroid(audio,fs);

subplot(2,1,1)
t = linspace(0,size(audio,1)/fs,size(audio,1));
plot(t,audio)
ylabel('Amplitude')

subplot(2,1,2)
t = linspace(0,size(audio,1)/fs,size(centroid,1));
plot(t,centroid)
xlabel('Time (s)')
ylabel('Centroid (Hz)')

Спектральный центроид также обычно используется, чтобы классифицировать речь, как озвучено или неречевой [3]. Например, центроид переходит в областях неречевой речи.

[audio,fs] = audioread('Counting-16-44p1-mono-15secs.wav');

centroid = spectralCentroid(audio,fs);

subplot(2,1,1)
t = linspace(0,size(audio,1)/fs,size(audio,1));
plot(t,audio)
ylabel('Amplitude')

subplot(2,1,2)
t = linspace(0,size(audio,1)/fs,size(centroid,1));
plot(t,centroid)
xlabel('Time (s)')
ylabel('Centroid (Hz)')

Spectral Spread

Спектральное распространение ( spectralSpread ) является стандартным отклонением вокруг спектрального центроида [1]:

μ2=k=b1b2(fk-μ1)2skk=b1b2sk

где

  • fk частота в Гц, соответствующем интервалу k.

  • sk спектральное значение в интервале k. Спектр значения и спектр мощности оба обычно используются.

  • b1 и b2 ребра полосы, в интервалах, по которым можно вычислить спектральное распространение.

  • μ1 спектральный центроид.

Спектральное распространение представляет "мгновенную пропускную способность" спектра. Это используется в качестве индикации относительно преобладания тона. Например, увеличения распространения как тоны отличаются и уменьшения, когда тоны сходятся.

fs = 16e3;
tone = audioOscillator('SampleRate',fs,'NumTones',2,'SamplesPerFrame',512,'Frequency',[2000,100]);
duration = 5;
numLoops = floor(duration*fs/tone.SamplesPerFrame);
signal = [];
for i = 1:numLoops
    signal = [signal;tone()];
    if i<numLoops/2
        tone.Frequency = tone.Frequency + [0,50];
    else
        tone.Frequency = tone.Frequency - [0,50];
    end
end

spread = spectralSpread(signal,fs);

subplot(2,1,1)
spectrogram(signal,round(fs*0.05),round(fs*0.04),2048,fs,'yaxis')

subplot(2,1,2)
t = linspace(0,size(signal,1)/fs,size(spread,1));
plot(t,spread)
xlabel('Time (s)')
ylabel('Spread')

Spectral Skewness

Спектральная скошенность ( spectralSkewness ) вычисляется с третьего момента порядка [1]:

μ3=k=b1b2(fk-μ1 )3sk(μ2)3k=b1b2sk

где

  • fk частота в Гц, соответствующем интервалу k.

  • sk спектральное значение в интервале k. Спектр значения и спектр мощности оба обычно используются.

  • b1 и b2 ребра полосы, в интервалах, по которым можно вычислить спектральную скошенность.

  • μ1 спектральный центроид.

  • μ2 спектральное распространение.

Спектральная скошенность измеряет симметрию вокруг центроида. В фонетике спектральная скошенность часто упоминается как спектральный наклон и используется с другими спектральными моментами, чтобы отличить место разборчивости [4]. Для гармонических сигналов это указывает на относительную силу выше и более низкие гармоники. Например, в сигнале с четырьмя тонами, существует положительный скос, когда более низкий тон является доминирующим и отрицательный скос, когда верхний тон является доминирующим.

fs = 16e3;
duration = 99;
tone = audioOscillator('SampleRate',fs,'NumTones',4,'SamplesPerFrame',fs,'Frequency',[500,2000,2500,4000],'Amplitude',[0,0.4,0.6,1]);

signal = [];
for i = 1:duration
    signal = [signal;tone()];
    tone.Amplitude = tone.Amplitude + [0.01,0,0,-0.01];
end

skewness = spectralSkewness(signal,fs);
t = linspace(0,size(signal,1)/fs,size(skewness,1))/60;

subplot(2,1,1)
spectrogram(signal,round(fs*0.05),round(fs*0.04),round(fs*0.05),fs,'yaxis','power')
view([-58 33])

subplot(2,1,2)
plot(t,skewness)
xlabel('Time (minutes)')
ylabel('Skewness')

Spectral Kurtosis

Спектральный эксцесс ( spectralKurtosis ) вычисляется с четвертого момента порядка [1]:

μ4=k=b1b2(fk-μ1 )4sk(μ2)4k=b1b2sk

где

  • fk частота в Гц, соответствующем интервалу k.

  • sk спектральное значение в интервале k. Спектр значения и спектр мощности оба обычно используются.

  • b1 и b2 ребра полосы, в интервалах, по которым можно вычислить спектральный эксцесс.

  • μ1 спектральный центроид.

  • μ2 спектральное распространение.

Спектральный эксцесс измеряет плоскость или non-Gaussianity, спектра вокруг его центроида. С другой стороны это используется, чтобы указать на остроконечность спектра. Например, когда белый шум увеличен на речевом сигнале, уменьшениях эксцесса, указав на менее остроконечный спектр.

[audioIn,fs] = audioread('Counting-16-44p1-mono-15secs.wav');

noiseGenerator = dsp.ColoredNoise('Color','white','SamplesPerFrame',size(audioIn,1));

noise = noiseGenerator();
noise = noise/max(abs(noise));
ramp = linspace(0,.25,numel(noise))';
noise = noise.*ramp;

audioIn = audioIn + noise;

kurtosis = spectralKurtosis(audioIn,fs);

t = linspace(0,size(audioIn,1)/fs,size(audioIn,1));
subplot(2,1,1)
plot(t,audioIn)
ylabel('Amplitude')

t = linspace(0,size(audioIn,1)/fs,size(kurtosis,1));
subplot(2,1,2)
plot(t,kurtosis)
xlabel('Time (s)')
ylabel('Kurtosis')

Spectral Entropy

Спектральный энтропийный ( spectralEntropy ) измеряет остроконечность спектра [6]:

энтропия=-k=b1b2skжурнал(sk)журнал(b2-b1)

где

  • fk частота в Гц, соответствующем интервалу k.

  • sk спектральное значение в интервале k. Спектр значения и спектр мощности оба обычно используются.

  • b1 и b2 ребра полосы, в интервалах, по которым можно вычислить спектральную энтропию.

Спектральная энтропия использовалась успешно в речевых/неречевых решениях для автоматического распознавания речи [6]. Поскольку энтропия является мерой разупорядочения, области речевой речи имеют более низкую энтропию по сравнению с областями неречевой речи.

[audioIn,fs] = audioread('Counting-16-44p1-mono-15secs.wav');

entropy = spectralEntropy(audioIn,fs);

t = linspace(0,size(audioIn,1)/fs,size(audioIn,1));
subplot(2,1,1)
plot(t,audioIn)
ylabel('Amplitude')

t = linspace(0,size(audioIn,1)/fs,size(entropy,1));
subplot(2,1,2)
plot(t,entropy)
xlabel('Time (s)')
ylabel('Entropy')

Спектральная энтропия также использовалась, чтобы различить между речью и музыкой [7] [8]. Например, сравните гистограммы энтропии для речи, музыки и фоновых звуковых файлов.

fs = 8000;
[speech,speechFs] = audioread('Rainbow-16-8-mono-114secs.wav');
speech = resample(speech,fs,speechFs);
speech = speech./max(speech);

[music,musicFs] = audioread('RockGuitar-16-96-stereo-72secs.flac');
music = sum(music,2)/2;
music = resample(music,fs,musicFs);
music = music./max(music);

[background,backgroundFs] = audioread('Ambiance-16-44p1-mono-12secs.wav');
background = resample(background,fs,backgroundFs);
background = background./max(background);

speechEntropy     = spectralEntropy(speech,fs);
musicEntropy      = spectralEntropy(music,fs);
backgroundEntropy = spectralEntropy(background,fs);

figure
h1 = histogram(speechEntropy);
hold on
h2 = histogram(musicEntropy);
h3 = histogram(backgroundEntropy);

h1.Normalization = 'probability';
h2.Normalization = 'probability';
h3.Normalization = 'probability';
h1.BinWidth = 0.01;
h2.BinWidth = 0.01;
h3.BinWidth = 0.01;
title('Spectral Entropy')
legend('Speech','Music','Background','Location',"northwest")
xlabel('Entropy')
ylabel('Probability')
hold off

Spectral Flatness

Спектральная плоскость ( spectralFlatness ) измеряет отношение геометрического среднего значения спектра к среднему арифметическому спектра [9]:

плоскость=(k=b1b2sk)1b2-b11b2-b1k=b1b2sk

где

  • sk спектральное значение в интервале k. Спектр значения и спектр мощности оба обычно используются.

  • b1 и b2 ребра полосы, в интервалах, по которым можно вычислить спектральную плоскость.

Спектральная плоскость является индикацией относительно остроконечности спектра. Более высокая спектральная плоскость указывает на шум, в то время как более низкая спектральная плоскость указывает на тональность.

[audio,fs] = audioread('WaveGuideLoopOne-24-96-stereo-10secs.aif');
audio = sum(audio,2)/2;

noise = (2*rand(numel(audio),1)-1).*linspace(0,0.05,numel(audio))';

audio = audio + noise;

flatness = spectralFlatness(audio,fs);

subplot(2,1,1)
t = linspace(0,size(audio,1)/fs,size(audio,1));
plot(t,audio)
ylabel('Amplitude')

subplot(2,1,2)
t = linspace(0,size(audio,1)/fs,size(flatness,1));
plot(t,flatness)
ylabel('Flatness')
xlabel('Time (s)')

Спектральная плоскость была также применена успешно к обнаружению певческого голоса [10] и к аудио распознаванию сцены [11].

Spectral Crest

Спектральный гребень ( spectralCrest ) измеряет отношение максимума спектра к среднему арифметическому спектра [1]:

гребень=max (skϵ[b1,b2])1b2-b1k=b1b2sk

где

  • sk спектральное значение в интервале k. Спектр значения и спектр мощности оба обычно используются.

  • b1 и b2 ребра полосы, в интервалах, по которым можно вычислить спектральный гребень.

Спектральный гребень является индикацией относительно остроконечности спектра. Более высокий спектральный гребень указывает на большее количество тональности, в то время как более низкий спектральный гребень указывает на большее количество шума.

[audio,fs] = audioread('WaveGuideLoopOne-24-96-stereo-10secs.aif');
audio = sum(audio,2)/2;

noise = (2*rand(numel(audio),1)-1).*linspace(0,0.2,numel(audio))';

audio = audio + noise;

crest = spectralCrest(audio,fs);

subplot(2,1,1)
t = linspace(0,size(audio,1)/fs,size(audio,1));
plot(t,audio)
ylabel('Amplitude')

subplot(2,1,2)
t = linspace(0,size(audio,1)/fs,size(crest,1));
plot(t,crest)
ylabel('Crest')
xlabel('Time (s)')

Spectral Flux

Спектральный поток ( spectralFlux ) является мерой изменчивости спектра в зависимости от времени [12]:

поток(t)=(k=b1b2|sk(t)-sk(t-1)|p)1p

где

  • sk спектральное значение в интервале k. Спектр значения и спектр мощности оба обычно используются.

  • b1 и b2 ребра полосы, в интервалах, по которым можно вычислить спектральный поток.

  • p тип нормы.

Спектральный поток обычно используется в обнаружении начала [13] и аудио сегментация [14]. Например, удары в дорожке ударных соответствуют высокому спектральному потоку.

[audio,fs] = audioread('FunkyDrums-48-stereo-25secs.mp3');
audio = sum(audio,2)/2;

flux = spectralFlux(audio,fs);

subplot(2,1,1)
t = linspace(0,size(audio,1)/fs,size(audio,1));
plot(t,audio)
ylabel('Amplitude')

subplot(2,1,2)
t = linspace(0,size(audio,1)/fs,size(flux,1));
plot(t,flux)
ylabel('Flux')
xlabel('Time (s)')

Spectral Slope

Спектральный наклонный ( spectralSlope ) измеряет объем уменьшения спектра [15]:

наклон=k=b1b2(fk-μf)(sk-μs)k=b1b2(fk-μf)2

где

  • fk частота в Гц, соответствующем интервалу k.

  • μf средняя частота.

  • sk спектральное значение в интервале k. Спектр значения обычно используется.

  • μs среднее спектральное значение.

  • b1 и b2 ребра полосы, в интервалах, по которым можно вычислить спектральный наклон.

Спектральный наклон использовался экстенсивно в речевом анализе, особенно в моделировании напряжения динамика [19]. Наклон непосредственно связан с резонирующими характеристиками вокальных сгибов и был также применен к идентификации динамика [21]. Спектральный наклон является социально важным аспектом тембра. Спектральная наклонная дискриминация, как показывали, произошла в ранней разработке детства [20]. Спектральный наклон является самым явным, когда энергия в более низких формантах намного больше, чем энергия в более высоких формантах.

[female,femaleFs] = audioread('FemaleSpeech-16-8-mono-3secs.wav');
female = female./max(female);


femaleSlope = spectralSlope(female,femaleFs);
t = linspace(0,size(female,1)/femaleFs,size(femaleSlope,1));
subplot(2,1,1)
spectrogram(female,round(femaleFs*0.05),round(femaleFs*0.04),round(femaleFs*0.05),femaleFs,'yaxis','power')

subplot(2,1,2)
plot(t,femaleSlope)
title('Female Speaker')
ylabel('Slope')
xlabel('Time (s)')

Spectral Decrease

Спектральное уменьшение ( spectralDecrease ) представляет объем уменьшения спектра при подчеркивании наклонов более низких частот [1]:

уменьшение=k=b1+1b2sk-sb1k-1k=b1+1b2sk

где

  • sk спектральное значение в интервале k. Спектр значения обычно используется.

  • b1 и b2 ребра полосы, в интервалах, по которым можно вычислить спектральное уменьшение.

Спектральное уменьшение используется менее часто, чем спектральный наклон в речевой литературе, но это обычно используется, наряду с наклоном, в анализе музыки. В частности, спектральное уменьшение, как показывали, выполняло хорошо как функция в инструментальном распознавании. [22]

[guitar,guitarFs] = audioread('RockGuitar-16-44p1-stereo-72secs.wav');
guitar = mean(guitar,2);
[drums,drumsFs] = audioread('RockDrums-44p1-stereo-11secs.mp3');
drums = mean(drums,2);

guitarDecrease = spectralDecrease(guitar,guitarFs);
drumsDecrease = spectralDecrease(drums,drumsFs);

t1 = linspace(0,size(guitar,1)/guitarFs,size(guitarDecrease,1));
t2 = linspace(0,size(drums,1)/drumsFs,size(drumsDecrease,1));

subplot(2,1,1)
plot(t1,guitarDecrease)
title('Guitar')
ylabel('Decrease')
axis([0 10 -0.3 0.3])

subplot(2,1,2)
plot(t2,drumsDecrease)
title('Drums')
ylabel('Decrease')
xlabel('Time (s)')
axis([0 10 -0.3 0.3])

Spectral Rolloff Point

Спектральный спад указывает ( spectralRolloffPoint, ) измеряет пропускную способность звукового сигнала путем определения интервала частоты, под которым данный процент полной энергии существует [12]:

СпадТочка=i  такойэто  k=b1i|sk|=κk=b1b2sk

где

  • sk спектральное значение в интервале k. Спектр значения и спектр мощности оба обычно используются.

  • b1 и b2 ребра полосы, в интервалах, по которым можно вычислить спектральный поток.

  • κ заданный энергетический порог, обычно 95% или 85%.

i преобразован в Гц, прежде чем он будет возвращен spectralRolloffPoint.

Спектральная точка спада использовалась, чтобы различать речевую и неречевую речь, дискриминация речи/музыки [12], музыкальная классификация [16] жанров, акустическое распознавание сцены [17], и музыкальную классификацию [18] настроения. Например, наблюдайте различное среднее значение и отклонение точки спада для речи, рок-гитары, акустической гитары и акустической сцены.

dur = 5; % Clip out 5 seconds from each file.

[speech,fs1] = audioread('SpeechDFT-16-8-mono-5secs.wav');
speech = speech(1:min(end,fs1*dur));

[electricGuitar,fs2] = audioread('RockGuitar-16-44p1-stereo-72secs.wav');
electricGuitar = mean(electricGuitar,2); % Convert to mono for comparison.
electricGuitar = electricGuitar(1:fs2*dur);

[acousticGuitar,fs3] = audioread('SoftGuitar-44p1_mono-10mins.ogg');
acousticGuitar = acousticGuitar(1:fs3*dur);

[acousticScene,fs4] = audioread('MainStreetOne-24-96-stereo-63secs.wav');
acousticScene = mean(acousticScene,2); % Convert to mono for comparison.
acousticScene = acousticScene(1:fs4*dur);

r1 = spectralRolloffPoint(speech,fs1);
r2 = spectralRolloffPoint(electricGuitar,fs2);
r3 = spectralRolloffPoint(acousticGuitar,fs3);
r4 = spectralRolloffPoint(acousticScene,fs4);

t1 = linspace(0,size(speech,1)/fs1,size(r1,1));
t2 = linspace(0,size(electricGuitar,1)/fs2,size(r2,1));
t3 = linspace(0,size(acousticGuitar,1)/fs3,size(r3,1));
t4 = linspace(0,size(acousticScene,1)/fs4,size(r4,1));

figure
plot(t1,r1)
title('Speech')
ylabel('Rolloff Point (Hz)')
xlabel('Time (s)')
axis([0 5 0 4000])

figure
plot(t2,r2)
title('Rock Guitar')
ylabel('Rolloff Point (Hz)')
xlabel('Time (s)')
axis([0 5 0 4000])

figure
plot(t3,r3)
title('Acoustic Guitar')
ylabel('Rolloff Point (Hz)')
xlabel('Time (s)')
axis([0 5 0 4000])

figure
plot(t4,r4)
title('Acoustic Scene')
ylabel('Rolloff Point (Hz)')
xlabel('Time (s)')
axis([0 5 0 4000])

Ссылки

[1] Петерс, G. "Большой набор функций аудио для звукового описания (Подобие и классификация) в проекте CUIDADO". Технический отчет; IRCAM: Париж, Франция, 2004.

[2] Серый, Джон М. и Джон В. Гордон. “Перцепционные Эффекты Спектральных Модификаций на Музыкальных Тембрах”. Журнал Акустического Общества Америки. Издание 63, Выпуск 5, 1978, стр 1493–1500.

[3] Raimy, Эрик и Чарльз Э. Кэрнс. Сегмент в фонетике и фонологии. Хобокен, NJ: John Wiley & Sons Inc., 2015.

[4] Джонгмен, Allard, и др. “Акустические Характеристики английских Фрикативных звуков”. Журнал Акустического Общества Америки. Издание 108, Выпуск 3, 2000, стр 1252–1263.

[5] С. Чжан, И. Го и Ц. Чжан, "Устойчивый Речевой Проект Функции Обнаружения Действия На основе Спектрального Эксцесса". Первый Международный семинар на Образовательной Технологии и Информатике, 2009, стр 269–272.

[6] Misra, H., С. Икбэл, Х. Боерлард и Х. Херманский. "Спектральная основанная на энтропии функция устойчивого ASR". 2 004 международных конференции IEEE по вопросам акустики, речи и обработки сигналов.

[7] А. Пикракис, Т. Джиэннэкопулос и С. Зэодоридис. "В вычислительном отношении Эффективный Различитель Речи/Музыки для Радио-Записей". Международная конференция по вопросам Музыкального Информационного поиска и Связанных Действий, 2006.

[8] Pikrakis, A., и др. “Различитель Речи/Музыки Радио-Записей На основе Динамического Программирования и Байесовых Сетей”. Транзакции IEEE на Мультимедиа. Издание 10, Выпуск 5, 2008, стр 846–857.

[9] Джонстон, J.d. “Преобразуйте Кодирование Звуковых сигналов Используя Перцепционные Шумовые Критерии”. Журнал IEEE на Выбранных областях в Коммуникациях. Издание 6, Выпуск 2, 1988, стр 314–323.

[10] Lehner, Бернхард, и др. “На Сокращении Ложных Положительных сторон в Обнаружении Певческого голоса”. 2 014 Международных конференций IEEE по вопросам Акустики, Речи и Обработки сигналов (ICASSP), 2014.

[11] И. Пететин, К. Ларош и А. Майоу, "Глубокие нейронные сети для аудио распознавания сцены", 2 015 23-х европейских конференций по обработке сигналов (EUSIPCO), 2015.

[12] Scheirer, E. и М. Слэни. “Конструкция и Оценка Устойчивого Различителя Речи/Музыки Мультифункции”. 1 997 Международных конференций IEEE по вопросам Акустики, Речи и Обработки сигналов, 1997.

[13] С. Диксон, "Пересмотренное Обнаружение Начала". Международная конференция по вопросам Эффектов Цифрового аудио. Издание 120, 2006, стр 133–137.

[14] Tzanetakis, G. и П. Кук. “Мультипокажите аудио сегментацию для просмотра и аннотации”. Продолжения 1 999 семинаров IEEE по приложениям обработки сигналов к аудио и акустике, 1999.

[15] Lerch, Александр. Введение в аналитические приложения звукового содержимого в информатике обработки сигналов и музыки. Пискатауэй, NJ: нажатие IEEE, 2012.

[16] Литий, дао и М. Оджихара. "Музыкальная классификация жанров с таксономией". Международная конференция IEEE по вопросам акустики, речи и обработки сигналов, 2005.

[17] Eronen, A.j., V.t. Peltonen, J.t. Туоми, A.p. Klapuri, С. Фэджерланд, Т. Сорса, Г. Лорхо и Дж. Хуопэними. "Основанное на аудио Распознавание Контекста". Транзакции IEEE на Аудио, Речи и Обработке Языка. Издание 14, Выпуск 1, 2006, стр 321–329.

[18] Жэнь, Jia-Min, Мин-Цзюй Ву и Джих-Шинг Роджер Дженг. "Автоматическая Музыкальная Классификация Настроения На основе Функций Тембра и Модуляции". Транзакции IEEE на Эмоциональных вычислениях. Издание 6, Выпуск 3, 2015, стр 236–246.

[19] Хансен, Джон Х. Л. и Санджай Патил. "Речь Под Напряжением: Анализ, Моделирование и Распознавание". Читайте лекции Примечаниям в Информатике. Издание 4343, 2007, стр 108–137.

[20] Цанг, Кристин Д. и Лорель Дж. Трейнор. "Спектральная Наклонная Дискриминация в Младенчестве: Чувствительность к Социально Важным Тембрам". Младенческое Поведение и Разработка. Издание 25, Выпуск 2, 2002, стр 183–194.

[21] Murthy, H.a., Ф. Беофейс, L.p. Heck и М. Вейнтроб. "Устойчивая Независимая от текста Идентификация Динамика по Телефонным Каналам". Транзакции IEEE о Речи и Обработке аудиоданных. Издание 7, Выпуск 5, 1999, стр 554–568.

[22] Essid, S., Г. Ричард и Б. Дэвид. "Инструментальное Распознавание в Полифонической Музыке На основе Автоматического Taxonomies". Транзакции IEEE на Аудио, Речи и Обработке Языка. Vol 14, Выпуск 1, 2006, стр 68–80.

Для просмотра документации необходимо авторизоваться на сайте