问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C#怎样实现语音聊天视频功能(要具体代码)

发布网友 发布时间:2022-04-29 13:35

我来回答

4个回答

热心网友 时间:2022-06-29 00:03

给你一个winform 的例子,对你可能有用!

涉及技术
动态调用Com对象(全反射、没有引用com ocx)
取得系统存在的各种语言引擎
使用引擎进行朗读
使用引擎进行保存声音

程序图列:

主要功能描述
实列变量等,构造函授等

取得所有的 识别对象模块集合,放入下拉框

代码

object _spVoiceCls =
null; //保存朗读用的 SAPI.SpVoice

const
int SpFlags =
1; //SpeechVoiceSpeakFlags.SVSFlagsAsyn

object _oISpeechObjectTokens =
null; //保存 SAPI.ISpeechObjectTokens 就是系统有的语音引擎集合

int TokensCount =
0; // 语音引擎集合 数
DictionaryEntry[] _deTokens=null; //榜定下拉框用的

public MainForm()
{
InitializeComponent();
this.HandleDestroyed +=
new EventHandler(Form1_HandleDestroyed);
}

private
void Form1_Load(object sender, EventArgs e)
{

InitSAPI();

}

系统事件:程序加载

取得所有的 识别对象模块集合,放入下拉框

代码

void InitSAPI()
{
//创建语音对象朗读用
_spVoiceCls = CreateComObject("SAPI.SpVoice");

if (_spVoiceCls == null)
{

MessageBox.Show("您的系统没有,微软语音组件");
Application.Exit();
}
else
{//取得所有的 识别对象模块集合

_oISpeechObjectTokens = CallComMethod("GetVoices", _spVoiceCls); //取得SAPI.ISpeechObjectTokens
//识别对象集合 Count;
object r = GetComPropery("Count", _oISpeechObjectTokens);
if (r is int)
{

TokensCount = (int)r;

if (TokensCount > 0)
{
//取得全部语音识别对象模块,及名称,以被以后使用
_deTokens = new DictionaryEntry[TokensCount];
for (int i = 0; i < TokensCount; i++)
{
//从集合中取出单个 识别对象模块
object oSpObjectToken = CallComMethod("Item", _oISpeechObjectTokens, i); //返回 SAPI.SpObjectToken
//取名称
string Description = CallComMethod("GetDescription", oSpObjectToken) as string;
//放到 DictionaryEntry 对象中,key 是 识别对象模块,value 是名称
_deTokens= new DictionaryEntry(oSpObjectToken, Description);

}
//邦定到 下拉框
cboxTokens.DisplayMember = "Value";
cboxTokens.ValueMember = "Key";
cboxTokens.DataSource = _deTokens;
cboxTokens.SelectedIndex = 0;
}

}

}

}

用户事件:朗读

朗读输入的文本信息

代码

private void btnSynthesis_Click(object sender, EventArgs e)
{
string msg = rTxtMsg.Text.Trim();
if (msg.Length != 0)
{

if (_spVoiceCls != null)
{

//设置语言引擎
SetComProperty("Voice", _spVoiceCls, cboxTokens.SelectedValue);
//调用Speak 函数,msg 是要播放的文本,1 是异步播放,因为是异步的 com 对象不立刻释放
CallComMethod("Speak", _spVoiceCls, msg, SpFlags);

}
}

}

用户事件:保存声音

将输入的文本信息生成音频文件保存到文件

代码

private void Save()
{
string msg = rTxtMsg.Text.Trim();
if (msg.Length != 0)
{
using (SaveFileDialog sfd = new SaveFileDialog())
{
sfd.Filter = "wav 文件 (*.wav)|*.wav";
sfd.RestoreDirectory = true;
if (sfd.ShowDialog() == DialogResult.OK)
{
/*
Enum SpeechStreamFileMode;
SSFMOpenForRead = 0;
SSFMOpenReadWrite = 1;
SSFMCreate = 2;
SSFMCreateForWrite = 3;

*/

int SpFileMode = 3;// SpeechStreamFileMode.SSFMCreateForWrite

object oSpFileStream = CreateComObject("SAPI.SpFileStream"); //创建 SAPI.SpFileStream

object oSpVoice = CreateComObject("SAPI.SpVoice"); //创建 SAPI.SpVoice

try
{
CallComMethod("Open", oSpFileStream, sfd.FileName, SpFileMode, false); //打开流
SetComProperty("Voice", oSpVoice, cboxTokens.SelectedValue); //设置 Voice 属性,让谁朗读
SetComProperty("AudioOutputStream", oSpVoice, oSpFileStream); //设置流

CallComMethod("Speak", oSpVoice, msg, SpFlags); //调用 Speak

CallComMethod("WaitUntilDone", oSpVoice, Timeout.Infinite); //等
CallComMethod("Close", oSpFileStream); //关闭流

MessageBox.Show("保存成功");
}
finally
{
Marshal.ReleaseComObject(oSpVoice);
Marshal.ReleaseComObject(oSpFileStream);
}

}

}
}

}
private void btnSave_Click(object sender, EventArgs e)
{

try
{
btnSave.Enabled = false;
Save();

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
btnSave.Enabled = true;
}

}

调用com组件,功能函数

自己写的一些帮助函数可以方便调用反射,要不太郁闷(如果是VB 就不用如此费尽了)

#region 调用com组件,功能通用函数
/// <summary>
/// 设置属性
/// </summary>
/// <param name="name"></param>
/// <param name="o"></param>
/// <param name="vlaue"></param>
private static void SetComProperty(string name, object o, object vlaue)
{
Type t = o.GetType();
t.InvokeMember(name, BindingFlags.Instance | BindingFlags.SetProperty, null, o, new
object[] { vlaue });
}
/// <summary>
/// 取得属性
/// </summary>
/// <param name="name"></param>
/// <param name="o"></param>
/// <returns></returns>
private static object GetComPropery(string name, object o)
{
Type t = o.GetType();
return t.InvokeMember(name, BindingFlags.Instance | BindingFlags.GetProperty, null, o, null);
}
/// <summary>
/// 调用方法函授
/// </summary>
/// <param name="name"></param>
/// <param name="o"></param>
/// <param name="parms"></param>
/// <returns></returns>
private static object CallComMethod(string name, object o, params object[] parms)
{
Type t = o.GetType();

return t.InvokeMember(name, BindingFlags.Instance | BindingFlags.InvokeMethod, null, o, parms);
}
/// <summary>
/// 创建 com 对象
/// </summary>
/// <param name="FromProgID"></param>
/// <returns></returns>
private static object CreateComObject(string FromProgID)
{
Type comType = Type.GetTypeFromProgID(FromProgID);
object rVar = null;
if (comType != null)
rVar = System.Activator.CreateInstance(comType);

return rVar;
}
#endregion

释放com对象
很简单的就一行即可

代码
void Form1_HandleDestroyed(object sender, EventArgs e)
{
//释放com对象
Marshal.ReleaseComObject(_spVoiceCls);

}

热心网友 时间:2022-06-29 00:03

关注中……

热心网友 时间:2022-06-29 00:04

网页链接  早年写的一个C#版聊天工具,最近看到发出来。有些功能不好用了,只用作学习

热心网友 时间:2022-06-29 00:04

仿照QQ聊天所做的一个项目,只限于局域网的,个人认为非常棒的,大家一起来分享~记得上次就放出过类似源码,但感觉这次比上次的更完整,这是某培训机构作为一个重要的网络实例来做的,界面不错,而且功能也可以,在VS2005下顺利编译通过,学习绝对有用。

VS2005+sql server2005

参考代码:

C#仿QQ客户端+服务端+数据库文件.zip

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...女孩 姓陆 2011年11月26号03点24分 出生 五行缺水火 望高人帮忙起名... 女孩,姓陆,2010.农历05.19下午13.25分出生。五行不缺。请各位大虾取个... 2013年女孩3月9号11点43姓陆女孩取什么名字 2012年11月11日上午5点左右出生的女孩五行缺什么,姓陆,取什么名好 女孩2013年4月4日清明节晚上二十三点半左右出生想知道五行缺?啥取什... 公对公汇款需要什么资料 在微信附近的人里面我点击了清除位置并退出的按钮这样别人在附近的人... 13点128保留整数是多少 128乘以72怎么估算 按要求把下面各数省略万位(或亿位)后面的尾数,求出近似数.1284639... C#怎样实现网页视频聊天? 微信明年3月份不能用了吗 华为手机拍照好内存大的是哪款 明年三月微信支付宝不能作为收款 明年3月1日起微信里的钱怎么办? 微信支付明年三月份停止吗 微信明年3月1号不能收款 微信支付明年将不能使用 房屋贷款合同丢了解压怎么办理 请问深圳市总工会是干什么用的? 明年不让用微信支付宝怎么回事? 购房贷款合同丢失怎么办 房屋贷款合同遗失如何补办 深圳工会卡有什么好处 我最喜欢的玩具积木 我和乐高积木的一件事作文 最喜欢的玩具是积木,帮我想想,几句通顺点的话,拜托&#xF64F;拜托 我喜欢的玩具积木作文 我喜欢的乐高积木作文 我家用的电视是VIDAA-ed,我家是自己有点歌机,但是不知道怎么把点歌机上的唱歌视频投到电视剧上 求教!关于用c#编写一个视频聊天程序的原理与一些细节! java Socket编写视频聊天程序,怎样实现视频的传输,只要传输的相关代码就可以 jsp中实现视频聊天,我要源码? 想知道茄子丝怎么炒不吸油啊? 苏州五星饭店有哪些 梦见自己翻出好多钱给别人去救人什么意思? 新加坡是个华人世界吗? 久桓中央美地怎么样?好不好?值不值得买? 证大御湖国际怎么样?好不好?值不值得买? 华为手机死机了,怎么办? 《上邪》歌词 攀枝花那个皇冠假日酒店,是不是铁投·御湖兰庭自带的啊? 四会恒大御湖城交通方便吗?应该怎么过去? 上邪的歌词 四会恒大御湖城周边环境怎么样?生活便利吗? 小曲儿《上邪》的故事是什么? 联科国际信息产业园周边环境怎么样?生活便利吗? 我愿与君绝是什么意思 国信御湖公馆怎么样?好不好?值不值得买? 上邪mv里写的西安发现的合葬墓是真的?