Figure 4 Equao 1.
Como pode ser visto na equao anterior, Ej,k uma por processar a matriz de entrada o mtodo predictFcn(...)
matriz de energias que representam as caractersticas presente na estrutura de dados do classificador. Esta funo foi
desejveis do sinal transformado. No artigo de Khushaba et al, utilizada na funo reconhecerLocutor(...) que recebe como
aps obter esta matriz aplicado sob ela um conjunto de entrada o sinal de udio do locutor, processa o sinal, extrai
ponderaes utilizando a lgica Fuzzy. Este conjunto de caractersticas e classifica o locutor retornando como respostas
ponderaes esto disponveis em maiores detalhes no artigo. a classe identificada e a acurcia da identificao ou o valor
A matiz obtida pode ser assim utilizada como um conjunto de -1 caso a funo no identifique nenhum locutor
caractersticas que identificam uma classe. compatvel(Miss). As duas funes mencionadas esto
Para utilizar o algoritmo disponibilizado online por disponveis nos anexos deste trabalho.
Khushaba neste projeto de reconhecimento de locutor, foi
necessrio adapt-lo para extrair somente caractersticas do
I. Base de Dados
ltimo nvel da transformada Wavelet. Essa adaptao foi feita
conforme as instrues deixadas pelo autor no artigo Feature
Extraction Using Multisignal Wavelet Packet (WP) A base de dados do sistema armazena as amostras de udio
Decomposition. O algoritmo modificado est disponvel no que foram usadas para treinamento do classificador, as
Anexo III. configuraes de durao de gravao e o classificador
treinado na forma de arquivos que so gerados dinamicamente
com o uso da aplicao pelo usurio.
G. Treinamento e Classificao
J. Programa
Obtidas as caractersticas do sinal de voz de um locutor, se
faz necessrio que um classificador estatstico seja utilizado
para relacionar essas caractersticas com a classe do locutor. Ao executar, utilizando o software MATLAB, o arquivo
Dentre os diversos classificadores estatsticos disponveis, o main.m, exibido um menu o qual o usurio pode escolher
Ensemble foi escolhido pois apresentou melhor acurcia de entre: inserir uma amostra de udio para treinamento pelo
classificao mediante o baixo nmero de amostras recolhidas microfone; inserir uma amostra de udio para treinamento a
para teste e classificao, cerca de 94%. partir de um arquivo WAVE; reconhecer um locutor a partir
Nesta etapa, todos os intrigantes do projeto foram usados do microfone; reconhecer um locutor a partir de um arquivo
como locutores para aquisio de amostras de treinamento. WAVE; e, treinar manualmente o classificador para exibir a
Sabendo a classe do locutor e obtido sua matriz de acurcia.
caractersticas, esses dados foram enviados para o Optando por inserir amostras, ser necessrio que o
classificador para treinamento. A funo utilizada para isto foi usurio entre com a durao do udio para gravao pelo
o mtodo trainClassifier(...) que recebe como entrada uma microfone ou o nome do arquivo WAVE que ser includo na
matriz 17xN onde a primeira coluna representa as classes, as base de dados. Se o usurio optar por reconhecer o locutor,
16 outras colunas representam as caractersticas de cada ser necessrio fornecer o nome do arquivo WAVE que
locutor e N o nmero de linhas da matriz e retorna um contm a amostra de udio ou que o computador contenha um
classificador treinado e a acurcia da classificao. Um microfone conectado para que seja capturado a amostra de
exemplo desta matriz de entrada pode ser na tabela 1, que se teste por ele.
encontra no apndice de tabelas.
Obtido um classificador treinado, ele salvo em arquivo K. Teste de classificao
para ser utilizado posteriormente na etapa de teste e
classificao.
Os testes de classificao foram feitos com base em
amostras de udio dos locutores reservadas para teste. Essas
H. Teste amostras estavam armazenadas na base de dados do sistema.
As amostras de teste e de treinamento foram obtidas em um
A etapa de teste consiste em utilizar o classificador estdio de gravao parcialmente livre de rudos no interior do
treinado para classificar o locutor de um sinal de voz pr- campus da UTFPR-CP.
processado. Obtm-se uma matriz de caractersticas do sinal
de teste que enviada como parmetro para o classificador. O L. Casos de Teste
classificador ter o trabalho de comparar as caractersticas
desta matriz com o que ele aprendeu na etapa de treinamento
para ento classificar quais classes pertencem as Foram elaborados casos de testes para verificar se o
comportamento do sistema quando ele submetido locutores
caractersticas da matriz. O resultado deste processo dada na
falando a mesma palavra e quando os locutores falam palavras
forma de outra matriz que relaciona cada linha de
aleatoriamente. Os casos de testes escolhido esto
caracterstica da matriz de entrada da funo com uma classe
relacionados a seguir:
identificada. Sendo assim, a classe que mais se repetir na
matriz de sada, a classe identificada. A funo responsvel
Classificador treinado com palavra 'teste' e verificada com
palavra 'teste'
Classificador treinado com palavra 'teste' e verificada com IV. REFERNCIAS
palavras aleatrias
Classificador treinado com palavras aleatrias e verificada [1] Niedu, Guilherme. Biometria Impresso Vocal:
com palavra 'teste' https://www.gta.ufrj.br/grad/08_1/bio-voz/Locutor.html
Classificador treinado com palavras aleatrias e verificada [2] Zhang, Zhengyou. Speaker Verification: Text-Dependent vs. Text-
Independet: https://www.microsoft.com/en-us/research/project/speaker-
com palavras aleatrias verification-text-dependent-vs-text-independent/
[3] Rodrguez, David Sierra, Text-Independent Speaker Identification:
http://www.dsp.agh.edu.pl/_media/pl:thesis.pdf
M. Estatsticas
[4] Pinheiro, M.Hedenir. Aplicao de Ensembles de Classificadores na
Deteco de Patologia na Coluna Vertebral Instituto de Informtica
Com os testes realizados com base nos quatro casos de Universidade Federal de Gois.
teste citados anteriormente, foram obtidas estatsticas de [5] Vriesamnn L.M; "Seleco Dinmica de subconjunto de classificadores:
Abordagem baseada em Acurcia Local". Curitiba, pg 50-70, 2012.
reconhecimento de locutores pelo sistema. As estatsticas
[6] denoiseEm.m :
foram organizadas na forma de tabelas e levam em http://www.kelidestan.com/forum/showthread.php?tid=4443&pid=6714
considerao os acertos do classificador, os erros e quando o [7] A method for silence removal and segmentation of speech signals,
classificador no foi capaz de classificar um locutor (Miss, ou implemented in Matlab:
-1), como pode ser visto no apndice de tabelas. https://www.mathworks.com/matlabcentral/fileexchange/28826-silence-
removal-in-speech-signals
[8] Feature Extraction Using Multisignal Wavelet Packet(WP)
III. ANLISE DOS RESULTADOS Decomposition:
https://www.mathworks.com/matlabcentral/fileexchange/28826-silence-
removal-in-speech-signals
Para compreender as tabelas a base de dados possui quatro [9] NALON, Jos Alexandre. Introduo ao processamento digital de sinais.
locutores, sendo cada locutor classificado como uma classe, Rio de Janeiro, RJ: LTC, 2009. 200 p. 130-153.
sendo locutor um chamado de classe um, locutor dois, classe [10] P. C. de Lima, Wavelets: uma introduo, Matemtica Universitria,
vol. 33, pp. 1344, 2002.
dois e assim por diante at o locutor quatro classe quatro. A
[11] RUSSEL, Stuart J. NORVIG, Peter. Inteligncia Artificial. Rio de
classificao miss indica que o classificador no foi capaz de Janeiro, RJ: Elsiever, 2013. P. 795-800.
classificar. [12] MathWorks Documentation, disponvel em:
De acordo com a tabela II, cada locutor pronunciou cinco https://www.mathworks.com/help/wavelet/ug/wavelet-packets.html.
vezes a palavra teste para popular a base de dados e fazer o Acessado em 18 de junho de 2017.
treinamento. Para verificar o treinamento foi comparado com a
mesma palavra, do total de vinte dados, o treinamento resultou
em dezesseis acertos, dando uma margem de 80% de acerto,
dois erros(10 %) onde classificou o locutor dois como se fosse
o locutor trs e teve dois miss(10%).
O resultado miss que surgiu apenas no locutor um
provvel que seja pela entonao da voz do locutor onde deu
para notar que cada seu tom de voz foi diferente para cada um
dado gravado.
O segundo caso, referente a tabela III, a base foi treinada
com a palavra teste para classificar foi comparado com
palavras aleatrias.
O acerto foi de apenas 20%, erro de 10% e 70% de miss.
O terceiro caso, referente a tabela IV, a base foi treinada
com palavras aleatrias e verificada com a palavra teste, o
resultado foi de 25% de acerto, 70% de erro e 5% de miss.
O quarto caso, referente a tabela V, a base foi treinada com
palavras aleatrias e verificada com palavras aleatrias, o
resultado foi de 25% de acerto, 55% de erro e 20% de miss.
De acordo com os resultados notamos que o sistema de
reconhecimento de locutor dependente de palavra, com isso
o nvel de confiana e preciso muito baixo, no sendo
seguro para ser utilizado. O sistema deve ocorrer melhorias
para ser independente de palavra, para isso o extrator de
caractersticas precisa ser aprimorado.
Para projetos futuros recomendvel utilizar a MFCC(Mel
Frequency Cepstral Coefficients) no lugar de wavelets.
V. APNDICE DE TABELAS 4 4 Sim
4 4 Sim
Table 1 Caractersticas dos locutores
Caractersticas 4 4 Sim
Classe
C1 C2 C3 C4 ... C16 Acertos: 16
-
%Acertos: 80
4 -8,66 -8,92 10,05 -9,22 ... -9,85
4 -9,02 -9,16 -9,76 -9,19 ... -10,21 Miss: 2
- %Miss: 10
2 -8,63 -9,39 10,34 -9,26 ... -10,32
-
2 -9,83 -10,07 11,01 -10,45 ... -11,03 Table 3 - Teste - Aleatrias
- 2 Caso: base treinada com palavra 'teste' e
3 -9,55 -10,06 11,03 -10,49 ... -11,07 verificada com palavras aleatrias
- -
3 10,01 -10,23 11,22 -10,53 ... -11,10
-
1 -9,35 -10,14 11,41 -10,96 ... -11,46 Locutor
- Acerto
Esperado Obtido
1 -9,32 -10,15 11,31 -10,93 ... -11,34
N ... ... ... ... ... ... 1 -1 No
1 -1 No
Table 2 - Teste-Teste 1 -1 No
1 Caso: Base treinada com palavra 'teste' e 1 2 No
verificada com palavra 'teste'
1 -1 No
Locutor 2 -1 No
Acerto
Esperado Obtido 2 -1 No
1 -1 No 2 -1 No
1 1 Sim 2 2 Sim
1 -1 No 2 2 Sim
1 1 Sim 3 -1 No
1 1 Sim 3 2 No
2 3 No 3 -1 No
2 2 Sim 3 -1 No
2 2 Sim 3 -1 No
2 2 Sim 4 -1 No
2 3 No 4 4 Sim
3 3 Sim 4 4 Sim
3 3 Sim 4 -1 No
3 3 Sim 4 -1 No
3 3 Sim Acertos: 4
3 3 Sim %Acertos: 20
4 4 Sim Miss: 14
4 4 Sim %Miss: 70
Table 5 - Aleatrias - Aleatrias
4 Caso: base treinada com palavras aleatrias e
Table 4 - Aleatrias - Teste verificada com palavras aleatrias
3 Caso: base treinada com palavras aleatrias e
verificada com palavra 'teste'
Locutor
Acerto
Locutor Esperado Obtido
Acerto 1 4 No
Esperado Obtido
1 -1 No
1 4 No
1 -1 No
1 4 No
1 -1 No
1 4 No
1 4 No
1 4 No
2 4 No
1 4 No
2 4 No
2 4 No
2 4 No
2 4 No
2 4 No
2 4 No
2 4 No
2 4 No
3 4 No
2 -1 No
3 4 No
3 4 No
3 4 No
3 4 No
3 4 No
3 4 No
3 -1 No
3 4 No
4 4 Sim
3 4 No
4 4 Sim
4 4 Sim
4 4 Sim
4 4 Sim
4 4 Sim
4 4 Sim
4 4 Sim
4 4 Sim
Acertos: 5
4 4 Sim
%Acertos: 25
Acertos: 5
Miss: 4
%Acertos: 25
%Miss: 20
Miss: 1
%Miss: 5
VI. ANEXO DE CDIGOS [y, cxc, lxc, perf0, perfl2]=wdencmp( 'gbl' ,x, 'db3'
,2,thr,sorh,keepapp);
A. Anexo I
B. Anexo II
function y = filtrar(y)
Fs=6800; function [segments, fs] = detectVoiced(x,fs,t)
%filtro passa-faixas %
N = 3; % function [segments, fs] = detectVoiced(wavFileName)
fc1 = 50; fc2 = 3399.99; %
wc = (2 * [fc1 fc2])/Fs; % Theodoros Giannakopoulos
[P,Q] = butter(N,wc,'bandpass'); % http://www.di.uoa.gr/~tyiannak
y = filter(P,Q,y); %
% (c) 2010
%filtro de ruido %
y = denoiseEm(y); % This function implements a simple voice detector. The
algorithm is
% described in more detail, in the readme.pdf file
%removedor de silencio %
y = cell2mat( detectVoiced(y,Fs)); % ARGUMENTS:
% - wavFileName: the path of the wav file to be analyzed
% %filtro de mdia mvel % - t: if provided, the detected voiced segments are played
% P = (1/N)*ones(1,N); and some
% Q = 1; % intermediate results are also ploted
% y = filter(P,Q,y); %
% sound(y,Fs); % RETURNS:
% pause(2); % - segments: a cell array of M elements. M is the total
number of
% detected segments. Each element of the cell array is a
% %filtro envelope rms vector of audio
% wl = 30; % samples of the respective segment.
% [up,down] =envelope(y,wl,'rms'); % - fs: the sampling frequency of the audio signal
% sound(up,Fs); %
% pause(2); % EXECUTION EXAMPLE:
% %
% % [segments, fs] = detectVoiced('example.wav',1);
% y = up; %
%
function y = denoiseEm(x); %
% y = denoiseEm(x); % % Check if the given wav file exists:
% method to denoise a given signal using wavelets % fp = fopen(wavFileName, 'rb');
% x is the input Matlab sound file % if (fp<0)
% fprintf('The file %s has not been found!\n', wavFileName);
%THR is the threshold, SORH is for soft or hard thresholding, % return;
KEEPAPP allows you to keep % end
%approximation coefficients % fclose(fp);
[thr,sorh,keepapp]=ddencmp( 'den' , 'wv' ,x); %
% % Check if .wav extension exists:
% returns a de-noised version xc of input signal x (our one- % if (strcmpi(wavFileName(end-3:end),'.wav'))
dimensional speech signal) % % read the wav file name:
%obtained by wavelet coefficients thresholding using global % [x,fs] = wavread(wavFileName);
positive threshold THR % else
%PERF0 and PERFL2 are L2-norm recovery and compression % fprintf('Unknown file type!\n');
score in percentage. % return;
% end
Flags1 = (E>=T_E);
% Convert mono to stereo Flags2 = (C>=T_C);
if (size(x, 2)==2) flags = Flags1 & Flags2;
x = mean(x')';
end if (nargin==3) % plot results:
clf;
% Window length and step (in seconds): subplot(3,1,1); plot(Eor, 'g'); hold on; plot(E, 'c');
win = 0.050; legend({'Short time energy (original)', 'Short time energy
step = 0.050; (filtered)'});
L = line([0 length(E)],[T_E T_E]); set(L,'Color',[0 0 0]);
%%%%%%%%%%%%%%%%%%%%%%%%%%% set(L, 'LineWidth', 2);
% THRESHOLD ESTIMATION axis([0 length(Eor) min(Eor) max(Eor)]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(3,1,2); plot(Cor, 'g'); hold on; plot(C, 'c');
Weight = 5; % used in the threshold estimation method legend({'Spectral Centroid (original)', 'Spectral Centroid
(filtered)'});
% Compute short-time energy and spectral centroid of the L = line([0 length(C)],[T_C T_C]); set(L,'Color',[0 0 0]);
signal: set(L, 'LineWidth', 2);
Eor = ShortTimeEnergy(x, win*fs, step*fs); axis([0 length(Cor) min(Cor) max(Cor)]);
Cor = SpectralCentroid(x, win*fs, step*fs, fs); end
function amostraArquivo(id,arquivo,tocar,treinar)
[y,Fs] = audioread(arquivo);%Obtndo dados de udio %busca a menor distancia na matriz e retorna a classe
gravados no objeto audiorecord com getaudiodata. encontrada;
if(Fs> 6800) %//////////////////////////////////////////////////////////////////////////
newFs = 6800 ;
[P,Q] = rat(newFs/Fs); basesFaltantes = 0;
Fs = newFs;
y = y(:,1); feats = [];
y = resample(y,P,Q); y = amostraTeste();
end classe = reconhecerLocutor(y);
if tocar
sound(y,Fs); end
end
try
load databaseArquivo H. Anexo VIII
ids = [ids id];
sons = [sons y]; function classe = testarArquivo(arquivo)
save databaseArquivo ids sons; %%captura som de cada amostra e coloca no banco de dados
catch junto com o id da classe
ids = id; %Fs 2x 3400Hz
sons = y;
save databaseArquivo ids sons; %%Quando for tentar identificar uma pessoa:
end %%Obter uma amostra de udio
if treinar %Fs 2x 3400Hz
treinarClassificador(); %% aplica filtro passa faixas de 50Hz 3400Hz
end %%obter 16 caracteristicas de energia no sinal em uma
end determinada janela e
%%insere em um vetor A
G. Anexo VII
%%para cada som no banco de dados aplica filtro passa faixas
de 50Hz 3400Hz
function classe = testarVoz() %%obtem 16 caracteristicas de energia no sinal em uma
%%captura som de cada amostra e coloca no banco de dados determinada janela
junto com o id da classe %%relaciona o id da amostra e suas 16 caracteristicas em um
%Fs 2x 3400Hz vetor e o
%%adiciona em uma matriz;
%%Quando for tentar identificar uma pessoa:
%%Obter uma amostra de udio %%usando um cassificador
%%para cada vetor da matriz, calcula a aproximao das basesFaltantes = basesFaltantes+1;
caracteristicas registradas e da atual entre as end
%%caracteristicas do vetor A e as caracteristicas do vetor da try
matriz. load databaseArquivo
[l,c] = size(sons);
%busca a menor distancia na matriz e retorna a classe
encontrada; for i=1:c
%////////////////////////////////////////////////////////////////////////// som = sons(:,i);
continuar = true; somFeats = features(som);
try [lFeats,cFeats] = size(somFeats);
if(isempty(arquivo))
continuar = false; id_classe = repmat(ids(i),lFeats,1);
end classe = zeros(1,4);
catch classe(ids(i)) = 1;
continuar = false; classe = repmat(classe,lFeats,1);
end feats = [feats; [id_classe somFeats]];
if ~continuar featsRNAReady = [featsRNAReady; somFeats];
disp('O arquivo no pode ser vazio.'); classesRNAReady = [classesRNAReady; classe];
classe = -1; % figure;
return; % scatter(somFeats,yFeats);
end % lsline
[y,Fs] = audioread(arquivo); end
classe = reconhecerLocutor(y); catch
basesFaltantes = basesFaltantes+1;
end end
I. Anexo IX
if(basesFaltantes>1)
error('No possvel continuar. As bases de dados esto
function [trainedClassifier, validationAccuracy] = vazias.');
treinarClassificador() return;
end
basesFaltantes = 0; featsRNAReady = featsRNAReady';
classesRNAReady= classesRNAReady';
feats = []; save features feats featsRNAReady classesRNAReady ;
featsRNAReady = [];
classesRNAReady = []; disp('Treinando classificador...');
try [trainedClassifier, validationAccuracy] = trainClassifier(feats);
load database save cassificador trainedClassifier validationAccuracy
[l,c] = size(sons);
J. Anexo X
for i=1:c
som = sons(:,i); function [trainedClassifier, validationAccuracy] =
somFeats = features(som); trainClassifier(trainingData)
[lFeats,cFeats] = size(somFeats); % trainClassifier(trainingData)
% returns a trained classifier and its accuracy.
id_classe = repmat(ids(i),lFeats,1); % This code recreates the classification model trained in
classe = zeros(1,4); % Classification Learner app.
classe(ids(i)) = 1; %
classe = repmat(classe,lFeats,1); % Input:
feats = [feats; [id_classe somFeats]]; % trainingData: the training data of same data type as
featsRNAReady = [featsRNAReady; somFeats]; imported
classesRNAReady = [classesRNAReady; classe]; % in the app (table or matrix).
% figure; %
% scatter(somFeats,yFeats); % Output:
% lsline % trainedClassifier: a struct containing the trained
end classifier.
catch
% The struct contains various fields with information 'column_10', 'column_11', 'column_12', 'column_13',
about the 'column_14', 'column_15', 'column_16', 'column_17'};
% trained classifier. predictors = inputTable(:, predictorNames);
% response = inputTable.column_1;
% trainedClassifier.predictFcn: a function to make isCategoricalPredictor = [false, false, false, false, false, false,
predictions false, false, false, false, false, false, false, false, false, false];
% on new data. It takes an input of the same form as this
training % Train a classifier
% code (table or matrix) and returns predictions for the % This code specifies all the classifier options and trains the
response. classifier.
% If you supply a matrix, include only the predictors subspaceDimension = max(1, min(8, width(predictors) - 1));
columns (or classificationEnsemble = fitensemble(...
% rows). predictors, ...
% response, ...
% validationAccuracy: a double containing the accuracy in 'Subspace', ...
% percent. In the app, the History list displays this 30, ...
% overall accuracy score for each model. 'KNN', ...
% 'Type', 'Classification', ...
% Use the code to train the model with new data. 'NPredToSample', subspaceDimension, ...
% To retrain your classifier, call the function from the 'ClassNames', [1; 2; 3; 4]);
command line
% with your original data or new data as the input argument % Create the result struct with predict function
trainingData. predictorExtractionFcn = @(x) array2table(x,
% 'VariableNames', predictorNames);
% For example, to retrain a classifier trained with the original ensemblePredictFcn = @(x) predict(classificationEnsemble,
data set x);
% T, enter: trainedClassifier.predictFcn = @(x)
% [trainedClassifier, validationAccuracy] = ensemblePredictFcn(predictorExtractionFcn(x));
trainClassifier(T)
% % Add additional fields to the result struct
% To make predictions with the returned 'trainedClassifier' on trainedClassifier.ClassificationEnsemble =
new data T, classificationEnsemble;
% use trainedClassifier.About = 'This struct is a trained classifier
% yfit = trainedClassifier.predictFcn(T) exported from Classification Learner R2016a.';
% trainedClassifier.HowToPredict = sprintf('To make predictions
% To automate training the same classifier with new data, or on a new predictor column matrix, X, use: \n yfit =
to learn how c.predictFcn(X) \nreplacing ''c'' with the name of the variable
% to programmatically train classifiers, examine the that is this struct, e.g. ''trainedClassifier''. \n \nX must contain
generated code. exactly 16 columns because this classifier was trained using
16 predictors. \nX must contain only predictor columns in
% Auto-generated by MATLAB on 09-Jun-2017 19:18:35 exactly the same order and format as your training \ndata. Do
not include the response column or any columns you did not
import into \nClassification Learner. \n \nFor more
% Extract predictors and response information, see <a href="matlab:helpview(fullfile(docroot,
% This code processes the data into the right shape for training ''stats'', ''stats.map''),
the ''appclassification_exportmodeltoworkspace'')">How to
% classifier. predict using an exported model</a>.');
% Convert input to table
inputTable = array2table(trainingData, 'VariableNames', % Extract predictors and response
{'column_1', 'column_2', 'column_3', 'column_4', 'column_5', % This code processes the data into the right shape for training
'column_6', 'column_7', 'column_8', 'column_9', 'column_10', the
'column_11', 'column_12', 'column_13', 'column_14', % classifier.
'column_15', 'column_16', 'column_17'}); % Convert input to table
inputTable = array2table(trainingData, 'VariableNames',
predictorNames = {'column_2', 'column_3', 'column_4', {'column_1', 'column_2', 'column_3', 'column_4', 'column_5',
'column_5', 'column_6', 'column_7', 'column_8', 'column_9', 'column_6', 'column_7', 'column_8', 'column_9', 'column_10',
'column_11', 'column_12', 'column_13', 'column_14', an = a/max(a);
'column_15', 'column_16', 'column_17'});
%%pega a ocorrencia normalizada 1 e associa com a
predictorNames = {'column_2', 'column_3', 'column_4', posio no vetor de
'column_5', 'column_6', 'column_7', 'column_8', 'column_9', %%clases 'b'
'column_10', 'column_11', 'column_12', 'column_13', classe = -1;
'column_14', 'column_15', 'column_16', 'column_17'}; for i=1:length(an);
predictors = inputTable(:, predictorNames); if(an(i) == 1)
response = inputTable.column_1; classe = b(i);
isCategoricalPredictor = [false, false, false, false, false, false, break;
false, false, false, false, false, false, false, false, false, false]; end
end
% Perform cross-validation
partitionedModel = if ratio > R
crossval(trainedClassifier.ClassificationEnsemble, 'KFold', 5);
%%imprime a sada
% Compute validation accuracy saida = strcat('Classe Identificada: ', num2str(classe));
validationAccuracy = 1 - kfoldLoss(partitionedModel,
'LossFun', 'ClassifError'); else
classe= -1;
K. Anexo XI
end
rCarac = [b';a]
function [classe,ratio,rCarac] = reconhecerLocutor(y); disp(saida);
yFeats = features(y); saida = strcat({'Certeza em relao as caractersticas: '},
num2str(ratio* 100),'%');
try disp(saida);
isempty(trainedClassifier); saida = strcat({'Acurcia do Classificador: '},
catch num2str(validationAccuracy* 100),'%');
try disp(saida);
load cassificador
catch
disp('O classificador ainda no foi treinado. Adicione um
som para treina-lo.');
classe = -1;
ratio = 0.0000001;
return;
end
end
%%faz a predicao no classificador
yfit = trainedClassifier.predictFcn(yFeats);