Usando MicrophoneReader
MicrophoneReader captura áudio bruto do microfone como samples PCM. Use este componente quando precisar dos dados de áudio diretamente em vez de texto reconhecido: medidores de volume, visualização de waveform, análise de pitch ou batida, pipelines próprios de gravação, efeitos locais de voz ou envio dos samples capturados para seu próprio código de processamento.
O componente lê PCM mono de 16 bits do microfone Android. Quando enableRecord está habilitado, a engine começa a capturar áudio e publica os samples capturados como dados de frame.
O componente funciona como um buffer por frame:
framePCMé umNativeShortBufferque armazena os samples PCM disponíveis no frame atual.frameLengthé a quantidade de samples válidos emframePCMno frame atual.sampleRateé a taxa de amostragem do microfone usada atualmente pela engine.- Se nenhum áudio foi capturado em um frame,
frameLengthé0. - Leia o componente a cada update. O próximo frame substitui os dados do frame atual.
- Leia apenas os samples do índice
0atéframeLength - 1. O buffer pode ter capacidade extra, e valores antigos fora deframeLengthnão fazem parte do frame atual.
Configuração
- Adicione
MicrophoneReadera um GameObject. - Habilite
enableRecordquando quiser capturar áudio do microfone. - Durante o update, verifique
frameLength. - Leia os samples por
framePCMou usegetFramePCMArray()quando quiser umshort[]comum.
No Android, o app precisa da permissão de microfone. Se a permissão ainda não tiver sido concedida, o componente pede a permissão quando a gravação é habilitada.
Exemplo Com Atributos Virtuais
Esta versão usa atributos virtuais e calcula o maior valor absoluto de sample no frame atual.
SpatialObject myObject = /* seu objeto */ null;
MicrophoneReader mic = myObject.findComponent(MicrophoneReader.class);
if (mic != null) {
mic.enableRecord = true;
}
// Execute esta parte a cada update.
if (mic != null && mic.enableRecord) {
int length = mic.frameLength;
NativeShortBuffer pcm = mic.framePCM;
if (pcm != null && length > 0) {
int peak = 0;
for (int i = 0; i < length; i++) {
int value = Math.abs(pcm.get(i));
if (value > peak) {
peak = value;
}
}
Terminal.log("Pico do microfone: " + peak + " em " + mic.sampleRate + " Hz");
}
}
Exemplo Com Métodos
Use os métodos diretamente quando preferir chamadas explícitas ou quando quiser uma cópia short[] do frame atual.
SpatialObject myObject = /* seu objeto */ null;
MicrophoneReader mic = myObject.findComponent(MicrophoneReader.class);
if (mic != null) {
mic.setEnableRecord(true);
}
// Execute esta parte a cada update.
if (mic != null && mic.isEnableRecord()) {
short[] samples = mic.getFramePCMArray();
if (samples.length > 0) {
long sum = 0;
for (int i = 0; i < samples.length; i++) {
sum += Math.abs(samples[i]);
}
long averageAmplitude = sum / samples.length;
Terminal.log("Amplitude média do microfone: " + averageAmplitude);
}
}
Escolhendo framePCM ou getFramePCMArray()
Use framePCM quando quiser evitar alocar um novo array Java a cada frame. Isso é melhor para análises de áudio frequentes.
Use getFramePCMArray() quando a conveniência for mais importante que o custo de alocação. Ele retorna um novo array contendo apenas os samples válidos do frame atual.
Observações
frameLengthconta samples, não bytes.- Os samples são valores PCM assinados de 16 bits, normalmente no intervalo de
-32768a32767. - A quantidade de samples por frame pode variar dependendo do timing do dispositivo e da taxa de frames da engine.
- Se a gravação estiver desabilitada,
frameLengthvira0e nenhum novo sample de microfone é publicado. - Para speech-to-text, use
SpeechRecognizer.MicrophoneReaderfornece áudio bruto, não palavras.