前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android客户端处理音频文件

android客户端处理音频文件

原创
作者头像
languageX
发布2021-08-12 13:17:28
1.6K4
发布2021-08-12 13:17:28
举报
文章被收录于专栏:计算机视觉CV

之前介绍了很多音频知识,最终我们还是希望能够在终端应用到我们的算法,本文主要介绍基础的在Android客户端如何处理我们的音频(wav)格式文件,主要介绍文件的读取,写入和播放。后续再介绍如何进行stft等频域特征提取以及模型的infer方法~

本文的wav处理基础类主要参考https://github.com/Jhuster/AudioDemo中的WavFileReader和WavFileWriter类。

读取音频文件

读取音频文件中最主要的步骤是获取了byte[]数据后,我们需要转为float[],因为通常我们的特征提取或者AI模型都是基于float进行的。

  1. 获取音频文件reader
代码语言:java
复制
// 获取fileReader
public WavFileReader open_audio(String wav_path){
WavFileReader m_reader= new WavFileReader();
 try {
        m_reader.openFile(wav_path);
    } catch (IOException e) {
        e.printStackTrace();
    }
 return m_reader;
}

代码语言:java
复制
// 获取音频数据
public float[] read_audio(WavFileReader mfileReader){
 // 每次获取PER_PCM_LEN长度的数据
 byte[] audioBytes = new byte[PER_PCM_LEN * 2];
 int nbytes = mfileReader.readData(audioBytes, 0, audioBytes.length);
 if (nbytes<=0){
 return null;
 }
 // 将byte[]转为float[]
 ShortBuffer sbuf =
     ByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer();
 short[] audioShorts = new short[sbuf.capacity()];
 sbuf.get(audioShorts);
 float[]f_input = new float[audioShorts.length];
 for (int i = 0; i < audioShorts.length; i++) {
        f_input[i] = ((float)audioShorts[i])/0x8000;
 }
 return f_input;
}

写入音频文件

对获取后的音频处理进行一系列处理后,我们需要将处理后的float[]写入音频文件,同样我们需要进行一次float[]到byte[]的转换。

主要代码如下:

代码语言:java
复制
// 对writer初始化
mFileWriter = new WavFileWriter();
try {
 mFileWriter.openFile(wav_out_path, 16000, 1, 16);
} catch (IOException e) {
    e.printStackTrace();
}

代码语言:java
复制
// 写入音频文件
public void write_audio(float[] f_writedata){
    // 将float[]转换为byte[]
 byte audioData[];
 for (int i=0;i<f_writedata.length; i++){
        f_writedata[i] *= 32768.0;
    }
    audioData = mFileWriter.shortToByte(mFileWriter.floatToShort(f_writedata));
 mFileWriter.writeData(audioData, 0, audioData.length);
}

播放音频文件

最后我们可以在界面上播放音频,这里函数是播放文件路径的wav音频

代码语言:java
复制
void audio_play(String path) {
 class AudioPlayRunnable implements Runnable {
        String audio_path;
        AudioPlayRunnable(String s) { audio_path = s; }
 public void run() {
            WavFileReader reader;
            reader = new WavFileReader();
 try {
                reader.openFile(audio_path);
            } catch (IOException e) {
                e.printStackTrace();
            }
 byte[] buffer = new byte[SAMPLES_PER_FRAME * 2];
 while (reader.readData(buffer, 0, buffer.length) > 0) {
 mAudioPlayer.play(buffer, 0, buffer.length);
            }
 mAudioPlayer.stopPlayer();
 try {
                reader.closeFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 mAudioPlayer.startPlayer();
    Thread t = new Thread(new AudioPlayRunnable(path));
    t.start();
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 读取音频文件
  • 写入音频文件
  • 播放音频文件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档