我最近一直在学习PHP中的错误处理,并且遇到了这个error_log()函数.
在PHP手册中,它讨论了所有错误日志类型,我理解所有这些类型除了类型3之外,它指出错误消息直接发送到SAPI日志记录处理程序.我的问题是SAPI究竟是什么以及您何时想要使用它?
我知道这是一个一般性的问题主题,但我仍然想知道C++中最快的语音识别库是什么?
目前我正在使用带有kniect的Microsoft SAPI.它工作正常并识别单词,但它的速度很慢,有时候识别单词需要1,2秒,在我的情况下,这种滞后会给用户带来很多交互问题.
我检查了kinect提供的样本,其中乌龟根据识别出的单词向右移动,但即便有点慢.
所以我想知道是否有更快的库然后sapi,可以用于像机器人使用语音识别的情况下你说"左"然后"右"但机器人继续向左移动并在1,2秒之后向右转令用户感到沮丧.
目标是能够发音像wo3.System.Speech可以处理汉字,但有没有办法直接输入拼音?从http://msdn.microsoft.com/en-us/library/ms720566(v=vs.85).aspx看来,我应该能够像这样写出拼音
<PRON SYM="ni 3"/>
Run Code Online (Sandbox Code Playgroud)
我如何使用PRON SYM?
更新: 以下是一些讨论该问题但没有解决方案的网页: - http://www.ms-news.net/f3012/problem-with-phonemes-and-chinese-tts-3031240.html
Update2 我在.NET中使用System.Speech.Synthesizer.也许这就是问题所在.我可以看到将它输入Speech Properties工作正常:

如果我从C#中执行此操作,它只会读取标记:
var culture = CultureInfo.GetCultureInfo("zh-CN");
var synth = new SpeechSynthesizer();
var voices = synth.GetInstalledVoices(culture);
if (voices.Count > 0)
{
synth.SelectVoice(voices[0].VoiceInfo.Name);
synth.Speak("<pron sym=\"ni 3 hao 3 xiao 1\"/>");
}
Run Code Online (Sandbox Code Playgroud) 我非常喜欢Microsofts最新的语音识别(和SpeechSynthesis)产品.
http://msdn.microsoft.com/en-us/library/ms554855.aspx
http://estellasays.blogspot.com/2009/04/speech-recognition-in-cnet.html
但是我觉得在使用语法时我有点受限.
不要误解我的语法,语法识别确切地指出了要注意的单词/短语,但是如果我希望它能够识别出一些我没有理解的东西呢?或者我想解析一个半预定命令名和半随机字的短语?
例如..
情景A - 我说"谷歌[漏油事件]",我希望它用括号中的搜索结果打开谷歌,这可能是任何东西.
场景B - 我说"找到[曼彻斯特]",我想让它在谷歌地图或任何其他未预先确定的地方搜索曼彻斯特
我希望它知道'谷歌'和'定位'是命令,它是参数之后的东西(可能是任何东西).
问题:有没有人知道如何混合使用预先确定的语法(语音识别应该识别的单词)和不在预定语法中的单词?
代码片段..
using System.Speech.Recognition;
...
...
SpeechRecognizer rec = new SpeechRecognizer();
rec.SpeechRecognized += rec_SpeechRecognized;
var c = new Choices();
c.Add("search");
var gb = new GrammarBuilder(c);
var g = new Grammar(gb);
rec.LoadGrammar(g);
rec.Enabled = true;
...
...
void rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
if (e.Result.Text == "search")
{
string query = "How can I get a word not defined in Grammar recognised and passed into here!";
launchGoogle(query);
} …Run Code Online (Sandbox Code Playgroud) 我将SAPI类型库导入Delphi.我可以使用以下代码将语音输出到PC扬声器:
procedure TForm1.Button1Click(Sender: TObject);
var
Voice: TSpVoice;
begin
Voice := TSpVoice.Create(nil);
Voice.Speak('Hello World!', 0);
end;
Run Code Online (Sandbox Code Playgroud)
我可以.wav使用以下代码将语音输出到文件:
procedure TForm1.Button1Click(Sender: TObject);
var
Voice: TSpVoice;
Stream: TSpFileStream;
begin
Voice := TSpVoice.Create(nil);
Stream := TSpFileStream.Create(nil);
Stream.Open('c:\temp\test.wav', SSFMCreateForWrite, False);
Voice.AudioOutputStream := Stream.DefaultInterface;
Voice.Speak('Hello World!', 0);
Stream.Close;
end;
Run Code Online (Sandbox Code Playgroud)
问题是当我播放.wav文件时听起来很糟糕,就像使用非常低的比特率一样.Audacity告诉我文件是单声道16位22.05kHz,但听起来比这更糟糕.
如何将语音输出到单声道16位44.1kHz .wav文件,该文件与直接发送到PC扬声器的语音输出完全相同?我无法弄清楚如何修改第二个代码示例来设置每个样本的比特和比特率.
Follup-up: Glenn的答案解决了比特率的问题.感谢那.但是输出到.wav文件的语音质量仍然低于直接输出到扬声器的质量.我使用屏幕录制软件将第一个代码块的输出记录为helloworldtospeakers.wav.添加了Glenn的第二个代码块生成helloworldtowav.wav.第二个文件显然有一些失真.有任何想法吗?
在C#的文本到语音应用程序中,我使用SpeechSynthesizer类,它有一个名为的事件SpeakProgress,每个语音都被触发.但是对于某些声音,参数e.AudioPosition不与输出音频流同步,并且输出波形文件的播放速度比此位置显示的速度快(请参阅此相关问题).
无论如何,我试图找到有关比特率和与所选语音相关的其他信息的确切信息.正如我所经历的那样,如果我可以使用此信息初始化wave文件,则将解决同步问题.但是,如果我找不到这样的信息SupportedAudioFormat,我知道找不到其他方法.例如,"Microsoft David Desktop"语音不提供支持的格式VoiceInfo,但它似乎支持PCM 16000 hz,16位格式.
如何找到SpeechSynthesizer所选语音的音频格式
var formats = CurVoice.VoiceInfo.SupportedAudioFormats;
if (formats.Count > 0)
{
var format = formats[0];
reader.SetOutputToWaveFile(CurAudioFile, format);
}
else
{
var format = // How can I find it, if the audio hasn't provided it?
reader.SetOutputToWaveFile(CurAudioFile, format );
}
Run Code Online (Sandbox Code Playgroud) 使用语音API或SAPI在C#中这两种方法有什么区别?
using SpeechLib;
SpVoice speech = new SpVoice();
speech.Speak(text, SpeechVoiceSpeakFlags.SVSFlagsAsync);
Run Code Online (Sandbox Code Playgroud)
返回Apacela的声音,和
SpeechSynthesizer ss = new SpeechSynthesizer();
ss.SpeakAsync ("Hello, world");
Run Code Online (Sandbox Code Playgroud)
不适用于Apacela的声音.
第一个声音返回所有声音,但第二个声音只返回少量声音.这是与SAPI 5.1和SAPI 5.3相关的吗?
在Vista和XP上的行为是相同的,在SpVoice能够检测到Apacela语音但是使用SpeechSynthesizer时,在XP和Vista上都没有检测到声音.
我猜XP使用SAPI 5.1,而Vista使用SAPI 5.3然后为什么在所有操作系统上都有相同的行为,但与API的行为不同?
另外哪个API更强大,两种方式/ API有什么区别?
首先:这不是Delphi和SAPI的重复.我对"Delphi中的SAPI"主题有一个具体问题.
我在Delphi 2009中使用了优秀的Import Type-Library指南来获取组件面板中的TSpVoice组件.这非常有效.同
var
SpVoice: TSpVoice;
Run Code Online (Sandbox Code Playgroud)
我可以写
SpVoice.Speak('This is an example.', 1);
Run Code Online (Sandbox Code Playgroud)
获得异步音频输出.
第一个问题
根据文档,我可以写
SpVoice.Speak('This is an example.', 0);
Run Code Online (Sandbox Code Playgroud)
获得同步音频输出,但我获得了EZeroDivide异常.为什么?
第二个问题
但更重要的是,我希望能够动态创建SpVoice对象(我认为这被称为"后期绑定"SpVoice对象),部分原因是我的应用程序的所有会话中只有一小部分会使用它,部分是因为我不想假设最终用户系统上存在SAPI服务器.
为此,我试过了
procedure TForm1.FormClick(Sender: TObject);
var
SpVoice: Variant;
begin
SpVoice := CreateOleObject('SAPI.SpVoice');
SpVoice.Speak('this is a test', 0);
end;
Run Code Online (Sandbox Code Playgroud)
显然什么也没做!(将0替换为0可以获得EZeroDivide异常.)
放弃
我是COM/OLE自动化的新手.对于我在这篇文章中所表现出的任何无知或愚蠢,我感到很抱歉......
为了让每个人遇到与我一样的问题,François的视频解释说SAPI/Windows中存在一个错误(某些地方不兼容),这使得以下代码引发了EZeroDivide异常:
procedure TForm1.FormClick(Sender: TObject);
var
SpVoice: variant;
begin
SpVoice := CreateOleObject('SAPI.SpVoice');
SpVoice.Speak('This is a text.');
end;
Run Code Online (Sandbox Code Playgroud)
视频中提供的解决方案是更改FPU控制字:
procedure TForm1.FormClick(Sender: TObject);
var
SpVoice: variant;
SavedCW: Word;
begin
SpVoice := CreateOleObject('SAPI.SpVoice'); …Run Code Online (Sandbox Code Playgroud) 如何在MS Speech中使用ARPA文件?Microsoft Speech Platform 11识别器的文档意味着可以从ARPA文件编译语法.
我能够编译一个ARPA文件 - 例如,Microsoft提供的一个小例子- 使用以下命令行:
CompileGrammar.exe -In stock.arpa -InFormat ARPA
Run Code Online (Sandbox Code Playgroud)
我可以在以下测试中使用生成的CFG文件:
using Microsoft.Speech.Recognition;
// ...
using (var engine = new SpeechRecognitionEngine(new CultureInfo("en-US")))
{
engine.LoadGrammar(new Grammar("stock.cfg"));
var result = engine.EmulateRecognize("will stock go up");
Assert.That(result, Is.Not.Null);
}
Run Code Online (Sandbox Code Playgroud)
此测试通过,但请注意它使用EmulateRecognize().当我切换到使用实际的音频文件时,如下所示:
using (var engine = new SpeechRecognitionEngine(new CultureInfo("en-US")))
{
engine.LoadGrammar(new Grammar("stock.cfg"));
engine.SetInputToWaveFile("go-up.wav");
var result = engine.Recognize();
}
Run Code Online (Sandbox Code Playgroud)
结果始终为null并且测试失败.
微软非常清楚地表明它得到了支持,但即便是非常简单的例子也似乎不起作用.我究竟做错了什么?
我对C#和Microsoft Speech平台都比较陌生,但我正在研究一个需要转录免费听写的服务器应用程序.MS Speech Platform SDK看起来很完美,并且可以在服务器上运行,除非我在GrammarBuilder中引用了AppendDictation()方法.
我正在使用Microsoft Speech Platform SDK 11,如果我定义语法,应用程序工作正常,但是当我在AppendDictation()中添加时,我遇到了这个错误:
Cannot find grammar referenced by this grammar.
Run Code Online (Sandbox Code Playgroud)
即使文档中的这个示例似乎也失败了:
GrammarBuilder startStop = new GrammarBuilder();
GrammarBuilder dictation = new GrammarBuilder();
dictation.AppendDictation();
startStop.Append(new SemanticResultKey("StartDictation", new SemanticResultValue("Start Dictation",true)));
startStop.Append(new SemanticResultKey("DictationInput", dictation));
startStop.Append(new SemanticResultKey("StopDictation", new SemanticResultValue("Stop Dictation", false)));
Grammar grammar=new Grammar(startStop);
grammar.Enabled=true;
grammar.Name=" Free-Text Dictation ";
_recognizer.LoadGrammar(grammar);
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我将LoadGrammar更改为LoadGrammarAsync,语法加载(或至少调用事件处理程序),但是recoginzer失败并出现此错误:
Error: At least one grammar must be loaded before doing a recognition.
Run Code Online (Sandbox Code Playgroud)
我已经读过该平台的服务器版本不支持听写,但它似乎很奇怪,它将附带一个不起作用的方法.有没有人设法获得在服务器上工作的听写语法?我究竟做错了什么?
非常感谢