Unity使用sherpa-onnx实现说话人识别

网友软绵绵的面包人推荐,模型3dspeaker_speech_eres2net_base_200k_sv_zh-cn_16k-common.onnx的效果比3dspeaker_speech_eres2net_base_sv_zh-cn_3dspeaker_16k.onnx要好

在这里插入图片描述

具体代码

using System;
using System.Collections.Generic;
using System.IO;
using SherpaOnnx;
using UnityEngine;public class SpeakerIdentification : MonoBehaviour
{SpeakerEmbeddingExtractor extractor;SpeakerEmbeddingManager manager;string pathRoot;string modelPath;OfflineSpeechDenoiser offlineSpeechDenoiser = null;string[] testFiles;// Start is called before the first frame updatevoid Start(){pathRoot = Util.GetPath();modelPath = pathRoot + "/3dspeaker_speech_eres2net_base_200k_sv_zh-cn_16k-common.onnx";}public void Init(){OfflineSpeechDenoiserGtcrnModelConfig osdgmc = new OfflineSpeechDenoiserGtcrnModelConfig();osdgmc.Model = pathRoot + "/gtcrn_simple.onnx";OfflineSpeechDenoiserModelConfig osdmc = new OfflineSpeechDenoiserModelConfig();osdmc.NumThreads = 1;osdmc.Provider = "cpu";osdmc.Debug = 0;osdmc.Gtcrn = osdgmc;OfflineSpeechDenoiserConfig osdc = new OfflineSpeechDenoiserConfig();osdc.Model = osdmc;offlineSpeechDenoiser = new OfflineSpeechDenoiser(osdc);//byte[] bytes = File.ReadAllBytes(pathRoot + "/xuefei.wav");//float[] data = BytesToFloat(bytes);//DenoisedAudio denoisedAudio = offlineSpeechDenoiser.Run(data, 16000);//if (denoisedAudio.SaveToWaveFile(pathRoot + "/xuefei1.wav"))//{//}var config = new SpeakerEmbeddingExtractorConfig();config.Model = modelPath;config.Debug = 1;extractor = new SpeakerEmbeddingExtractor(config);manager = new SpeakerEmbeddingManager(extractor.Dim);var spk1Files =new string[] {pathRoot+"/xuefei1.wav",};var spk1Vec = new float[spk1Files.Length][];for (int i = 0; i < spk1Files.Length; ++i){spk1Vec[i] = ComputeEmbedding(extractor, spk1Files[i]);}// 给注册音频降噪一下//byte[] bytes = File.ReadAllBytes(pathRoot + "/xuefei1.wav");//float[] data = BytesToFloat(bytes);//DenoisedAudio denoisedAudio = offlineSpeechDenoiser.Run(data, 16000);//if (denoisedAudio.SaveToWaveFile(pathRoot + "/xuefei1.wav"))//{//}//注册说话人if (!manager.Add("xuefei", spk1Vec)){Debug.LogError("Failed to register xuefei");}var allSpeakers = manager.GetAllSpeakers();foreach (var s in allSpeakers){Debug.Log(s);}//验证测试testFiles =new string[] {pathRoot+"/test1.wav",pathRoot+"/test2.wav",pathRoot+"/test3.wav",};float threshold = 0.6f;foreach (var file in testFiles){var embedding = ComputeEmbedding(extractor, file);var name = manager.Search(embedding, threshold);if (name == ""){name = "<Unknown>";}Debug.Log(file + " :" + name);} }/// <summary>/// 说话人识别 用的临时数据/// </summary>List<float> audioData = new List<float>();public void AcceptData(float[] data){audioData.AddRange(data);}float threshold = 0.6f;public void Search(){ string filePath = pathRoot + "/" + DateTime.Now.ToFileTime().ToString() + ".wav";//DenoisedAudio denoisedAudio = offlineSpeechDenoiser.Run(audioData.ToArray(), 16000); //if (denoisedAudio.SaveToWaveFile(filePath))//{//}Util.SaveClip(1, 16000, audioData.ToArray(), filePath);var embedding = ComputeEmbedding(extractor, filePath);string name = manager.Search(embedding, threshold);if (name == ""){name = "<Unknown>";}Debug.Log("name:" + name);audioData.Clear();}public float[] ComputeEmbedding(SpeakerEmbeddingExtractor extractor, string filename){byte[] bytes = File.ReadAllBytes(filename);float[] data = BytesToFloat(bytes);var stream = extractor.CreateStream();stream.AcceptWaveform(16000, data);stream.InputFinished();var embedding = extractor.Compute(stream);return embedding;}public float[] ComputeEmbedding(SpeakerEmbeddingExtractor extractor, int sample, float[] data){var stream = extractor.CreateStream();stream.AcceptWaveform(sample, data);stream.InputFinished();var embedding = extractor.Compute(stream);return embedding;}public float[] BytesToFloat(byte[] byteArray){float[] sounddata = new float[byteArray.Length / 2];for (int i = 0; i < sounddata.Length; i++){sounddata[i] = BytesToFloat(byteArray[i * 2], byteArray[i * 2 + 1]);}return sounddata;}private float BytesToFloat(byte firstByte, byte secondByte){//小端和大端顺序要调整short s;if (BitConverter.IsLittleEndian)s = (short)((secondByte << 8) | firstByte);elses = (short)((firstByte << 8) | secondByte);// convert to range from -1 to (just below) 1return s / 32768.0F;}
}

最后是工程地址

https://github.com/xue-fei/sherpa-onnx-unity

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch-集群

本篇文章依据ElasticSearch权威指南进行实操和记录 1&#xff0c;空集群 即不包含任何节点的集群 集群大多数分为两类&#xff0c;主节点和数据节点 主节点 职责&#xff1a;主节点负责管理集群的状态&#xff0c;例如分配分片、添加和删除节点、监控节点故障等。它们不直接…

LG P9844 [ICPC 2021 Nanjing R] Paimon Segment Tree Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 次修改 ( l , r , v ) (l,r,v) (l,r,v)&#xff1a; 对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r]&#xff0c;令 a i ← a i v a_i\gets a_iv ai​←…

Google Prompt Tuning:文本嵌入优化揭秘

Google Research Prompt Tunin :from_embedded_string 在 Google Research 的 Prompt Tuning 项目代码库 中,from_embedded_string 函数主要用于基于字符串文本初始化提示词的嵌入向量,其调用场景通常与提示词优化或任务适配相关。 1. 核心代码位置 from_embedded_string …

网页 H5 微应用接入钉钉自动登录

ℹ️关于云审批 云审批&#xff08;cloud approve&#xff09; &#xff0c;一款专为小微企业打造&#xff0c;支持多租户的在线审批神器。它简化了申请和审批流程&#xff0c;让您随时随地通过手机或电脑完成请款操作。员工一键提交申请&#xff0c;审批者即时响应&#xff0c…

idea无法识别Maven项目

把.mvn相关都删除了 导致Idea无法识别maven项目 或者 添加导入各个模块 最后把父模块也要导入

飞桨paddle import fluid报错【已解决】

跟着飞桨的安装指南安装了paddle之后 pip install paddlepaddle有一个验证&#xff1a; import paddle.fluid as fluid fluid.install check.run check()报错情况如下&#xff0c;但是我在pip list中&#xff0c;确实看到了paddle安装上了 我import paddle别的包&#xff0c…

现代化SQLite的构建之旅——解析开源项目Limbo

现代化SQLite的构建之旅——解析开源项目Limbo 在当今飞速发展的技术世界中,轻量级且功能强大的数据库已成为开发者的得力助手。当我们谈论轻量级数据库时,SQLite无疑是一个举足轻重的名字。然而,随着技术的进步,我们对数据库的需求也变得更加多样化。这正是Limbo项目诞生…

MinIO:从入门到精通,解锁云原生存储的奥秘

一、引言&#xff1a;为什么 MinIO 正在重塑存储世界&#xff1f; 在云计算和大数据时代&#xff0c;传统存储系统面临扩展性差、成本高、兼容性不足等挑战。MinIO 凭借其 S3 兼容性、分布式架构、高性能存储 等特性&#xff0c;成为企业构建现代化存储基础设施的首选。 本文…

vscode怎么关闭自动定位文件

关闭自动定位文件功能 方式1 在设置中搜索: explorer.autoReveal 方式2 直接在settings.json中增加"explorer.autoReveal": false 添加类似jetbrains IDE的文件定位功能 可以直接安装插件市场搜索niushuaibing.vs-location, 安装后会有文件定位按钮, 点击后即可…

学习路之uniapp--unipush2.0推送功能--给自己发通知

学习路之uniapp--unipush2.0推送功能--给自己发通知 一、绑定云空间及创建云函数二、编写发送界面三、效果后期展望&#xff1a; 一、绑定云空间及创建云函数 package.json {"name": "server-push","dependencies": {},"main": "…

什么是VR展示?VR展示的用途

随着科技的迅猛发展&#xff0c;我们步入一个全新的数字时代。在这个时代&#xff0c;虚拟现实&#xff08;VR&#xff09;技术崭露头角&#xff0c;逐步改变我们对世界的认知。全景展示厅作为VR技术与传统展览艺术的完美结合&#xff0c;以独特的全景视角&#xff0c;引领我们…

抖音IP属地跟无线网有关吗?如何更改

IP属地显示功能让许多用户感到好奇——为什么自己的位置信息有时准确&#xff0c;有时却显示在其他城市&#xff1f;这时&#xff0c;用户会疑惑&#xff1a;抖音IP属地跟无线网有关系吗&#xff1f;抖音的IP属地显示与其所使用的网络类型&#xff08;包括无线网&#xff09;密…

JESD204 ip核使用与例程分析(二)

JESD204 ip核使用与例程分析(二) JESD204时钟方案专用差分时钟对例程分析jesd204_0_transport_layer_demapperjesd204_0_sig_chkjesd204_0_clockingjesd204_0 ip核port寄存器AXI-LITE寄存器配置jesd204_phy ip核JESD204时钟方案 图3-1所示为最通用、灵活的时钟解决方案。在图…

微软全新开源的Agentic Web网络项目:NLWeb,到底是什么 ?

目录 1、背景 2、NLWeb是什么&#xff1f; 3、NLWeb是如何工作的&#xff1f; 3.1 技术原理 3.2 对发布者的价值 3.3 核心团队与合作伙伴 4、快速入门指南 5、延伸阅读 Agentic&#xff1a;Agent的形容词&#xff0c;Agentic指系统由大型语言模型&#xff08;LLM&#…

前端性能优化的秘密武器:Preload 与 Prefetch 的深度解析

前端性能优化的秘密武器&#xff1a;Preload 与 Prefetch 的深度解析 在前端开发中&#xff0c;页面加载速度直接影响用户体验和业务转化率。而“资源预加载”技术&#xff0c;正是优化加载性能的核心手段之一。本文将深入浅出地讲解 Preload 与 Prefetch 这两项技术&#xff…

App Builder技术选型指南:从AI编程到小程序容器,外卖App开发实战

在2025年快速迭代的技术生态中&#xff0c;开发者构建App的路径愈发多样化。本文以开发一个同城外卖App为例&#xff0c;对比当前主流的AI编程工具&#xff08;如Cursor、GitHub Copilot、Trae&#xff09;与小程序容器技术&#xff08;如FinClip&#xff09;的优劣势、难易度及…

深度学习入门到实战:用PyTorch打通数学、张量与模型训练全链路​

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 一. 人工智能、机器学习与深度学习的关系 1.1 概念层次解析 人工智能&#xff08;AI&#xff09;&#xff1a;使机器模拟人类智能的广义领域 机器学…

windows服务器部署jenkins工具(一)

jenkins作为一款常用的构建发布工具&#xff0c;极大的简化了项目部署发布流程。jenkins通常是部署在linux服务上&#xff0c;今天给大家分享的是windows服务器上如何搭建jenkins发布工具。 1.首先第一步还是看windows安装docker 这篇文章哈&#xff0c;当然也可以不采用docke…

前端开发规范性利器系列之:ESLint

前言 我是一名从事低代码平台研发的前端CV程序猿&#xff0c;有几十名像我一样的小伙伴协同研发。在长期的多人协作和滚动迭代中&#xff0c;不出意外&#xff0c;代码中会充斥各种“坏味道”&#xff0c;如代码风格不统一、扩展性和灵活性降低等问题。我们是如何解决这些问题的…

数据结构知识点汇总

1、在数据结构中&#xff0c;随机访问是指能够直接访问任一元素&#xff0c;而不需要从特定的起始位置开始&#xff0c;也不需要按顺序访问其他元素。这种访问方式通常不涉及遍历。例如&#xff0c;数组&#xff08;array&#xff09;支持随机访问&#xff0c;你可以直接通过索…