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.rhkb.cn/news/307493.html

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

相关文章

软件供应链安全:寻找最薄弱的环节

在当今的数字时代&#xff0c;软件占据主导地位&#xff0c;成为全球组织业务和创新的支柱。它是差异化、项目效率、成本降低和竞争力背后的驱动力。软件决定了企业如何运营、管理与客户、员工和合作伙伴的关系&#xff0c;以及充分利用他们的数据。 挑战在于&#xff0c;当今…

【Godot4.2】CanvasItem绘图函数全解析 - 0.概述

概述 Godot提供了CanvasItem类型&#xff0c;并提供了_draw虚函数和一系列绘图函数。通过这些绘图函数&#xff0c;我们可以绘制各种图形、文本、纹理、样式盒、导航路径、辅助线以及制作自定义Node2D或Control。 我个人以往研究和使用比较多的是基础图形绘制功能&#xff0c…

pbootcms百度推广链接打不开显示404错误页面

PbootCMS官方在2023年4月21日的版本更新中&#xff08;对应V3.2.5版本&#xff09;&#xff0c;对URL参数添加了如下判断 if(stripos(URL,?) ! false && stripos(URL,/?tag) false && stripos(URL,/?page) false && stripos(URL,/?ext_) false…

【算法分析与设计】全排列

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定一个不含重复数字的整数数组 nums &#xff0c;返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 示例 1&#xff1…

单细胞RNA测序(scRNA-seq)Cellranger流程入门和数据质控

单细胞RNA测序(scRNA-seq)Cellranger流程入门和数据质控 单细胞RNA测序(scRNA-seq)基础知识可查看以下文章: 单细胞RNA测序(scRNA-seq)工作流程入门 单细胞RNA测序(scRNA-seq)细胞分离与扩增 1. 单细胞RNA-seq样本数据说明 样本数据来源文章:Acquired cancer re…

探秘大模型:《提示工程:技巧、方法与行业应用》背后的故事

提示工程是一种新兴的利用人工智能的技术&#xff0c;它通过设计提示引导生成式 AI 模型产生预期的输出&#xff0c;来提升人与 AI 的互动质量&#xff0c;激发 AI 模型的潜力&#xff0c;提升AI的应用水平。 为了让每一个人都拥有驱动大模型的能力&#xff0c;以微软全球副总裁…

Acwing.3999 最大公约数(gcd欧拉函数)

题解 给定两个正整数 a,m&#xff0c;其中 a<m。 请你计算&#xff0c;有多少个小于 m 的非负整数 x满足&#xff1a; gcd(a,m)gcd(ax,m) 输入格式 第一行包含整数 T &#xff0c;表示共有 T 组测试数据。 每组数据占一行&#xff0c;包含两个整数 a,m 。 输出格式 每…

计算机网络——40各个层次的安全性

各个层次的安全性 安全电子邮件 Alice需要发送机密的报文m给Bob Alice 产生随机的对称秘钥&#xff0c; K s K_s Ks​使用 K s K_s Ks​对报文进行加密&#xff08;为了效率&#xff09;对 K s K_s Ks​使用Bob的公钥进行加密发送 K s ( m ) K_s(m) Ks​(m)和 K B ( K S ) K…

Linux执行命令监控详细实现原理和使用教程,以及相关工具的使用

Linux执行命令监控详细实现原理和使用教程&#xff0c;以及相关工具的使用。 0x00 背景介绍 Linux上的HIDS需要实时对执行的命令进行监控&#xff0c;分析异常或入侵行为&#xff0c;有助于安全事件的发现和预防。为了获取执行命令&#xff0c;大致有如下方法&#xff1a; 遍…

别等Sora了!字节跳动旗下国产AI工具Dreamina,AI视频生成虽不完美,但够惊艳!

别等 Sora 了&#xff0c;试试字节跳动的 Dreamina&#xff01;Dreamina 是剪映旗下的一个 AI 创作平台&#xff0c;目前支持「文生图」、「智能画布」和「视频生成」功能。 Dreamina 官网&#xff1a;https://dreamina.jianying.com/ai-tool/home 之前对 Dreamina 的「文生图…

暴力枚举法

虽然暴力枚举法有时候效率低&#xff0c;时间复杂度高&#xff0c;但是在面对小规模数据集的时候&#xff0c;暴力枚举法往往是很好的思维利器。 B: 01 串的熵&#xff08;5分&#xff09; 问题描述 #include <iostream> #include <cmath> #include <algorithm…

【C++算法模板】数论:欧拉筛,线性查找质数的算法

文章目录 1&#xff09;传统找质数的方法&#xff08;优化筛选次数&#xff09;2&#xff09;欧拉筛 1&#xff09;传统找质数的方法&#xff08;优化筛选次数&#xff09; bool isPrime(int num) {for(int i2;i<sqrt(num)) {if(num%i0)return false;}return true; }如果要…

Training - 使用 WandB 配置 可视化 模型训练参数

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/137529140 WandB (Weights&Biases) 是轻量级的在线模型训练可视化工具&#xff0c;类似于 TensorBoard&#xff0c;可以帮助用户跟踪…

统信UOS(Linux)安装nvm node管理工具

整篇看完再操作&#xff0c;有坑&#xff01;&#xff01; 官网 nvm官网 按照官网方式安装&#xff0c;一直报 错 经过不断研究&#xff0c;正确步骤如下 1、下载安装包 可能因为网络安全不能访问github&#xff0c;我是链接热点下载的 wget https://github.com/nvm-sh/…

three.js跟着教程实现VR效果(四)

参照教程&#xff1a;https://juejin.cn/post/6973865268426571784&#xff08;作者&#xff1a;大帅老猿&#xff09; 1.WebGD3D引擎 用three.js &#xff08;1&#xff09;使用立方体6面图 camera放到 立方体的中间 like “回” 让贴图向内翻转 &#xff08;2&#xff09;使…

界面控件DevExpress WinForms/WPF v23.2 - 富文本编辑器支持内容控件

众所周知内容控件是交互式UI元素(文本字段、下拉列表、日期选择器)&#xff0c;用于在屏幕上输入和管理信息。内容控件通常在模板/表单中使用&#xff0c;以标准化文档格式和简化数据输入。DevExpress文字处理产品库&#xff08;Word Processing Document API、WinForm和WPF富文…

科研学习|可视化——Origin绘制相关性系数矩阵

一、Origin软件版本 Origin2021版本 二、插件下载地址 CorrelationPlot.opx资源-CSDN文库 三、插件安装步骤 从上述链接下载插件将插件解压缩&#xff08;最好是解压缩到orgin的安装目录&#xff09;用origin打开插件&#xff08;或者打开origin&#xff0c;将插件拖拽到origin…

【一招鲜】-阿里云服务器安全更新 RHSA-2021:3889: java-1.8.0-openjdk 安全和BUG修复更新

形似这种&#xff1a; RHSA-2021:3889: java-1.8.0-openjdk 安全和BUG修复更新 #1 查看可更新的软件java yum list updates |grep java #2 如果有可更新软件&#xff0c;则进行更新 yum -y update java-1.8.0-openjdk.x86_64 形似这种&#xff1a; RHSA-2021:4782: openssh …

C++设计模式:原型模式(八)

1、定义与动机 定义&#xff1a;使用原型实例指定创建对象的种类&#xff0c;然后通过拷贝这些原型来创建新的对象。 动机&#xff1a; 在软件系统中&#xff0c;经常面临着“某些结构复杂的对象”的创建工作&#xff1b;由于需求的变化&#xff0c;这些对象经常面临着剧烈的变…

CSS基础+基本选择器和复合选择器(如果想知道CSS的基础+基本选择器和复合选择器知识点,那么只看这一篇就足够了!)

前言&#xff1a;在我们学习完了html之后&#xff0c;我们就要开始学习三大件中的第二件—CSS&#xff0c;CSS 可以控制多重网页的样式和布局&#xff0c;也就是将我们写好的html代码加上一层华丽的衣裳&#xff0c;使网页变得更加精美。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨…