首页 > 其他分享 >Tensorflow音频分类

Tensorflow音频分类

时间:2024-06-09 22:32:47浏览次数:15  
标签:String get int 音频 分类 org import Tensorflow tensorflow

tensorflow

https://www.tensorflow.org/lite/examples/audio_classification/overview?hl=zh-cn

官方有移动端demo

前端不会  就只能找找有没有java支持

注意版本

注意JDK版本

package com.example.demo17.controller;


import org.tensorflow.*;
import org.tensorflow.ndarray.*;
import org.tensorflow.ndarray.impl.dense.FloatDenseNdArray;
import org.tensorflow.proto.framework.DataType;
import org.tensorflow.proto.framework.MetaGraphDef;
import org.tensorflow.proto.framework.SignatureDef;
import org.tensorflow.proto.framework.TensorInfo;
import org.tensorflow.types.TFloat32;
import org.tensorflow.types.TInt64;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.xml.transform.Result;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

public class Test {


    private static FloatNdArray t1() {
//        String audioFilePath = "D:\\ai\\cat.wav";
        String audioFilePath = "C:\\Users\\user\\Downloads\\output_Wo9KJb-5zuz1_2.wav";
//        String audioFilePath = "D:\\ai\\111\\111.wav";
        // YAMNet期望的采样率
        int sampleRate = 16000;
        // YAMNet帧大小,0.96秒
        int frameSizeInMs = 96;
        // YAMNet帧步长,0.48秒
        int hopSizeInMs = 48;

        try (AudioInputStream audioStream = AudioSystem.getAudioInputStream(Paths.get(audioFilePath).toFile())) {
            AudioFormat format = audioStream.getFormat();
            if (format.getSampleRate() != sampleRate || format.getChannels() != 1) {
                System.out.println("Warning: Audio must be 16kHz mono. Consider preprocessing.");
            }
            int frameSize = (int) (sampleRate * frameSizeInMs / 1000);
            int hopSize = (int) (sampleRate * hopSizeInMs / 1000);

            byte[] buffer = new byte[frameSize * format.getFrameSize()];
            short[] audioSamples = new short[frameSize];
            // 存储每个帧的音频数据
            List<Float> floatList = new ArrayList<>();
            while (true) {
                int bytesRead = audioStream.read(buffer);
                if (bytesRead == -1) {
                    break;
                }
                // 将读取的字节转换为short数组(假设16位精度)
                for (int i = 0; i < bytesRead / format.getFrameSize(); i++) {
                    audioSamples[i] = (short) ((buffer[i * 2] & 0xFF) | (buffer[i * 2 + 1] << 8));
                }
                // 对当前帧进行处理(例如,归一化和准备送入模型)
                float[] floats = processFrame(audioSamples);
                for (float aFloat : floats) {
                    floatList.add(aFloat);
                }
                // 移动到下一个帧
                System.arraycopy(audioSamples, hopSize, audioSamples, 0, frameSize - hopSize);
            }

            // 将List<Float>转换为float[]
            float[] floatArray = new float[floatList.size()];
            for (int i = 0; i < floatList.size(); i++) {
                floatArray[i] = floatList.get(i);
            }

            return StdArrays.ndCopyOf(floatArray);
        } catch (UnsupportedAudioFileException | IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    private static float[] processFrame(short[] frame) {
        // 示例:归一化音频数据到[-1.0, 1.0]
        float[] normalizedFrame = new float[frame.length];
        for (int i = 0; i < frame.length; i++) {
            // short的最大值为32767,故除以32768得到[-1.0, 1.0]
            normalizedFrame[i] = frame[i] / 32768f;
        }
        return normalizedFrame;
    }

    static Map<String,String> map=new ConcurrentHashMap<>();

    public static void main(String[] args) throws Exception {
        FloatNdArray floatNdArray = t1();
        TFloat32 tFloat32 = TFloat32.tensorOf(floatNdArray);

        //SavedModelBundle savedModelBundle = SavedModelBundle.load("D:\\saved_model", "serve");
        SavedModelBundle savedModelBundle = SavedModelBundle.load("C:\\Users\\user\\Downloads\\archive", "serve");
        Map<String, SignatureDef> signatureDefMap = MetaGraphDef.parseFrom(savedModelBundle.metaGraphDef().toByteArray()).getSignatureDefMap();
        /**
         * 获取基本定义信息
         */
        SignatureDef modelSig = signatureDefMap.get("serving_default");
        String inputTensorName = modelSig.getInputsMap().get("waveform").getName();
        String outputTensorName = modelSig.getOutputsMap().get("output_0").getName();
        savedModelBundle.graph();
        try (Session session = savedModelBundle.session()) {
            /*JDK 17*/
//            Result run = session.runner()
//                    .feed(inputTensorName, tFloat32)
//                    .fetch(outputTensorName)
//                    .run();
//            Tensor out = run.get(0);
//            Shape shape = out.shape();
//
//            System.out.println(shape);
            /*JDK 8*/
            List<Tensor> run = session.runner()
                    .feed(inputTensorName, tFloat32)
                    .fetch(outputTensorName)
                    .run();
            Tensor tensor = run.get(0);
            Shape shape = tensor.shape();
            System.out.println(shape.asArray());
            String l=String.valueOf(shape.asArray()[0]);
            //读取CSV文件
            String csvFile = "C:\\Users\\user\\Downloads\\archive\\assets\\yamnet_class_map.csv";
            try {
                List<String> lines = Files.readAllLines(Paths.get(csvFile));
                for (String line : lines) {
                    String[] values = line.split(",");
                    map.put(values[0], values[2]);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            String s = map.get(l);
            System.out.println(s);
        }
    }
}

标签:String,get,int,音频,分类,org,import,Tensorflow,tensorflow
From: https://blog.csdn.net/tiantiantbtb/article/details/139456459

相关文章

  • 电子电器架构 --- 智能座舱技术分类
    电子电器架构—智能座舱技术分类我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试......
  • 基于多层感知器(MLP)的姓氏分类
    一.MLP简介    1.什么是MLP?多层感知机(MLP)是一种前馈神经网络,由至少三层神经元组成:输入层、隐藏层(可能有多层),以及输出层。每一层都与下一层全连接,每个连接都有一个权重。MLP是一种通用函数逼近器,它可以学习并表示复杂的非线性关系。2.MLP结构输入层(InputLayer):......
  • Xinhui学习NLP的笔记本:基于MLP/CNN的姓氏分类系统
    ASurnameClassificationSystembasedonMLP基于MLP的姓氏分类系统ThisnotebookservesasmylearningjourneyintotheMultilayerPerceptron(MLP),whichisafundamentaltypeofFeedforwardNeuralNetwork.Throughoutthisarticle,Iwillbeundertakin......
  • 音频提取,批量视频转换音频!
    在数字媒体的世界里,声音是传达情感、构建氛围的重要元素。然而,当我们需要从视频中提取音频时,繁琐的操作往往让人望而却步。此时,音频提取,批量视频转换音频技术出现,让我们能够轻松地从视频中提取声音,将那些动人的旋律、真挚的话语独立出来,让音频成为我们表达创意、分享故事的全新......
  • 粒子群优化BP神经网络分类模型进行人类活动分类
    1设计方案1.1数据采集与处理首先,采集沙特国王大学利雅得校区收集不同用户在不同活动状态下的IMU传感器数据集。然后,对数据进行预处理,包括去噪、滤波和特征提取等步骤,以提取出对活动识别有用的特征。1.2BP神经网络结构设计  根据IMU传感器数据的特性和活动识别的需求,设......
  • TensorFlow 的基本概念和使用场景
    TensorFlow是一个开源的机器学习框架,由Google开发并于2015年发布。它提供了一个灵活的编程环境,用于构建和训练各种机器学习模型。TensorFlow的核心概念是张量(Tensors)和计算图(ComputationalGraphs)。张量是多维数组,可以表示各种类型的数据,如数字、字符串等。计算图是一系列的操......
  • C++ OpenCV 图像分类魔法:探索神奇的模型与代码
    ⭐️我叫忆_恒心,一名喜欢书写博客的研究生......
  • TensorFlow2.x基础与mnist手写数字识别示例
    文章目录Github官网文档安装声明张量常量变量张量计算张量数据类型转换张量数据维度转换ReLU函数Softmax函数卷积神经网络训练模型测试模型数据集保存目录显示每层网络的结果TensorFlow是一个开源的深度学习框架,由GoogleBrain团队开发和维护。它被广泛应用......
  • 基于51垃圾箱自动分类_加料机_快递物流分拣器系统设计
    **单片机设计介绍,基于51垃圾箱自动分类_加料机_快递物流分拣器系统设计文章目录一概要二、功能设计设计思路三、软件设计原理图五、程序六、文章目录一概要  基于51单片机的垃圾箱自动分类、加料机及快递物流分拣器系统设计概要如下:一、系统组成核心控......
  • 设计模式-设计模式分类
    概述23种设计模式,分为创建型模式、结构型模式和行为型模式。另外,近来这一清单又增加了一些类别,例如,并发型模式、线程池模式、JavaEE企业技术的多层应用程序上的模式等。一、创建型模式1.工厂方法模式(FactoryMethod)定义一个接口用于创建对象,但是让子类决定初始化哪......