Laudo assinado pelo professor Mario Gazziro sobre áudios atribuídos a Augusto Heleno
1. PARECER TÉCNICO NCFA001-23
__________________________________________________________________
REVISTA FÓRUM
CONSULENTE
Santo André, 25 de setembro de 2023
___________________________________________________________________________________________
NCFA - Núcleo de Computação Forense Aplicada (USP e UFABC) Sede: Av. dos Estados, 5001
4o andar, Bloco L - Santo André, SP, CEP 09210-580 Tel.: (11) 3356-7676 (ramal 7676)
2. Contexto
Atendendo à solicitação da Revista Fórum, foram analisados áudios que circularam em
grupos de whatsapp e telegram em outubro de 2022, os quais incitavam a população a
incorrer em distúrbios civis e alegando categóricamente que as forças armadas iriam
tomar partido nessa iniciativa. Tais áudios foram atribuídos na época ao então ministro do
Gabinete de Segurança Institucional, General Augusto Heleno, o qual negou em seu X (à
época Twitter) a autoria dos mesmos, assim como nota oficial do GSI negou a atribuição
ao seu então chefe.
Na ocasião, apenas a negativa oficial por parte do acusado (e de seus subordinados)
foram tratadas como suficientes pela imprensa da época para categorizar a disseminação
de tais áudios atribuídas ao general como Fake News, sendo que um autor efetivo nunca
foi responsabilizado por tal ato. No entanto, a gravidade dos acontecimentos dos meses
subsequentes que culminaram nos eventos catastróficos de destruição de patromônio
público no dia 8 de janeiro de 2023 em Brasilia, DF, chamou a atenção da sociedade e
dos meios de imprensa, assim como dos pesquisadores acadêmicos, de modo que se
iniciou uma revisão dos fatores que levaram a esse fenômeno, tendo sido implantada
inclusive uma Comissão Parlamentar Mista de Inquérito no Senado Federal.
Dentro desse contexto, foi considerado revisar a busca do verdadeiro autor que tenha
criado tais áudios subversivos, enfáticos e categóricos, e o ponto de partida para essa
busca incorreria justamente em primeiramente isentar de forma técnica e definitiva a
alegação de atribuição ao seu suposto autor, General Augusto Heleno. Eis que para
nossa surpresa, ao realizar o mesmo protocolo de análise e comparação de biometria
vocal - o qual já foi utilizado várias vezes por nosso laboratório para inocentar figuras de
destaque nacional - constatamos, após análise de 40 partições, que os áudios
PERTENCEM AO SUPOSTO AUTOR, com intervalo de confiança de 87%, em uma
análise conclusiva de confirmação de sua autoria, visto o resultado estar acima de 85%.
3. METODOLOGIA
Em função da suspeita de uso de tecnologias que fazem uso das chamadas deepfake
news, o uso de técnicas convencionais de análise forense de áudio – a listar: análises
perceptivo-auditivas (segmentais, suprassegmentais, fatores paralinguísticos e dialetais),
análises acústicas, frequência fundamental F0, formantes e até mesmo VOT (tempo de
ataque de vozeamento) – não foi recomendado, justamente pelo fato de que tais análises
são susceptíveis de serem enganadas pela nova tecnologia.
Adotamos então um método mais novo e mais robusto contra esse novo advento
tecnológico e ameaçador, que são as deepfake news, a chama análise de coeficientes
cepstrais em escala Mel, ou MFCC, a qual produz uma biometria vocal do interlocutor,
através da geração de um mapa gráfico de características pertinentes a nuances do seu
trato vocal, o qual tem características únicas de pessoa para pessoa, similar a impressão
digital.
Tal método foi elaborado em 2004 e publicado cientificamente por Hasan et al, descrito
no artigo “SPEAKER IDENTIFICATION USING MEL FREQUENCY CEPSTRAL
COEFFICIENTS”, de Hasan, R. et al. E apresentado na 3rd International Conference on
Electrical Computer Engineering ICECE 2004 em dezemro de 2004.
4. RESULTADOS
A figura a seguir apresenta o mapa cepstral da voz do General Augusto Heleno, criado a
partir de uma entrevista dele no Youtube (www.youtube.com/watch?v=PmnRD564_h0)
cuja autenticidade é inquestionável devido a natureza oficial do video (canalGOV, a Voz
do Brasil). Já os suspostos áudios atribuídos ao General Augusto Heleno que foram
enviados ao pesquisador por representante da Revista Fórum foram disponibilizados em
seu canal no Youtube, cujos links são apresentados aqui: https://youtu.be/KM8XO5AguSc
e https://youtu.be/BefrwT-WFm4.
Todos os videos foram segmentados manualmente em trechos com cerca de 6 segundos,
garantindo que cada trecho se referisse apenas à voz do indivíduo analisado, de forma a
garantir que não ocorriam ruidos ambientes durante a fala e de que o trecho da fala
pertencesse ao individuo investigado, e não a algum locutor no ambiente. Feito isso, foi
aplicada a análise técnica descrita na seção anterior em 40 partições desses áudios, que
geraram os referidos mapas de biometria de voz (que pode ser entendidos com se
fossem a impressão digital da voz, tal qual uma impressão do polegar identifica
unicamente uma pessoa), os quais por sua vez tiveram sua verosimilhança atestada com
um método de inteligência artificial não supervisionado chamado KNN (rede de vizinhos).
5. CONCLUSÃO
Portanto, as evidências indicam que os áudios PERTENCEM AO SUPOSTO AUTOR,
com intervalo de confiança de 87%, em uma análise conclusiva de confirmação de sua
autoria, visto o resultado estar acima de 85%.
Eventuais divergências ou contestações de qualquer natureza quanto à apropriação aos
falantes deverão ser prontamente e formalmente submetidas pelos consulentes aos
subscritores no endereço indicado abaixo, para avaliação técnica e, caso sejam
consideradas procedentes, imediata republicação do parecer ou edição de adendo.
Caso seja necessário, outras análises poderão ser eventualmente apresentas em parecer
técnico complementar. Os consulentes, ao receberem, utilizarem ou divulgarem o
presente parecer ou as informações nele contidas, automaticamente concordam em
assumir exclusivamente para si as responsabilidades pertinentes, comprometendo-se a
isentar e proteger os pesquisadores do Núcleo de Computação Forense Aplicada de
qualquer reivindicação eventualmente resultante.
Encerra-se o presente parecer técnico que contém 07 folhas, sendo esta, datada e
assinada.
Santo André, 25 de setembro de 2023
_________________________
Dr. Mario Gazziro
Pesquisador UFABC
___________________________________________________________________________________________
NCFA - Núcleo de Computação Forense Aplicada (USP e UFABC) Sede: Av. dos Estados, 5001
4o andar, Bloco L - Santo André, SP, CEP 09210-580 Tel.: (11) 3356-7676 (ramal 7676)
6. LISTAGEM DE CÓDIGOS-FONTE EM MATLABTM
OS CÓDIGOS E ÁUDIOS ORIGINAIS ESTÃO DISPONÍVEIS NA PLATAFORMA GITHUB DO PESQUISADOR:
https://github.com/mariogazziro/reconhecimento_de_voz/blob/main/heleno.zip
clear all; close all; clc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Define variables
% analysis frame duration (ms)
Tw = 25;
Ts = 10; % analysis frame shift (ms)
alpha = 0.97; % preemphasis coefficient
M=20; % number of filterbank channels
C=12; % number of cepstral coefficients
L=22; % cepstral sine lifter parameter
LF = 300; % lower frequency limit (Hz)
HF = 3700; % upper frequency limit (Hz)
wav_file = 'controle1.wav'; % input audio filename
% Read speech samples, sampling rate and precision from
file [ audioIn, fs] = audioread( wav_file );
% Feature extraction (feature vectors as columns)
[ MFCCs, FBEs, frames ] = ...
mfcc( audioIn, fs, Tw, Ts, alpha, @hamming, [LF HF], M, C+1, L );
% Generate data needed for plotting
% frame length and number of frames
[ Nw, NF ] = size( frames );
time_frames = [0:NF-1]*Ts*0.001+0.5*Nw/fs; % time vector (s) for frames
time = [ 0:length(audioIn)-1 ]/fs; % time vector (s) for signal samples
logFBEs = 20*log10( FBEs ); % compute log FBEs for plotting
logFBEs_floor = max(logFBEs(:))-50; % get logFBE floor 50 dB below max
logFBEs( logFBEs<logFBEs_floor ) = logFBEs_floor; % limit logFBE dynamic range
% Generate plots
figure('Position', [30 30 800 600], 'PaperPositionMode', 'auto', ...
'color', 'w', 'PaperOrientation', 'landscape', 'Visible', 'on' );
subplot( 211 );
plot( time, audioIn, 'b' );
xlim( [ min(time_frames) max(time_frames) ] );
xlabel( 'Tempo (s)' );
ylabel( 'Amplitude' );
title( 'Voz original de Ciro Gomes (www.youtube.com/watch?v=cfaKlpu1ywU');
subplot( 212 );
imagesc( time_frames, [1:C], MFCCs(2:end,:) ); % HTK's TARGETKIND: MFCC
axis( 'xy' );
xlim( [ min(time_frames) max(time_frames) ] );
xlabel( 'Tempo (s)' );
ylabel( 'Cepstrum' );
title( 'Coeficientes cepstrum nas frequências Mel' );
% Set color map to grayscale
colormap( 1-colormap('jet') );
controle1=MFCCs(2:13,[1:600])';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Define variables
% analysis frame duration (ms)
Tw = 25;
Ts = 10; % analysis frame shift (ms)
alpha = 0.97; % preemphasis coefficient
M=20; % number of filterbank channels
C=12; % number of cepstral coefficients
L=22; % cepstral sine lifter parameter
LF = 300; % lower frequency limit (Hz)
HF = 3700; % upper frequency limit (Hz)
wav_file = 'controle2.wav'; % input audio filename
% Read speech samples, sampling rate and precision from
file [ audioIn, fs] = audioread( wav_file );
% Feature extraction (feature vectors as columns)
[ MFCCs, FBEs, frames ] = ...
mfcc( audioIn, fs, Tw, Ts, alpha, @hamming, [LF HF], M, C+1, L );
% Generate data needed for plotting
% frame length and number of frames
[ Nw, NF ] = size( frames );
time_frames = [0:NF-1]*Ts*0.001+0.5*Nw/fs; % time vector (s) for frames
time = [ 0:length(audioIn)-1 ]/fs; % time vector (s) for signal samples
logFBEs = 20*log10( FBEs ); % compute log FBEs for plotting
logFBEs_floor = max(logFBEs(:))-50; % get logFBE floor 50 dB below max
logFBEs( logFBEs<logFBEs_floor ) = logFBEs_floor; % limit logFBE dynamic range
% Generate plots
figure('Position', [30 30 800 600], 'PaperPositionMode', 'auto', ...
'color', 'w', 'PaperOrientation', 'landscape', 'Visible', 'on' );
________________________________________________________________________________________
NCFA - Núcleo de Computação Forense Aplicada (USP e UFABC) Sede: Av. dos Estados, 5001 - 4o andar,
Bloco L - Santo André, SP, CEP 09210-580 Tel.: (11) 3356-7676 (ramal 7676)
7. subplot( 211 );
plot( time, audioIn, 'b' );
xlim( [ min(time_frames) max(time_frames) ] );
xlabel( 'Tempo (s)' );
ylabel( 'Amplitude' );
title( 'Áudio de controle 2');
subplot( 212 );
imagesc( time_frames, [1:C], MFCCs(2:end,:) ); % HTK's TARGETKIND: MFCC
axis( 'xy' );
xlim( [ min(time_frames) max(time_frames) ] );
xlabel( 'Tempo (s)' );
ylabel( 'Cepstrum' );
title( 'Coeficientes cepstrum nas frequências Mel' );
% Set color map to grayscale
colormap( 1-colormap('jet') );
controle2=MFCCs(2:13,[1:600])';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Define variables
% analysis frame duration (ms)
Tw = 25;
Ts = 10; % analysis frame shift (ms)
alpha = 0.97; % preemphasis coefficient
M=20; % number of filterbank channels
C=12; % number of cepstral coefficients
L=22; % cepstral sine lifter parameter
LF = 300; % lower frequency limit (Hz)
HF = 3700; % upper frequency limit (Hz)
wav_file = 'amostra.wav'; % input audio filename
% Read speech samples, sampling rate and precision from
file [ audioIn, fs] = audioread( wav_file );
% Feature extraction (feature vectors as columns)
[ MFCCs, FBEs, frames ] = ...
mfcc( audioIn, fs, Tw, Ts, alpha, @hamming, [LF HF], M, C+1, L );
% Generate data needed for plotting
% frame length and number of frames
[ Nw, NF ] = size( frames );
time_frames = [0:NF-1]*Ts*0.001+0.5*Nw/fs; % time vector (s) for frames
time = [ 0:length(audioIn)-1 ]/fs; % time vector (s) for signal samples
logFBEs = 20*log10( FBEs ); % compute log FBEs for plotting
logFBEs_floor = max(logFBEs(:))-50; % get logFBE floor 50 dB below max
logFBEs( logFBEs<logFBEs_floor ) = logFBEs_floor; % limit logFBE dynamic range
% Generate plots
figure('Position', [30 30 800 600], 'PaperPositionMode', 'auto', ...
'color', 'w', 'PaperOrientation', 'landscape', 'Visible', 'on' );
subplot( 211 );
plot( time, audioIn, 'b' );
xlim( [ min(time_frames) max(time_frames) ] );
xlabel( 'Tempo (s)' );
ylabel( 'Amplitude' );
title( 'Áudio de amostra a ser testado');
subplot( 212 );
imagesc( time_frames, [1:C], MFCCs(2:end,:) ); % HTK's TARGETKIND: MFCC
axis( 'xy' );
xlim( [ min(time_frames) max(time_frames) ] );
xlabel( 'Tempo (s)' );
ylabel( 'Cepstrum' );
title( 'Coeficientes cepstrum nas frequências Mel' );
% Set color map to grayscale
colormap( 1-colormap('jet') );
amostra=MFCCs(2:13,[1:600])';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
X=[amostra;controle1];
Y(1:600)="Amostra";
Y(601:1200)="Controle";
Y=Y';
mdl = fitcknn(X,Y,'NumNeighbors',12,'Standardize',1);
rloss = resubLoss(mdl) % The classifier predicts incorrectly for XX% of the training data. 3,08%
[label,score,cost] = predict(mdl,controle2)
mean(score(:,1))
mean(score(:,2))
___________________________________________________________________________________________
NCFA - Núcleo de Computação Forense Aplicada (USP e UFABC) Sede: Av. dos Estados, 5001
4o andar, Bloco L - Santo André, SP, CEP 09210-580 Tel.: (11) 3356-7676 (ramal 7676)