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

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

给你一个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 = 0i <TokensCounti++)

{

//从集合中取出单个 识别对象模块

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)

}

在你的服务器上面建立一个文件夹 music 共享它,在里面装音乐

然后在服务器上面安装 ttplayer 千千静听 用这个软件听音乐,会自动下载所有的歌词.

然后在客户机上面安装ttplayer 然后目录指向服务器共享的music目录就可以了.一样可以显示歌词

你好,

我有几百套易语言源码和模块,欢迎大家交流,共同进步

随时共享

这是我们易语言人自己的交流群:132157144 希望大家一起进步,本人随时解答各类疑问

还不懂得话,继续联系


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/52520.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-02-25
下一篇2023-02-25

发表评论

登录后才能评论

评论列表(0条)

    保存