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);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/689902.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java面试】九、微服务篇-SpringCloud(上)

文章目录 1、SpringCloud五大组件2、服务注册和发现2.1 Eurake2.2 Eurake和Nacos的区别 3、Ribbon负载均衡3.1 策略3.2 自定义负载均衡策略 4、服务雪崩与熔断降级4.1 服务雪崩4.2 服务降级4.3 服务熔断 5、服务限流5.1 Nginx限流5.2 网关限流 6、微服务监控7、面试 1、SpringC…

【Python报错】已解决ModuleNotFoundError: No module named ‘xxx‘ in Jupyter Notebook

解决Python报错&#xff1a;ModuleNotFoundError: No module named ‘xxx’ in Jupyter Notebook 在使用Jupyter Notebook进行数据分析或科学计算时&#xff0c;我们经常需要导入各种Python模块。如果你遇到了ModuleNotFoundError: No module named xxx的错误&#xff0c;这通常…

[word] word如何清除超链接 #媒体#笔记#知识分享

word如何清除超链接 办公中&#xff0c;少不了使用word&#xff0c;这个是大家必备的软件&#xff0c;今天给大家分享下word如何清除超链接的操作办法&#xff0c;一起来学习下吧&#xff01; 1、清除所有超链接 按下组合键CtrlshiftF9&#xff0c;就可以将网上复制带有超链…

Rust 标记一个属性或函数为废弃

如题&#xff0c;演示Rust 标记一个属性或函数为废弃的基本使用方法&#xff1a; 示例&#xff1a; use serde::{Deserialize, Serialize};#[derive(Clone, Debug, Serialize, Deserialize, Default)] pub struct GrpcOptions {pub addr: String,pub max_recv_message_size: u…

【JavaScript函数详解】Day04

JavaScript函数详解 JavaScript 基础 - 第4天笔记函数声明和调用声明&#xff08;定义&#xff09;调用 参数形参和实参参数默认值 返回值函数补充细节作用域全局作用域局部作用域变量的访问原则 匿名函数函数表达式立即执行函数 逻辑中断小知识&#xff08;转换为Boolean型&am…

企业应如何选择安全合规的内外网文件摆渡系统?

网络隔离是一种安全措施&#xff0c;旨在将网络划分为不同的部分&#xff0c;以减少安全风险并保护敏感信息。常见的隔离方式像物理隔离、逻辑隔离、防火墙隔离、虚拟隔离、DMZ区隔离等&#xff0c;将网络隔离成内网和外网。内外网文件摆渡通常指在内部网络&#xff08;内网&am…

【吊打面试官系列】CHAR 和 VARCHAR 的区别?

大家好&#xff0c;我是锋哥。今天分享关于 【CHAR 和 VARCHAR 的区别&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; CHAR 和 VARCHAR 的区别&#xff1f; 1、CHAR 和 VARCHAR 类型在存储和检索方面有所不同 1000道 互联网大厂Java工程师 精选面试题-Java资源…

【吊打面试官系列】MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

大家好&#xff0c;我是锋哥。今天分享关于 【MySQL 中 InnoDB 支持的四种事务隔离级别名称&#xff0c;以及逐级之间的区别&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MySQL 中 InnoDB 支持的四种事务隔离级别名称&#xff0c;以及逐级之间的区别&#xf…

【机器学习】深度卷积生成对抗网络(DCGAN)用于图像生成

1. 引言 1.1 DGGAN是什么&#xff1f; DGGAN&#xff08;Directed Graph embedding framework based on Generative Adversarial Network&#xff09;是一种基于生成对抗网络&#xff08;GAN&#xff09;的有向图嵌入方法&#xff1a; 基本定义&#xff1a;DGGAN是一种结合了…

【中篇】从 YOLOv1 到 YOLOv8 的 YOLO 物体检测模型历史

YOLO 型号之所以闻名遐迩,主要有两个原因:其速度和准确性令人印象深刻,而且能够快速、可靠地检测图像中的物体。上回我解释了Yolo v1, 今天从Yolov2开始。 YOLOv2:更好、更快、更强 2017 年 7 月一个闷热的星期二下午,雷德蒙(Joseph Redmon, Yolo创始人)再次走上舞台。 …

【微信小程序开发】小程序中的上滑加载更多,下拉刷新是如何实现的?

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Socket编程权威指南(二)完美掌握TCP流式协议及Socket编程的recv()和send()

在上一篇文章中&#xff0c;我们学习了Socket编程的基础知识&#xff0c;包括创建Socket、绑定地址、监听连接、接收连接等操作。然而&#xff0c;真正的套接字编程远不止于此。本文将重点介绍TCP 流式协议&#xff0c;什么是粘包问题&#xff1f;如何解决粘包问题 &#xff1f…

俄罗斯服务器租用攻略:选择优质服务器,开启海外市场新征程

随着国际贸易的不断发展&#xff0c;俄罗斯作为一个重要的贸易伙伴备受关注。许多企业和公司为了开拓海外市场&#xff0c;选择将业务拓展到俄罗斯&#xff0c;而在这个过程中&#xff0c;租用一台优质的服务器成为了必须面对的问题。俄罗斯作为一个经济发展迅速的国家&#xf…

Chrome DevTools解密:成为前端调试大师的终极攻略

Chrome DevTools是一套内置于Google Chrome浏览器中的开发者工具&#xff0c;它允许开发者对网页进行调试、分析和优化。本文将全面介绍DevTools的功能、使用方法以及注意事项&#xff0c;帮助开发者更好地利用这些工具来提升开发效率和网页性能。 一、简介 1. DevTools是什么…

macbookrpro使用体验

前言 之前用的电脑是拯救者y7000 2020&#xff0c;用了四五年&#xff0c;年前就有换电脑的打算。计划就是买一个苹果电脑&#xff0c;在查看了挺多电脑&#xff0c;多方面对比后&#xff0c;最终还是买了Macbook pro。 我买的笔记本的配置如下&#xff1a; 购买14英寸的原因…

什么是Docker ?

在软件开发的星辰大海中&#xff0c;有一个神奇的技术&#xff0c;它能够将应用程序及其依赖环境封装在一个轻量级的、可移植的容器中。这项技术就是Docker。它不仅简化了应用的部署流程&#xff0c;还让开发和运维之间的界限变得模糊&#xff0c;使得跨平台部署变得前所未有的…

Ghost Mirror

Ghost Mirror 操作系统镜像 windows servers linux Windows XP 老古董&#xff0c;唉 安装完重启一下 设置下BIOS 1小时内弄完3台。。。

【数据分析基础】实验一 Python运算符、内置函数、序列基本用法

一、实验目的 熟练运用Python运算符。熟练运用Python内置函数。掌握Python的基本输入输出方法。了解lambda表达式作为函数参数的用法。掌握列表、元组、字典、集合的概念和基本用法。了解Python函数式编程模式。 二、实验内容&#xff1a; 1. 在命令模式测试如下命令&#x…

[office] 快速删除excel中的空行和列的方法 #其他#学习方法#经验分享

快速删除excel中的空行和列的方法 用户在网上下载好的Excel表格打开之后发现有很多空白行&#xff0c;怎么样将这些空白行或单元格一次性删除掉呢?下面教大家在Excel中用定位一次性可以把空白行删除 用户在网上下载好的Excel表格打开之后发现有很多空白行&#xff0c;怎么样将…

高考志愿选专业,如何分析自己的兴趣爱好?

之所以在选择专业的时候比较迷茫&#xff0c;就是对自己不够了解&#xff0c;没有分析过自己的兴趣爱好&#xff0c;所以也不知道如何选择适合自己的专业&#xff0c;但是他们又不得不做出更深入的了解&#xff0c;因为专业的选择将关系到未来的职业道路和生活方向。 对于绝大…