(原创)c#调用开源espeak语音引擎实现中英文混读

  • 需求
  • 方案
  • c#引用espeak_lib.dll中的函数
  • c#对espeak_lib.dll函数进行封装
  • c#控制台程序调用发声
  • 源码Github地址

需求

实际.net项目中需要用到TTS(文本转语音技术),实现语音播服务,需要中英文混读

方案

1,微软TTS语音引擎。
调用非常简单 ,也是我首先采用的方案,可参考如下微博:
https://www.cnblogs.com/JuneZhang/archive/2014/04/28/3696594.html
但有个缺点:依赖windows平台的语音引擎与Speech Api,使用过程中会发现:有的系统能用,有的系统用不了(据说是阉割版系统所致);非中文版系统更惨,需要各种操作安装中文语音包,最后安装好了,可能发现还是用不了(项目中血淋淋的教训:windows server英文版系统,各种折腾最后用不了,甲方服务器,又不能随便重装系统),于是替代方案。

2,espeak方案
espeak是c语言写的一个小型的、开放源码的语音合成系统,支持多种语言,这里包括汉语,甚至是粤语等。
C++版开发教程可参考如下微博:
http://www.cnblogs.com/luochengor/p/3511165.html
http://cool.worm.blog.163.com/blog/static/6433900620097535713944/
上github找到了一个C#版本的espeak-ng调用demo,网址如下:
https://github.com/parhamdoustdar/espeak-ng-wrapper
没看懂espeak-ng,最后采用官网原生的espeak-1.48.04-source,并以github上c#框架进行改造,实现了c#调用开源espeak语音引擎TTS,摆脱了windows平台的语音引擎与Speech Api,实现了中英文混读的C#espeak方案。主要代码如下:

c#引用espeak_lib.dll中的函数

[DllImport("espeak_lib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
static extern Error espeak_SetVoiceByName([MarshalAs(UnmanagedType.LPUTF8Str)] string name);[DllImport("espeak_lib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
static extern Error espeak_SetParameter(Parameter parameter, int value, ParameterType type);[DllImport("espeak_lib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
static extern Error espeak_Synchronize();[DllImport("espeak_lib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
static extern Error espeak_Terminate();[DllImport("espeak_lib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr espeak_GetCurrentVoice();[DllImport("espeak_lib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
static extern Error espeak_Synth([MarshalAs(UnmanagedType.LPUTF8Str)] string text, int size, uint startPosition = 0, PositionType positionType = PositionType.Character, uint endPosition = 0, SpeechFlags flags = SpeechFlags.CharsUtf8, UIntPtr uniqueIdentifier = default(UIntPtr), IntPtr userData = default(IntPtr));[DllImport("espeak_lib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
static extern int espeak_Initialize(AudioOutput output, int bufferLength, IntPtr path, int options);[DllImport("espeak_lib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
static extern Error espeak_Cancel();[DllImport("espeak_lib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
static extern void espeak_SetSynthCallback(EventHandler.SynthCallback callback);

c#对espeak_lib.dll函数进行封装

  public static void Initialize(string path){IntPtr ptr = Marshal.StringToHGlobalAnsi(path);var result = espeak_Initialize(AudioOutput.Synchronous,100, ptr, 0);// 释放 ptr 的内存Marshal.FreeHGlobal(ptr);if (result == (int)Error.EE_INTERNAL_ERROR){throw new Exception(string.Format("Could not initialize ESpeak. Maybe there is no espeak data at {0}?", path));}espeak_SetSynthCallback(EventHandler.Handle);Initialized = true;}public static bool SetRate(int rate){if (rate < 80 && rate > 450){throw new Exception("The rate must be between 80 and 450.");}var result = espeak_SetParameter(Parameter.Rate, rate, ParameterType.Absolute);return CheckResult(result);}static bool CheckResult(Error result){if (result == Error.EE_OK){return true;}else if (result == Error.EE_BUFFER_FULL){return false;}else if (result == Error.EE_INTERNAL_ERROR){throw new Exception("Internal error in ESpeak.");}else{return false;}}public static bool Speak(string text){var result = espeak_Synth(text, text.Length * Marshal.SystemDefaultCharSize);return CheckResult(result);}public static bool SpeakSSML(string text){var result = espeak_Synth(text, text.Length * Marshal.SystemDefaultCharSize, 0, PositionType.Character, 0, SpeechFlags.CharsUtf8 | SpeechFlags.SSML);return CheckResult(result);}public static bool Stop(){var result = espeak_Cancel();return CheckResult(result);}public static bool Espeak_Synchronize(){var result = espeak_Synchronize();return CheckResult(result);}public static bool Espeak_Terminate(){var result = espeak_Terminate();return CheckResult(result);}public static bool SetVoiceByName(string name){var result = espeak_SetVoiceByName(name);return CheckResult(result);}public static Voice GetCurrentVoice(){IntPtr espeakVoicePtr = espeak_GetCurrentVoice();ESpeakVoice espeakVoice = (ESpeakVoice)Marshal.PtrToStructure(espeakVoicePtr, typeof(ESpeakVoice));if (espeakVoice.Equals(default(ESpeakVoice))){throw new Exception("eSpeak returned an empty voice object. Did you call one of the ESpeak.SetVoice*() functions?");}return new Voice(){Name = espeakVoice.Name,Languages = espeakVoice.Languages.Substring(1),Priority = (int)espeakVoice.Languages[0],Identifier = espeakVoice.Identifier,};}

c#控制台程序调用发声

 class Program{static void Main(string[] args){Client.Initialize("." );Client.SetVoiceByName("zh+m10");Client.Speak("Helloworld!");// 等待发音结束Client.Espeak_Synchronize();//Client.Espeak_Terminate();//Thread.Sleep(5000);Client.Stop();Client.Speak("你好。Hello world");Client.Espeak_Synchronize();Client.Espeak_Terminate();Console.Read();}}

源码Github地址

因该模块开发主要得益于开源,故将源码开源:

https://github.com/mastertostar/Csharp-espeak-tts

c#调用开源espeak语音引擎实现中英文混读相关推荐

  1. 开源驰骋工作流引擎设计ccflow已读回执设计

    为什么80%的码农都做不了架构师?>>>    驰骋工作流引擎设计ccflow已读回执 关键字:工作流引擎 已读回执 CCFlow 工作流程引擎已读回执 开源工作流引擎 工作流引擎已 ...

  2. 微软TTS语音引擎编程入门

    我们都使用过一些某某词霸的英语学习工具软件,它们大多都有朗读的功能,其实这就是利用的Windows的TTS(Text To Speech)语音引擎.它包含在Windows Speech SDK开发包中 ...

  3. ekho tts 下载_Ekho TTS简介(文本转语音引擎).pptx

    Ekho TTS 简介(文本转语音引擎)主讲:黄冠能;自我介绍eGuideDog项目简介Ekho的发展历史Ekho的技术简介如何向Ekho添加新的声音如何向Ekho添加新的方言WebSpeech;19 ...

  4. 速度超快!字节跳动开源序列推理引擎LightSeq

    机器之心发布 机器之心编辑部 这应该是业界第一款完整支持 Transformer.GPT 等多种模型高速推理的开源引擎. 2017 年 Google 提出了 Transformer [1] 模型,之后 ...

  5. 下面介绍一个开源的OCR引擎Tesseract2。值得庆幸的是虽然是开源的但是它的识别率较高,并不比其他引擎差劲。网上介绍Tessnet2也是当时时间排名第三的识别引擎,只是后来慢慢不维护了,目前是G

    下面介绍一个开源的OCR引擎Tesseract2.值得庆幸的是虽然是开源的但是它的识别率较高,并不比其他引擎差劲.网上介绍Tessnet2也是当时时间排名第三的识别引擎,只是后来慢慢不维护了,目前是G ...

  6. 移动语音引擎相关开发笔记

    随着移动应用的日益普及,移动语音应用越来越受到用户的重视和喜爱.在Android中使用语音引擎其实是很容易的事情,通过若干步骤就可以实现了,本文将指导用户如何在Android SDK中使用语音引擎去创 ...

  7. java tts引擎_让Java说话-用Java实现语音引擎

    为应用程序加上语音能力有什么好处呢?粗略地讲,是为了趣味,它适合所有注重趣味的应用,比如游戏.当然,从更严肃的角度来讲,它还涉及到应用的可用性问题.注意,这里我考虑的不仅是可视化界面固有的不足,而且还 ...

  8. win7 微软语音服务器,win7 TTS修复工具(微软tts语音引擎修复)

    [实例简介] 当系统没有语音功能,无法运行时,使用win7 TTS修复工具(微软tts语音引擎修复) 现有的语音不好时,可心安装第三方语音,如:捷通华声 XiaoKun 女声 中英文.女音库Hui.L ...

  9. VC++基于微软语音引擎开发语音识别总结

    关于SAPI的简介 API 概述 SAPI API在一个应用程序和语音引擎之间提供一个高级别的接口.SAPI 实现了所有必需的对各种语音引擎的实时的控制和管理等低级别的细节. SAPI引擎的两个基本类 ...

  10. 语音引擎 java_让Java说话-用Java实现语音引擎

    一.试用语音引擎 要使用这个语音引擎,你必须在CLASSPATH中加入本文提供的javatalk.jar文件,然后从命令行运行(或者从Java程序调用)com.lotontech.speech.Tal ...

最新文章

  1. MPB:邓晔、王尚等-​环境样本中的细菌总量测定—流式细胞法
  2. 软件生存周期文档系列 之 6.用户操作手册
  3. 利用Attribute扩展MVC的Title和Sitemap
  4. 最大子矩阵(信息学奥赛一本通-T1282)
  5. LG 源代码或被盗,如何才能毫发无损地要回来?
  6. php环境下cache失效,cache缓存失效高并发读数据库的问题
  7. 最佳路径搜索(二):启发式搜索(代价一致搜索(Dijkstra search),贪心搜索,A*搜索)
  8. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于社区疫情防控管理系统l3p3p
  9. JSFL自动绘画_2_三阶贝塞尔曲线画线
  10. ArcGIS模型构建器计算几何的方法
  11. 河北工业大学c语言寻宝游戏,计算机技术基础(c语言)课程设计 寻宝游戏.doc
  12. 控制/ 状态寄存器(RCC_CSR) 复位
  13. 编写吃c语言程序步骤,自己做的一个C语言小游戏——吃金子
  14. markdown还需要图床?你out了!用base64代替图床!
  15. 【有限位移旋量理论】罗德里格旋转公式(Rodrigues Rotation Formula)
  16. 前端前端开发工程师_我们庞大的工程师团队会使用此前端开发指南
  17. 如何在“运行”里打开软件
  18. Linux中常见文件类型及文件系统类型
  19. 晶圆测试Map转换(TSK/TEL/PT301)
  20. 网络爬虫爬取某网数据并制作词云全过程【内附可执行代码注释完整】

热门文章

  1. WEB 视频开发-视频播放器
  2. ETR290规范的理解
  3. “海纳百川”下载器的使用方法
  4. 中国大学mooc慕课题库答案怎么查,这里全有了
  5. 保利威视播放器函数接口汇总
  6. 描写计算机硬件的英语作文,介绍关于电脑的英语作文
  7. php 并列排名,MySQL并列排名和顺序排名查询
  8. OpenGL ES 之uniform和varying
  9. android 自动安装 解析包错误,安卓android手机安装包频繁提示解析错误解决方法...
  10. Android指纹验证(BiometricPrompt)