幽冥大陆(四十五)人工智能自动化交互系统ASR——东方仙盟筑基期

代码

复制代码
using Microsoft.ML.OnnxRuntime.Tensors;
using Microsoft.ML.OnnxRuntime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Windows.Forms;
using CyberWin.CSHARP.YNWLZC.WebFrame.CyberPHP.CyberWinPC.Helper.Logger;

namespace CyberWin.TRADE.AI.SmartHandleHelp.CyberawIinVos.CyberWin_AI
{
    public class CyberWin_FunAsr
    {
        public  static void fastgo()
        {

            // 硬编码关键参数(替代config.yaml)
            int sampleRate = 16000;
            int featureDim = 80;

            string 人工智能路径 = Application.StartupPath + "/CyberWinVOS/CyberWinAI/asr/";

            // 路径配置
            string int8ModelPath = 人工智能路径+@"model.int8.onnx";
            string tokensPath = 人工智能路径 + @"tokens.txt";
            string audioPath = 人工智能路径 + @"test_16k_mono.wav";

            // 解析tokens.txt
            Dictionary<int, string> tokenDict = ParseTokens(tokensPath);
            if (tokenDict.Count == 0) return;

            // 音频预处理(用硬编码的featureDim=80)
            float[] pcmData = ReadWav(audioPath);
            float[][] fbank = FBankExtractor.Extract(pcmData, featureDim); // 传入特征维度

            // 构造输入张量
            int timeSteps = fbank.Length;
            Tensor<float> speechTensor = new DenseTensor<float>(new[] { 1, timeSteps, featureDim });
            for (int t = 0; t < timeSteps; t++)
                for (int f = 0; f < featureDim; f++)
                    speechTensor[0, t, f] = fbank[t][f];

            // INT8推理配置
            SessionOptions sessionOptions = new SessionOptions();
            sessionOptions.InterOpNumThreads = 1;
            sessionOptions.IntraOpNumThreads = 1;
            sessionOptions.EnableMemoryPattern = false;

            // 推理
            using (var session = new InferenceSession(int8ModelPath, sessionOptions))
            {
                var inputs = new List<NamedOnnxValue>
                {
                    NamedOnnxValue.CreateFromTensor("speech", speechTensor),
                    NamedOnnxValue.CreateFromTensor("speech_lengths", new DenseTensor<int>(new[] { 1 }, new[] { timeSteps }))
                };

                using (var results = session.Run(inputs))
                {
                    Tensor<int> outputIds = results.First().AsTensor<int>();
                    string finalText = string.Join("", outputIds.Select(id => tokenDict.ContainsKey(id) ? tokenDict[id] : ""));
                    Console.WriteLine($"✅ 识别结果:{finalText}");
                   Log_Engine.write_log("东方仙盟","语音识别", finalText);
                }
            }
        }

        // 解析tokens.txt(复用之前逻辑)
        private static Dictionary<int, string> ParseTokens(string path)
        {
            Dictionary<int, string> dict = new Dictionary<int, string>();
            string[] lines = File.ReadAllLines(path);
            for (int i = 0; i < lines.Length; i++)
            {
                string line = lines[i].Trim();
                if (string.IsNullOrEmpty(line)) continue;
                if (line.Contains("\t"))
                {
                    var parts = line.Split('\t');
                    if (parts.Length == 2 && int.TryParse(parts[1], out int id))
                        dict[id] = parts[0];
                }
                else
                    dict[i] = line;
            }
            return dict;
        }

        // 音频读取(复用)
        private static float[] ReadWav(string filePath)
        {
            if (!File.Exists(filePath)) return null;
            using (var fs = new FileStream(filePath, FileMode.Open))
            using (var br = new BinaryReader(fs))
            {
                fs.Seek(44, SeekOrigin.Begin);
                byte[] bytes = br.ReadBytes((int)(fs.Length - 44));
                float[] pcm = new float[bytes.Length / 2];
                for (int i = 0; i < pcm.Length; i++)
                {
                    short sample = BitConverter.ToInt16(bytes, i * 2);
                    pcm[i] = sample / 32768.0f;
                }
                return pcm;
            }
        }

    }
}

开启 ASR 在 C# 与浏览器中的奇妙开发之旅

在当今数字化浪潮中,自动语音识别(ASR)技术宛如一颗璀璨的明珠,为众多应用场景带来了革命性的变革。通过在 C# 和浏览器中开发 ASR 应用,我们能够解锁诸多令人瞩目的可能性,为用户打造更加智能、便捷的交互体验。

ASR 在 C# 与浏览器开发中的魅力

  1. C# 开发 ASR 应用:构建强大的后端引擎
    • 高效处理能力 :C# 凭借其强大的性能和丰富的类库,为 ASR 应用提供了坚实的后端支持。在上述代码中,利用 C# 实现了从音频文件读取、预处理到模型推理的完整流程。例如,通过ReadWav方法高效读取 WAV 音频文件,并将其转换为适合处理的 PCM 数据格式,为后续的特征提取和模型输入做好准备。这就好比为 ASR 系统打造了一个精密的 "音频加工厂",能够快速且准确地处理音频信息。
    • 灵活的模型集成 :借助Microsoft.ML.OnnxRuntime库,C# 能够轻松集成 ONNX 格式的 ASR 模型,如代码中加载model.int8.onnx模型进行推理。这种灵活性使得开发者可以根据不同的应用需求,选择最合适的模型,并进行定制化开发。就如同为 ASR 系统配备了一把 "万能钥匙",能够适配各种不同的语音识别场景。
    • 稳定的运行环境:C# 的稳健性和可靠性确保了 ASR 应用在后端能够稳定运行,处理大量语音数据时不易出现故障。无论是在服务器端处理众多用户的语音请求,还是在本地设备上进行实时语音识别,C# 都能提供稳定的运行保障,为用户带来流畅的使用体验。
  2. 浏览器开发 ASR 应用:打造便捷的前端交互
    • 跨平台兼容性:浏览器作为当今最广泛使用的应用平台之一,具有无与伦比的跨平台优势。通过在浏览器中开发 ASR 应用,用户无需安装额外的软件,只需使用常见的浏览器,如 Chrome、Firefox 等,就能随时随地使用语音识别功能。这就像为用户提供了一个无处不在的 "语音入口",无论他们使用的是电脑、平板还是手机,都能轻松享受 ASR 带来的便利。
    • 直观的用户体验:浏览器提供了丰富的前端开发技术,如 HTML、CSS 和 JavaScript,能够打造出直观、友好的用户界面。开发者可以利用这些技术实现语音输入按钮、实时语音转文字显示等功能,让用户能够轻松与 ASR 系统进行交互。例如,用户只需点击按钮,即可开始语音输入,系统实时将识别结果显示在页面上,极大地提升了用户体验的便捷性和趣味性。
    • 无缝的网络连接:浏览器天然具备网络连接能力,使得 ASR 应用能够方便地与后端服务器进行数据交互。这意味着用户的语音数据可以快速上传到服务器进行处理,处理后的结果也能及时返回给用户。同时,浏览器还可以与其他网络服务进行集成,如将语音识别结果发送到翻译服务、语音合成服务等,进一步拓展了 ASR 应用的功能边界。

初学者学习指南

  1. 基础夯实:掌握必备知识
    • 编程语言:对于在 C# 和浏览器中开发 ASR 应用,首先要扎实掌握 C# 和 JavaScript 这两门编程语言。学习 C# 的语法结构、面向对象编程概念、文件操作等基础知识,为后端开发打下坚实基础。同时,深入学习 JavaScript 的语法、DOM 操作、事件处理等内容,以便能够开发出交互性强的前端界面。这就如同在建造一座大厦之前,需要先准备好坚实的建筑材料和工具。
    • 音频处理基础:了解音频的基本概念,如采样率、声道数、音频编码等。理解如何读取和处理音频文件,以及音频数据在计算机中的表示方式。这将帮助你更好地理解 ASR 系统中音频预处理的原理和方法,例如代码中如何将 WAV 文件转换为 PCM 数据,以及如何根据采样率和特征维度进行特征提取。
    • 机器学习与 ASR 原理:学习机器学习的基本概念,特别是与语音识别相关的知识,如声学模型、语言模型等。了解 ASR 系统的工作流程,从音频信号的采集、特征提取到模型推理和结果输出。这将使你在开发过程中能够更好地理解和优化 ASR 应用的性能,如同掌握了开启 ASR 技术大门的钥匙。
  2. 实践探索:动手开发项目
    • C# 项目实践:参考上述代码示例,尝试运行并理解代码的逻辑。从简单的音频读取和处理开始,逐步实现完整的 ASR 流程。可以修改代码中的参数,如模型路径、音频文件路径等,观察不同设置对识别结果的影响。同时,尝试扩展功能,如添加对不同音频格式的支持,或者优化模型推理的性能。这就像在实践中不断打磨自己的技艺,逐渐掌握 C# 开发 ASR 应用的精髓。
    • 浏览器项目实践:利用 HTML、CSS 和 JavaScript 开发一个简单的浏览器端 ASR 界面。实现语音输入功能,并将识别结果显示在页面上。可以参考一些开源的前端语音识别库,如 Web Speech API,快速搭建起基本的应用框架。然后,尝试与后端 C# 服务进行集成,实现数据的上传和结果的获取,完成一个完整的前后端交互的 ASR 应用。这一过程将帮助你熟悉浏览器开发的流程和技巧,以及前后端协作的方式。
  3. 资源利用:借助学习资料与社区
    • 官方文档与教程 :深入研究 C#、JavaScript 以及相关开发库(如Microsoft.ML.OnnxRuntime、Web Speech API 等)的官方文档。官方文档通常提供了详细的 API 说明、示例代码和使用指南,是学习的重要资源。此外,还可以搜索相关的在线教程和视频课程,如在慕课网、Coursera 等平台上,有许多关于语音识别开发的优质课程,能够帮助你系统地学习相关知识。
    • 开源项目与社区:关注 GitHub 等代码托管平台上的开源 ASR 项目。通过研究这些项目的代码结构和实现思路,可以学习到先进的开发方法和技巧。同时,参与相关的技术社区,如 Stack Overflow、Reddit 的语音识别板块等,与其他开发者交流经验、分享问题和解决方案。在社区中,你可以获取到最新的行业动态和技术趋势,拓宽自己的技术视野。

阿雪技术观

让我们积极投身于技术共享的浪潮中,不仅仅是作为受益者,更要成为贡献者。无论是分享自己的代码、撰写技术博客,还是参与开源项目的维护和改进,每一个小小的举动都可能成为推动技术进步的巨大力量

Embrace open source and sharing, witness the miracle of technological progress, and enjoy the happy times of humanity! Let's actively join the wave of technology sharing. Not only as beneficiaries, but also as contributors. Whether sharing our own code, writing technical blogs, or participating in the maintenance and improvement of open source projects, every small action may become a huge force driving technological progrss.

相关推荐
小婷要努力5 小时前
Linux常用命令速查表
linux·运维·服务器
艾上编程5 小时前
Python 跨场景实战:从爬虫采集到 AI 部署的落地指南
python·数据分析·自动化
爱宇阳5 小时前
Jenkins 多语言 Agent 完整部署教程
运维·servlet·jenkins
微风◝5 小时前
AlmaLinux9-网络管理篇-更改网络接口名称
linux·运维·网络
tianyuanwo5 小时前
Ansible构建节点管理:Koji与Mock构建节点的自动化运维实践
运维·自动化·ansible
码界奇点5 小时前
基于Flask与Vue.js的百度网盘自动转存系统设计与实现
vue.js·python·flask·自动化·毕业设计·源代码管理
北京耐用通信5 小时前
告别调试噩梦:耐达讯自动化实现EtherNet/IP转DeviceNet网关即插即用
人工智能·物联网·网络协议·自动化·信息与通信
怀旧,5 小时前
【Linux系统编程】10. 进程控制(下)
linux·运维·服务器
Evan芙5 小时前
DNS域名三级结构,DNS服务工作原理,涉及递归和迭代查询原理总结
linux·运维·服务器