C# Web应用调用EXE文件的一些实践

目录

需求

范例运行环境

可执行文件的设计

调用可执行文件方法

RunExecuteFile

RunShellExecuteFile

方法的区别

WEB调用举例

小结


需求

最近同事使用Python开发了一款智能文字转语音的程序,经讨论部署在WINDOWS环境服务器下,因此需要生成目标为可执行程序文件,即EXE文件。需要在WEB应用程序里进行调用,并传递相关参数。

该测试效果如下图:

打开AI语音合成配置如下:

 

如图配置中,可以选择朗读人角色,音量大小,音调高低和控制语速选项, 此款应用将在合成音视频中起到关键作用。 

范例运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.7.1 或以上

开发工具:VS2019  C#

可执行文件的设计

可执行文件 edgetts.exe 实现文字转语音功能,其说明如下:

序号参数类型说明
1-filename字符存在的文件名

word docx文档

txt文本文件

md markdown文档

2-s角色固定值主播的角色值
3-p字符固定值音调高低
4-r1位小数数值0.1开始的倍速默认为1.0
5-v整数0到100音量大小

调用方法:

edgetts.exe 要转换的文件名   [-s 声音参数 -p 音调参数 -r速度参数 -v 音量参数]
调用举例:

edgetts d:\tts\test.txt

edgetts d:\tts\test.txt  -s yunyang  -p default -r 1.0  -v 100

调用说明:

1、除要转换的文件名为必要参数外,其他参数均有默认值
2、转换程序不要放在根目录下
3、转换程序在转换文本相同路径下生成同名的mp3文件
4、转换程序需要连接外网

调用可执行文件方法

需要引用 using System.Diagnostics; 

程序集 System.Diagnostics.Process.dll 提供对本地和远程进程的访问权限并能够启动和停止本地系统进程。

包括两种方法,方法包括需要调用的可执行文件名和可提供的参数:

RunExecuteFile

 public string RunExecuteFile(string filename,string arguments){Process prc = new Process();try{prc.StartInfo.FileName = filename;prc.StartInfo.Arguments = arguments;prc.StartInfo.UseShellExecute = false;//输入输出重定向prc.StartInfo.RedirectStandardError = true;prc.StartInfo.RedirectStandardInput = true;prc.StartInfo.RedirectStandardOutput = true;prc.StartInfo.CreateNoWindow = false;prc.Start();//获得输出string output = prc.StandardOutput.ReadLine();return output;}catch (Exception ex){if (!prc.HasExited){prc.Close();}return ex.Message.ToString();}return "";}

RunShellExecuteFile

 

public string RunShellExecuteFile(string filename, string arguments)
{System.Diagnostics.Process prc = new System.Diagnostics.Process();prc.StartInfo.FileName = filename;prc.StartInfo.Arguments = arguments;prc.StartInfo.UseShellExecute = true;prc.StartInfo.CreateNoWindow = true;prc.Start();prc.WaitForExit();return "";
}

方法的区别

主要区别在于 UseShellExecute 的属性的 true 或 false 。该属性获取或设置指示是否使用操作系统 shell 启动进程的值。

如果应在启动进程时使用 shell,则为 true ;如果直接从可执行文件创建进程,则为  false 。 .NET Framework 应用默认值为 true 。为 true 的时候表示可以尝试调用一切可以调用的程序,但不限于EXE文件。

WEB调用举例

根据前面AI语音合成图示,可编写如下后端调用示例代码:

protected void Button1_Click(object sender, EventArgs e){string tts = "D:\\tts\\edgetts.exe";string tts_para = " -s " + x_speaker.SelectedValue;if (x_volume.Text != ""){tts_para += " -v " + x_volume.Text;}if (x_rate.Text != ""){tts_para += " -r " + x_rate.Text;}if (x_pitch.SelectedValue != "default"){tts_para += " -p " + x_pitch.SelectedValue;}string cdir = Request.PhysicalApplicationPath + "\\test\\ai\\";string[] allfs = Directory.GetFiles(cdir);for (int i = 0; i < allfs.Length; i++){string mp3 = allfs[i].ToLower();File.Delete(mp3);}string guid = System.Guid.NewGuid().ToString().Replace("-", "");string txtfile = Request.PhysicalApplicationPath + "\\test\\ai\\"+guid+".txt";SaveToFile(txtfile,debug.Text, false, Encoding.UTF8, 512);string mp3file = Request.PhysicalApplicationPath + "\\test\\ai\\"+guid+".mp3";string rv=RunShellExecuteFile(tts, " "+txtfile + tts_para);if (File.Exists(mp3file)){testaudio.Style["display"] = "";testaudio.Attributes["src"] = "https://" + Request.Url.Host + "/bfile/ai/" + guid + ".mp3";string imgurl = "https://" + Request.Url.Host + "/test/ai/images/boy.jpg";if (x_speaker.SelectedValue == "xiaoxiao" || x_speaker.SelectedValue == "xiaoyi" || x_speaker.SelectedValue == "yunxia"){imgurl = "https://" + Request.Url.Host + "/test/ai/images/girl.jpg";}layer.options_yes = "document.getElementById('testaudio').play();layer.closeAll();";layer.open("<img src=\""+imgurl+"\" width=200/>语音合成成功!", "'点这里播放'", "ok");}else{debug.Text = rv;layer.open("未找到文件!" + tts+ txtfile + tts_para, "'确定'", "ok");}}public string SaveToFile(string PathFile,string filecontent,bool append,System.Text.Encoding encodtype,int buffersize){string rv="";StreamWriter df=new StreamWriter (PathFile,append,encodtype,buffersize);try{df.Write(filecontent);df.Close();}catch(Exception e){rv=e.Message;df.Close();}finally{df.Close();}return rv;}//SaveToFile Function

前端代码示例如下:

    <div id="h5panel" runat="server" style="margin-top:-50px" class="login-box query-panel">
<div style="text-align:left"><asp:HyperLink ID="backurl" Text="返回" onclick="layer.open({ type: 2, shadeClose: false, content: '正在返回页面,请稍候...' });"  NavigateUrl="/cc/prods/media/msIndex.aspx"  runat="server"/> </div><h2><asp:Label ID="fnamelabel" runat="server" Text="文字转语音AI合成测试"></asp:Label></h2><div class="user-box" style=" color:White; text-align:center; margin-bottom:50px">
<br><br><div class="user-box" style=" display:none1; padding-top:10px;"><div style="display:flex"><asp:TextBox  TextMode="MultiLine" Rows="6" ID="debug" Height="100px" Text="Hello!欢迎来到立德云!" style="color:White; width:100%; background: #fff;display:none1; background-color:Black;filter:opacity(50%);"  runat="server"></asp:TextBox>          </div></div><audio id="testaudio" runat="server" autoplay="autoplay"  style="display:none" controls>  </audio><div class="user-box" style="margin-bottom:0px;display:flex;width:100%;justify-content:flex-end;"><input type="button" value="打开AI语音合成配置" style=" border-radius:5px" onclick="document.getElementById('ai_profile').style.display=''" /></div><div id="ai_profile" class="user-box" style="display:none; margin-top:0px;"><div class="form-horizontal" style=" margin-left:20px; border-style:solid; border-width:1px; border-radius:5px; padding-left :50px;"><div class="form-group" style=" margin-top:30px;"><label class="col-sm-1  control-label" style="font-size:12pt; text-align:center;">朗读人角色</label><div class="col-sm-2"><asp:DropDownList ID="x_speaker"  checkSchema="notnull" noClear CssClass="form-control" cName="音调"  AUTOCOMPLETE="off" required="" runat="server"><asp:ListItem Value="xiaoxiao">晓晓</asp:ListItem><asp:ListItem Value="xiaoyi">晓依</asp:ListItem><asp:ListItem Value="yunjian">云健</asp:ListItem><asp:ListItem Value="yunxi">云溪</asp:ListItem><asp:ListItem Value="yunxia">云霞</asp:ListItem><asp:ListItem Selected="True" Value="yunyang">云扬</asp:ListItem></asp:DropDownList></div><label class="col-sm-1  control-label" style=" font-size:12pt; text-align:center;">音量</label><div class="col-sm-1"><asp:TextBox ID="x_volume"  checkSchema="notnull" Text="100" noClear CssClass="form-control" cName="音量"  AUTOCOMPLETE="off" required="" runat="server"></asp:TextBox></div></div><div class="form-group"><label class="col-sm-1  control-label" style=" font-size:12pt; text-align:center;">音调</label><div class="col-sm-2"><asp:DropDownList ID="x_pitch"  checkSchema="notnull" noClear CssClass="form-control" cName="音调"  AUTOCOMPLETE="off" required="" runat="server"><asp:ListItem>default</asp:ListItem><asp:ListItem>x-low</asp:ListItem><asp:ListItem>low</asp:ListItem><asp:ListItem>medium</asp:ListItem><asp:ListItem>high</asp:ListItem><asp:ListItem>x-high</asp:ListItem></asp:DropDownList></div><label class="col-sm-1  control-label" style=" font-size:12pt; text-align:center;">语速</label><div class="col-sm-1"><asp:TextBox ID="x_rate"  checkSchema="notnull" Text="1.0" noClear CssClass="form-control" cName="语速"  AUTOCOMPLETE="off" required="" runat="server"></asp:TextBox></div></div></div></div><div class="user-box" style="text-align:center; display:none1; padding-top:10px;"><div align="center"><asp:Button ID="Button1" Text="AI语音合成" OnClientClick="layer.open({ type: 2, shadeClose: false, content: '正在进行AI语音合成...' });" style="width:30%; background-color:#1E90FF;color:White;border-color:#87CEFA;padding-left:10px; padding-right:10px" CssClass="form-control" runat="server" onclick="Button1_Click"  /></div></div><div class="user-box" style="text-align:center; display:none"><video id="coplayer" autoplay="autoplay" controls="controls" webkit-playsinline playsinline x5-playsinline x-webkit-airplay="allow" style="margin: 0px auto; width:100%" runat="server" ></video><a id="b_rate" onclick="rate(this);" style=" float:right; line-height:25px; margin-right:10px; color:#fff;display:none;">1x</a> </div><div class="ann" ><label><asp:Literal ID="x_introduce" runat="server"/></label></div></div>
<script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script><script type="text/javascript" src="hls.min.0.12.4.js"> </script><script type="text/javascript" src="tcplayer.v4.min.js"> </script>
<script type="text/javascript" language="javascript" src="/master/js/jquery.js" ></script><!-- BASIC JS LIABRARY --></div>

小结

在实际的应用中,调用 RunShellExecuteFile 方法更加通用一些,本示例调用 RunExecuteFile没有成功,因协作需要,我们需要尝试多种方法进行解决,而不是要在第一时间要求其它团队更改设计。

layer弹出框的代码请参考我的上传资源:layer 移动版弹出层组件的改造版

调用成功后会显示如下图:

 

如图我们看到使用了 H5 的 video 控件进行了演示播放。

再次感谢您的阅读,欢迎讨论指教!

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

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

相关文章

Pytest实践:Python测试技术基础知识!

一、简介 在软件开发领域&#xff0c;确保代码的正确性和稳健性至关重要。这就是软件测试发挥作用的地方。Python 是一种通用且广泛使用的编程语言&#xff0c;提供了大量的工具和库来帮助测试过程。 其中&#xff0c;Pytest就是一个很好用的测试框架&#xff0c;可以在 Pyth…

transformer上手(3) —— 开箱即用的 pipelines

1 开箱即用的 pipelines Transformers 库将目前的 NLP 任务归纳为几下几类&#xff1a; 文本分类&#xff1a;例如情感分析、句子对关系判断等&#xff1b;对文本中的词语进行分类&#xff1a;例如词性标注 (POS)、命名实体识别 (NER) 等&#xff1b;文本生成&#xff1a;例如…

2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 A题 移动通信网络中PCI规划问题 原题再现&#xff1a; 物理小区识别码(PCI)规划是移动通信网络中下行链路层上&#xff0c;对各覆盖小区编号进行合理配置&#xff0c;以避免 PCI 冲突、PCI 混淆以及 PCI 模3 千扰等现象。PCI 规划…

milvus各组件的结构体分析

milvus各组件的结构体分析 各组件启动&#xff0c;需要构建各组件的结构体&#xff0c;一共8个。 runComponent(ctx, localMsg, wg, components.NewRootCoord, metrics.RegisterRootCoord) runComponent(ctx, localMsg, wg, components.NewProxy, metrics.RegisterProxy) run…

lv_micropython for ESP32-C3

一、开发平台说明 硬件&#xff1a;立创实战派ESP32-C3开发板。处理器ESP32-C3&#xff08;内置400KB SRAM&#xff09;&#xff0c;无内置FLASH&#xff0c;2.0寸液晶&#xff08;液晶驱动IC:ST7789&#xff0c;触屏驱动IC:FT6336&#xff09;&#xff0c;下载口UART0。 ESP…

计算机网络的起源与发展历程

文章目录 前言时代背景ARPANET 的诞生TCP/IP 协议簇与 Internet 的诞生HTTP 协议与 Web 世界结语 前言 在当今数字化时代&#xff0c;计算机网络已经成为我们生活中不可或缺的一部分。无论是在家庭、学校、还是工作场所&#xff0c;我们都能感受到网络的巨大影响。随着互联网的…

c++ 中文转拼音的封装, char 类型 不支持 中文 已解决

在日常业务中&#xff0c;需要进行中文转拼音的检索。已便实现对应的 模糊搜索。 使用方法 std::string res "我是中国人";char* result new char[res.length() 1];for (int i 0; i < res.length(); i){result[i] res[i];}result[res.length()] \0;std::str…

【C++第三阶段】vector容器

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 构造函数赋值操作容量和大小插入和删除数据存取互换容器预留空间 构造函数 vector函数是常用数据结构&#xff0c;见于刷题网站。 它是单端数组&#xff0c;与普通数组区别在于可以…

【Linux】基础IO----理解缓冲区

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解缓冲区 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;Linux初阶 > 望…

Aritest+python+Jenkins解放双手iOS/Android自动化

ARITest、Python 和 Jenkins 可以结合在一起创建一个自动化测试解决方案&#xff0c;实现持续集成和持续测试的目标。以下是三者如何协同工作的基本概念&#xff1a; 1. **ARITest**&#xff1a; ARITest 是一款功能全面的自动化测试工具&#xff0c;提供 UI 自动化、接口自…

php中session相关知识(目前了解部分)

#记录学习知识 一.ini_set() 在PHP中&#xff0c;ini_set() 函数用于在脚本运行时设置指定的配置选项的值。这些配置选项可以是PHP的核心设置&#xff0c;例如文件上传的最大大小、脚本的最大执行时间、错误报告级别等。使用 ini_set() 可以临时改变PHP.ini文件中的设置&am…

独立服务器,数据安全保障:WorkPlus即时通讯为企业信息安全把关

随着手机普及率的不断增加&#xff0c;即时通讯已经成为了企业内部沟通的重要方式。WorkPlus作为一家领先的企业级即时通讯服务商&#xff0c;提供了全方位的即时通讯解决方案&#xff0c;助力企业实现沟通无障碍、协作高效率的目标。 WorkPlus提供了多样化的即时通讯功能&…

轻松解锁销售利润!使用淘宝商品关键词搜索API接口

随着电商行业的快速发展&#xff0c;如何提高销售利润成为了卖家们的关注焦点。淘宝商品关键词搜索API接口提供了一种高效的方式来帮助卖家们找到最适合的商品关键词&#xff0c;提高商品曝光率和销售量。联讯数据将全面介绍淘宝商品关键词搜索API接口的用途、优势以及如何使用…

蓝桥杯模拟赛题——魔法失灵了——toRefs()

目标 找到 index.html 中 TODO 部分&#xff0c;正确修复代码使 data 对象恢复响应式特性&#xff0c;即点击页面上的 - 与 按钮可以改变 value 的值。正确实现后效果如下&#xff1a; 题解 value是reactive 利用toRefs; toRefs() 函数可以将 reactive() 创建出来的响应式对象…

数据结构之单链表的相关知识点及应用

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构 目录 链表的概念及结构 链表与顺序表的区别与优劣势 链表的分类 单链表的实现 单链表中增加节点 单链表中尾插数据 打印单链…

《零基础入行IT:步步为营的转型攻略与实践策略》

在信息化社会&#xff0c;IT行业以其强劲的发展势头、广阔的就业前景和丰厚的薪酬待遇&#xff0c;吸引了无数希望转行或初入职场人士的目光。然而&#xff0c;对于毫无相关背景知识的人来说&#xff0c;如何成功叩开IT行业的大门&#xff0c;似乎是一项颇具挑战性的任务。本文…

SSH和交换机端口安全概述

交换机的安全是一个很重要的问题&#xff0c;因为它可能会遭受到一些恶意的攻击&#xff0c;例如MAC泛洪攻击、DHCP欺骗和耗竭攻击、中间人攻击、CDP 攻击和Telnet DoS 攻击等&#xff0c;为了防止交换机被攻击者探测或者控制&#xff0c;必须采取相应的措施来确保交换机的安全…

visual studio 2017开发QT框架程序

1. 配置开发环境 首先创建项目 进入到项目后&#xff0c;右键点击项目点击属性&#xff0c;配置如下&#xff1a;

【bash自动补全原理】

1 bash自动补全原理 1&#xff09;自动补全依赖于bash的内置命令complete、compgen、和/etc/bash_completioin.d路径下的自动补全脚本。补齐功能可以通过脚本指定命令参数如何补齐。默认补全脚本在/etc/bash_completion.d目录下。 2&#xff09;一般系统中会安装bash-complet…

所谓成长,从走出舒适区,做有挑战的事开始。

哈喽,你好啊,我是雷工! 史蒂夫乔布斯曾说过:“只有走出舒适区,才能发现更好地自己。” 01 度娘的掉队危机 曾经遇事不决问百度,百度,阿里巴巴,腾讯作为国内三家顶级的互联网公司被大家称为BAT三巨头。 后来百度的存在感越来越低,遇到问题也不仅仅去百度,而是会去抖…