最近在开发一个微信排队取号的的系统,其中对于服务员端(管理端) 需要有呼叫功能,即点按钮 就播出"xxx号顾客请就座"的声音。

经过在网上一番搜索研究,web端实现指定文字的语音播放 方案有这几种

1  免费在线服务,一些网站提供文字转语音文件的功能,其中好像百度,讯飞还提供接口调用,但对我来说,需要联网这个条件就被否决了。

2 使用微软内置activatex语音控件,最简单的但缺点也明显,只能在IE上用,考虑到系统可能在平板电脑上使用,所以这个方案也被否决。

js代码

var VoiceObj = new ActiveXObject("Sapi.SpVoice");
   VoiceObj.Speak("xxx号顾客请就座", 1);

3  重点来了。 前端使用H5的audio播放组件,后台使用SpeechSynthesizer生成wav音频文件流直接向播放器的src输出。

大致代码如下:

前端html

<audio id="audioPlay">
<source type="audio/wav" />
</audio> ...... function play(callText) {
var audioPlay = document.getElementById("audioPlay");
audioPlay.src = "../voicehandler.ashx? voice=" + callText;
audioPlay.play();
}

c#后台代码

public class VoiceHandler : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{ Thread t = null;
context.Response.ContentType = "application/wav";
using (MemoryStream ms = new MemoryStream())
{ t = new Thread(() =>
{
SpeechSynthesizer ss = new SpeechSynthesizer();
try
{
ss.Rate = -;
ss.Volume = ;
ss.SetOutputToWaveStream(ms);
ss.Speak(context.Request["voice"]);
}
catch(Exception ex)
{
ss.Dispose();
context.Response.Write(ex.Message);
}
});
t.Start();
t.Join();
ms.Position = ;
if (ms.Length > )
{
ms.WriteTo(context.Response.OutputStream);
}
context.Response.End(); } }
}

由于语音要设置人声,语速,然后合成语音等一个系列的过程,所以这里要注意的是需要通过异步线程方式调用 SpeechSynthesizer。

iis调用SpeechSynthesizer,还涉及权限问题,如果程序报出这个异常:

System.InvalidOperationException    Message=系统上未安装语音,或没有当前安全设置可用的语音。

那么,试试

1. 权限问题;你可以尝试把应用程序池的进程标识改成LocalSystem

2. webconfig配置:<identity impersonate="true" userName="YourAdminUsr" password="YourAdminPwd"/>

web端文字转语音的几种方案的更多相关文章

  1. php在web端播放amr语音(如微信语音)

    在使用微信JSSDK的上传下载语音接口时,发现一个问题: 下载的语音在iPhone上不能播放,测试了之后原因竟然是: 微信接口返回的音频内容是amr格式的,但iPhone不支持播放此类型格式. 那么转 ...

  2. 语音识别(语音转文字)&& 语音合成(文字转语音)

    [语音合成API]SpeechSynthesisUtterance是HTML5中新增的API,用于将指定文字合成为对应的语音.也包含一些配置项,指定如何去阅读(语言,音量,音调)等 // 语音播报 s ...

  3. 对接网易云信音视频2.0呼叫组件集成到vue中,实现web端呼叫app,视频语音通话。

    项目中需要实现视频通话功能,经过公司的赛选,采用网易云信的视频通话服务,app小伙伴集成很顺利.web端需要实现呼叫app端用户.网易云信文档介绍不全,vue的demo满足不了需求,和客服人员沟通,只 ...

  4. Web端测试和移动端测试的区别

    1.记录bug 在Web端可以通过系统自带的截图和QQ截图等方式来截取bug的图片,对于错误的地方可以用工具自带的标识来重点标记. 对于移动端设备可以用手机自带的截图工具来截图然后传到电脑上,个人一般 ...

  5. web端测试和移动端测试的区别小记

    转:http://qa.blog.163.com/blog/static/19014700220157128345318/ 之前一直参与web端的测试,最近一个项目加入了移动端,本人有幸参与了移动端的 ...

  6. cordova使用webrtc与网页端及移动端视频、语音聊天

    最近在做一个移动端与移动端.网页端文字.视频.语音聊天的功能.文字聊天使用websocket,在网上很多资料,也没什么难度.但是在视频.语音聊天上遇到了小小的难点.之前一直在找一些SDK想快速开发,例 ...

  7. Web端测试和移动端测试

    之前参加的项目有涉及Web端测试和移动端测试,简单的记录下他们之间的区别:   1.记录bug 在Web端可以通过系统自带的截图和QQ截图等方式来截取bug的图片,对于错误的地方可以用工具自带的标识来 ...

  8. Asciinema文章勘误及Web端使用介绍

    欠下的债迟早是要还的,查文档,重验证,出结果,不误导 文章勘误 在上一篇文章Asciinema:你的所有操作都将被录制中有两个地方表述有错误或瑕疵,这里更正一下 第一个地方为录制时的参数--stdin ...

  9. web端测试总结

    1.数值型输入框: 条件:demcial(x,y) ,界面显示小数点到y位 通常要检查以下几点: (1)边界值:最大值.最小值.最大值+1.最小值-1  (2)位数:最小位数.最大位数.最小位数-1最 ...

随机推荐

  1. java对文件操作之实用

    创建文件 package com.pre; import java.io.File; public class WJ { public static void main(String[] args) ...

  2. docker for mac 安装 kubernetes、kubernetes dashboard

    安装参考地址(按照此文档,安装成功):https://yq.aliyun.com/articles/508460 官方说明:https://kubernetes.io/docs/tasks/acces ...

  3. 在单文件组件中,引入安装模块里的css的2种方式:script中引入、style中引入

    在单文件组件中,引入安装模块里的css的2种方式:script中引入.style中引入 1.script中引入 <script> import 'bulma/css/bulma.css' ...

  4. js调用.net后台事件,和后台调用前台等方法总结(转帖)

    js调用.net后台事件,和后台调用前台等方法总结 原文来自:http://hi.baidu.com/xiaowei0705/blog/item/4d56163f5e4bf616bba16725.ht ...

  5. SSH框架搭建demo

    1.新建Java Web工程 2.添加Struts2.1框架支持 去除冲突包:antlr-2.7.2.jar 一般项目加上这三个包足够,后期可以视项目需求增加支持包: 2.1配置web.xml文件 增 ...

  6. 《LOST》 电视

    还没看正剧,所以转来帮助看电视 从起源到终点:<LOST>剧情全解析(一)   此文是LOST完结之后的剧情解析,剧透,慎入   从起源到终点:<LOST>剧情全解析(一) 转 ...

  7. ubuntu-docker入门到放弃(五)docker网络管理

    查看docker宿主机的网卡信息我们会发现,有一个docker0的网卡,这个网卡就是用于跟docker容器进行通讯的,这个网段跟我们docker容器的网段是一样的: #ifconfig docker容 ...

  8. linux svn客户端通过 https访问windows VisualSVN Server Manager

    1)需求: 已经在阿里云windwos系统 下面安装了VisualSVN Server Manager 做为svn服务器: 现在要在腾讯云源码安装新版本客户端 2)开始源码编译安装TortoiseSV ...

  9. java锁在等待唤醒机制中作用

    等待的线程放在线程池wait().notify().notifyall()都使用在同步中,因为要对持有监视器(锁)的线程操作.所以要使用在同步中,因为只有同步才具有锁. 为什么这些操作的线程的方法要定 ...

  10. linux开机出现一下错误Give root password for maintenance (or type Control-D to continue):

    由于错误的编辑/etc/fstab文件 而引起的不能正常进入系统.假如你将某一个分区或者磁盘最后一个参数设置为1或2时,系统默认会在开机过程中检查这个磁盘的扇区.假如系统检查不到这个磁盘,或者这个磁盘 ...