什么是SAPI?

软件中的语音技术主要包括两方面的内容,一个是语音识别(speech recognition) ,另外一个是语音合成(speech synthesis),也即是文本语音转换系统(TTS)。TTS系统使用合成语音合成文本字符串和文件到声音音频流。而语音识别系统则是转换人类的声音语音流到可读的文本字符串或者文件。这两个工作,都是通过各种语音引擎来完成的。微软所提供的SAPI (全称The Microsoft Speech API),正是在应用程序和语音引擎之间提供一个高级别的接口,它实现了所有必需的对各种语音引擎的实时的控制和管理等低级别的细节。语音引擎通过DDI层(设备驱动接口)和SAPI进行交互,应用程序通过API层和SAPI通信。通过使用这些API,我们可以快速开发在语音识别或语音合成方面应用程序。SAPI 应用程序编程接口(API)明显的减少了构建一个使用语音识别和文本语音转换的应用程序所需要的高层代码,使语音技术更加容易使用并且更加扩大了应用的范围。虽然现在SAPI不是业界标准,但he是应用非常广泛。

SAPI包括以下组件对象(接口):
  • Voice Commands API 对应用程序进行控制,一般用于语音识别系统中。识别某个命令后,会调用相关接口是应用程序完成对应的功能。如果程序想实现语音控制,必须使用此组对象。

  • Voice Dictation API 听写输入,即语音识别接口。

  • Voice Text API 完成从文字到语音的转换,即语音合成。

  • Voice Telephone API 语音识别和语音合成综合运用到电话系统之上,利用此接口可以建立一个电话应答系统,甚至可以通过电话控制计算机。

  • Audio Objects API 封装了计算机发音系统。

其中Voice Text API,就是微软TTS引擎的接口,通过它我们可以很容易地建立功能强大的文本语音程序,金山词霸的单词朗读功能就用到了这些API,而目前几乎所有的文本朗读工具都是用SAPI开发的。在这里,我们使用的主要就是Voice Text API

SAPI SDK 下载 目前已经无法访问


unity 使用代码

  • 需要引用库 Interop.SpeechLib

speechLib.png (231×128) )

  • unity代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using SpeechLib;
using UnityEngine;

namespace XC
{
public class SpeechControll : MonoBehaviour
{
private static SpeechControll _instance;

public static SpeechControll Ins
{
get
{
if (null == _instance)
{
GameObject go = new GameObject("[SpeechControll]");
_instance = go.AddComponent<SpeechControll>();
_instance.Init();
}

return _instance;
}
}

SpVoice _voice;

void Init()
{
//实例化 SpVoice 对象
_voice = new SpVoice();
//管理语音属性
_voice.Voice = _voice.GetVoices(string.Empty, string.Empty).Item(0);
//语音速度,范围-10到10,默认是0
_voice.Rate = 0;
//语音音量,范围0到100,默认是100
_voice.Volume = 100;
}


public void Play(string content)
{
Stop();
//同步朗读(同步朗读时系统会停在这里,直到朗读完毕才会往下执行,建议使用异步朗读)
// voice.Speak(content);
//异步朗读
_voice.Speak(content, SpeechVoiceSpeakFlags.SVSFlagsAsync);
}

/// <summary>
/// 暂停
/// </summary>
public void Pause()
{
_voice.Pause();
}

/// <summary>
/// 恢复
/// </summary>
public void Recovery()
{
_voice.Resume();
}

/// <summary>
/// 停止
/// </summary>
public void Stop()
{
_voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
}

private void OnDestroy()
{
// 异步朗读在unity停止后不会自动停止
Stop();
}
}
}

Unity打包后程序崩溃问题

  • unity打包后运行到需要播报语音的代码时会发生崩溃,并且没有崩溃提示
解决办法
  • 测试环境 win10 unity 2020.3.34f1c2
  • 发布程序为 .Net 4.X

打包后需要把对应unity安装路径下的
2020.3.34f1c2\Editor\Data\MonoBleedingEdge\lib\mono\4.5\CustomMarshalers.dll CustomMarshalers.dll
拷贝到打包程序的根目录注意:必须是根目录下

经测试只能使用版本号后边不带APICustomMarshalers.dll 库(未完全测试)
例如 4.5.1-api下的CustomMarshalers.dll 就会发生崩溃


xclikee/SpeechLib: 文本转语音库 - Gogs (local.xclikee.top)

参考

微软SAPI(The Microsoft Speech API):让你的软件能说会道

Zoomicon/SpeechLib:使用 Windows.Speech 或 Microsoft.Speech 以及可选的 Kinect V1 Sensor 麦克风阵列进行语音合成和识别的库 (github.com)