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

news2024/12/25 13:45:56

目录

需求

范例运行环境

可执行文件的设计

调用可执行文件方法

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.coloradmin.cn/o/1574391.html

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

相关文章

C语言函数实现冒泡排序

前言 今天我们来看看怎么使用函数的方式实现冒泡排序吧&#xff0c;我们以一个数组为例arr[] {9,8,7,6,5,4,3,2,1,0},我们将这个数组通过冒泡排序的方式让他变为升序吧。 代码实现 #include<stdio.h> void bubble_sort(int arr[], int sz) {int i 0;for (i 0;i < s…

如何使用GraphQL和Apollo构建一个宝可梦应用

宝可梦是一个由视频游戏、动画系列与电影、交换卡牌游戏以及其他相关媒体组成的日本媒体特许经营权。 在本文中&#xff0c;我们将使用一个宝可梦GraphQL API&#xff0c;该API提供有关不同宝可梦的数据。 我们将使用Apollo和GraphQL来处理数据获取&#xff0c;以及React来构…

数据库之DCL操作(用户、访问权限。)

DCL英文全称是Data control language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 1.管理用户 1.1查询用户 select * from mysql.user; 其中 Host代表当前用户访问的主机&#xff0c;如果为localhost&#xff0c;仅代表只能够在当前本机访问&…

git上传到本地仓库

摘要&#xff1a;本地初始化init仓库&#xff0c;进行pull和push&#xff1b;好处是便于利用存储设备进行git备份 git init --bare test.git 随便到一个空的目录下git clone 然后使用git上传 把git仓库删除之后再clone一次验证一下是否上传成功&#xff1a; 如果在ubantu上面没…

嵌入式面向对象学习 RT-Thread I/O 设备管理框架 设备驱动层 案例测试

嵌入式面向对象 RT-Thread I/O 设备管理框架 设备驱动层 注&#xff1a;本文介绍性内容转载于《RT-Thread记录&#xff08;十、全面认识 RT-Thread I/O 设备模型&#xff09;》 注&#xff1a; 本次使用的开发板 &#xff1a; ​ 兆易创新GD32F407VET6开发板 ​ 雅特力科技…

c++的学习之路:7、类和对象(3)

目录 一、初始化列表 二、static成员 三、友元 四、内部类 五、匿名对象 六、类和对象的思维导图 一、初始化列表 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟一个放在括号中的初始…

求m和n的最大公约数(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int remainder 1;int m 0;int n 0;int middle 0;//提示用户&#xff1b;printf("请输入整数m和n的值&#xff…

辅助PC端教程

使用谷歌浏览器打开京东,并登录好账号进入到 https://home.jd.com/ ,在根据下面操作 更多工具 - 开发者工具,会有一个窗口打开,选择network,点击XHR

撸代码时,有哪些习惯一定要坚持?

我从2011年开始做单片机开发&#xff0c;一直保持以下撸代码的习惯。 1.做好代码版本管理 有些人&#xff0c;喜欢一个程序干到底&#xff0c;直到实现全部的产品功能&#xff0c;我以前做51单片机的项目就是这样。 如果功能比较多的产品&#xff0c;我不建议这样做&#xff0…

编译原理实验2(自上而下语法分析)

一、实验目的 给出 PL/0 文法规范&#xff0c;要求编写 PL/0 语言的语法分析程序。通过设计、编制、调试一个典型的自上而下语法分析程序&#xff0c;实现对词法分析程序所提供的单词序列进行语法检查和结构分析&#xff0c;进一步掌握常用的语法分析方法。选择有代表性的语法…

一款轻量、干净的 Vue 后台管理框架

开始之前 在开始介绍之前我想谈谈为什么要自己做一个后台管理&#xff0c;我知道很多人都用一些开源的后台管理项目&#xff0c;这些老前辈有很多亮点值得学习&#xff0c;但是存在的一些问题同样不可忽视&#xff0c;我认为很多开发者会被困扰(仅代表个人观点) 技术栈老旧不升…

面试(03)————多线程和线程池

一、多线程 1、什么是线程?线程和进程的区别? 2、创建线程有几种方式 &#xff1f; 3、Runnable 和 Callable 的区别&#xff1f; 4、如何启动一个新线程、调用 start 和 run 方法的区别&#xff1f; 5、线程有哪几种状态以及各种状态之间的转换&#xff1f; 6、线程…

Docker容器与虚拟化技术:OpenEuler 部署 ES 与 Kibana

目录 一、实验 1.环境 2.OpenEuler 部署 ES (EalasticSearch) 3.OpenEuler 部署 Kibana 4.部署 Elasticvue插件 5.使用cpolar内网穿透 6.使用Elasticvue 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 1…

flex布局align-items和align-content、justfiy-content的区别

justfiy-content&#xff1a;定义主轴的对齐方式align-items&#xff1a;定义交叉轴的对齐方式align-content&#xff1a;将flex子项作为一个整体起作用 只在两种情况下有效果&#xff1a; ①子项多行且flex容器高度固定 ②子项单行&#xff0c;flex容器高度固定且设置了fle…

Mac安装配置Appium

一、安装 nodejs 与 npm 安装方式与 windows 类似 &#xff0c;官网下载对应的 mac 版本的安装包&#xff0c;双击即可安装&#xff0c;无须配置环境变量。官方下载地址&#xff1a;https://nodejs.org/en/download/ 二、安装 appium Appium 分为两个版本&#xff0c;一个是…

HarmonyOS实战开发-屏幕属性(仅对系统应用开放)

介绍 本示例主要展示了屏幕管理相关的功能&#xff0c;使用ohos.display、ohos.screen接口&#xff0c;ohos.display接口提供获取默认display对象、获取所有display对象&#xff0c;开启监听、关闭监听功能&#xff1b;ohos.screen接口提供创建虚拟屏幕、销毁虚拟屏幕、扩展屏…

LeetCode-热题100:118. 杨辉三角

题目描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1]]…

什么软件可以保密公司文件?

#天锐绿盾# 天锐绿盾是一款专为企业设计的文件加密与数据防泄密软件&#xff0c;旨在通过一系列高级安全功能来保护公司的敏感信息和重要文件不被未经授权的访问、窃取或泄露。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfe…

蓝奏云直链获取在线解析网站源码

源码简介 蓝奏云直链获取在线解析网站源码 蓝奏云链接解析 本地API接口 支持有无密码和短期直链和永久直链&#xff0c;同时还可以显示文件名和大小。 这个解析器无需数据库即可搭建&#xff0c;API接口已经本地化&#xff0c;非常简单易用。 安装环境 php5.6 搭建教程 …

HTML - 你如何使H5页面禁止手动缩放

难度级别:初级及以上 提问概率:40% 我们知道,这道题其实是在考察meta标签的viewport属性,正常情况下设置viewport的代码为 <head><meta name="viewport" content="width=device-width,initial-scale=1.0" …