我正在为我的儿子写一个拼写单词应用程序,并希望推荐好的API,当它说话时可以理解.我正在使用.Net进行编程,因此与其互操作的东西会很方便.提前致谢.
我正在使用System.Speech.Synthesis.SpeechSynthesizer将文本转换为语音.由于微软的文档不足(参见我的链接,没有任何评论或代码示例),我无法解决两种方法之间的差异:
SetOutputToAudioStream和SetOutputToWaveStream.
这是我推断的:
SetOutputToAudioStream接受一个流和一个SpeechAudioFormatInfo实例,该实例定义波形文件的格式(每秒采样数,每秒位数,音频通道等)并将文本写入流.
SetOutputToWaveStream只接收一个流,并将16位单声道22kHz PCM波形文件写入流中.没有办法传入SpeechAudioFormatInfo.
我的问题是SetOutputToAudioStream不会将有效的wave文件写入流.例如,在将流传递给System.Media.SoundPlayer时,我得到一个InvalidOperationException("wave header is corrupt").如果我将流写入磁盘并尝试使用WMP播放,我会收到"Windows Media Player无法播放文件..."错误,但SetOutputToWaveStream写入的流在两者中都正常播放.我的理论是SetOutputToAudioStream没有写一个(有效的)头.
奇怪的是,SetOutputTo*Blah*的命名约定是不一致的.SetOutputToWaveFile采用SpeechAudioFormatInfo,而SetOutputToWaveStream则不采用.
我需要能够将8kHz,16位单声道波文件写入流中,这是SetOutputToAudioStream或SetOutputToWaveStream都不允许我这样做的.有没有人深入了解SpeechSynthesizer和这两种方法?
作为参考,这里是一些代码:
Stream ret = new MemoryStream();
using (SpeechSynthesizer synth = new SpeechSynthesizer())
{
synth.SelectVoice(voiceName);
synth.SetOutputToWaveStream(ret);
//synth.SetOutputToAudioStream(ret, new SpeechAudioFormatInfo(8000, AudioBitsPerSample.Sixteen, AudioChannel.Mono));
synth.Speak(textToSpeak);
}
Run Code Online (Sandbox Code Playgroud)
非常感谢@Hans Passant,这是我现在使用的要点:
Stream ret = new MemoryStream();
using (SpeechSynthesizer synth = new SpeechSynthesizer())
{
var mi = synth.GetType().GetMethod("SetOutputStream", BindingFlags.Instance | BindingFlags.NonPublic);
var fmt = new SpeechAudioFormatInfo(8000, AudioBitsPerSample.Sixteen, AudioChannel.Mono);
mi.Invoke(synth, new object[] { ret, fmt, true, true });
synth.SelectVoice(voiceName);
synth.Speak(textToSpeak);
}
return …Run Code Online (Sandbox Code Playgroud) 我正在TextToSpeech上创建一个应用程序.但是当我试图运行时,它会在后续行上抛出异常.
tts.speak(ruleOne, TextToSpeech.QUEUE_ADD, null);
Run Code Online (Sandbox Code Playgroud)
这是我的完整代码供参考
请给我任何提示.我不明白我的代码有什么问题.当我编译我的代码时,所有值都正确传递但当它跳转到tts对象上方时它会命中空指针异常.是什么语法错了?哪个方法首先调用onCreate()或onActivityResult?提前致谢
这是Logcat的内容.
04-10 13:58:34.082: WARN/System.err(19352): java.lang.NullPointerException
04-10 13:58:34.082: WARN/System.err(19352): at com.example.examguide.ExamRulesActivity.onCreate(ExamRulesActivity.java:60)
04-10 13:58:34.082: WARN/System.err(19352): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-10 13:58:34.092: WARN/System.err(19352): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
04-10 13:58:34.092: WARN/System.err(19352): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
04-10 13:58:34.092: WARN/System.err(19352): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-10 13:58:34.092: WARN/System.err(19352): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
04-10 13:58:34.092: WARN/System.err(19352): at android.os.Handler.dispatchMessage(Handler.java:99)
04-10 13:58:34.092: WARN/System.err(19352): at android.os.Looper.loop(Looper.java:123)
04-10 13:58:34.092: WARN/System.err(19352): at android.app.ActivityThread.main(ActivityThread.java:3683)
04-10 13:58:34.102: WARN/System.err(19352): at java.lang.reflect.Method.invokeNative(Native Method)
04-10 13:58:34.102: WARN/System.err(19352): at java.lang.reflect.Method.invoke(Method.java:507)
04-10 13:58:34.102: WARN/System.err(19352): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-10 13:58:34.102: WARN/System.err(19352): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-10 13:58:34.102: WARN/System.err(19352): …Run Code Online (Sandbox Code Playgroud) Python中是否有任何库使用Mac Lion的内置文本到语音引擎来实现或允许文本到语音转换?我做谷歌,但大多数是基于Windows的.我试过pyttx.我试着跑
import pyttsx
engine = pyttsx.init()
engine.say('Sally sells seashells by the seashore.')
engine.say('The quick brown fox jumped over the lazy dog.')
engine.runAndWait()
Run Code Online (Sandbox Code Playgroud)
但是我得到了这些错误
File "/Users/manabchetia/Documents/Codes/Speech.py", line 2, in <module>
engine = pyttsx.init()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pyttsx-1.0.egg/pyttsx/__init__.py", line 39, in init
eng = Engine(driverName, debug)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pyttsx-1.0.egg/pyttsx/engine.py", line 45, in __init__
self.proxy = driver.DriverProxy(weakref.proxy(self), driverName, debug)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pyttsx-1.0.egg/pyttsx/driver.py", line 64, in __init__
self._module = __import__(name, globals(), locals(), [driverName])
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pyttsx-1.0.egg/pyttsx/drivers/nsss.py", line 18, in <module>
ImportError: No module named Foundation
Run Code Online (Sandbox Code Playgroud)
我该如何解决这些错误?
我一直在Chrome(33及以上版本)中使用新的语音合成API来制作基于Web的通信辅助工具.我希望用户能够改变男性和女性之间的声音,API允许我这样做.但是,当首次加载页面并且第一次运行该功能时(来自onclick事件),它将使用默认的女性语音.然后在任何时候运行它,它使用我试图使用的男性声音.我怎样才能让男声第一次出现?
这是调用javascript的按钮:
<button type="button" name="speakMe"id="speakMe" onclick="speakPhrase($('phraseBar').getValue());" ><img src="images/speakMe.png" /></button>
Run Code Online (Sandbox Code Playgroud)
这里是speakPhrase函数被调用:
function speakPhrase(phrase) {
if(phrase =="")
{
alert("Please enter a phrase before asking me to speak for you. Thank you!");
}
else
{
var speech = new SpeechSynthesisUtterance(phrase);
var voices = window.speechSynthesis.getVoices();
speech.voice = voices.filter(function(voice) { return voice.name == 'Google UK English Male'; })[0];
window.speechSynthesis.speak(speech);
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
javascript text-to-speech speech-synthesis google-text-to-speech
多年来(从字面上看),我的应用程序遭遇了性能不佳的文本到语音引擎的困境,特别是调用时的初始化时间:
tts = new TextToSpeech(context, myOnInitListener);
Run Code Online (Sandbox Code Playgroud)
以上可能导致UI滞后,如果您在SO上搜索"文本到语音初始化缓慢",您会发现很多帖子.嵌入式高品质IVONA声音曾经是最糟糕的罪魁祸首,但Google TTS引擎现已获此殊荣.
他们最近的APK更新导致初始化时出现严重滞后 - 无需测试此代码,您可以转到Android文本到语音设置并尝试在可用引擎之间切换,同时按"收听样本",显示延迟很好".
为了尝试解决这个问题,我实施了以下内容:
private volatile TextToSpeech tts;
AsyncTask.execute(new Runnable() {
@Override
public void run() {
tts = new TextToSpeech(context, volatileOnInitListener);
}
});
Run Code Online (Sandbox Code Playgroud)
这完全解决了初始化的滞后问题,但我担心这可能会产生副作用,我没有考虑过?任何人都可以想到吗?
我也很困惑,因为我相信TextToSpeech构造函数是异步的,因此将此构造函数移动到工作线程应该没有区别?如果这种实现是前进的方向,那么Google为什么不在TextToSpeechSettings中实现它呢?
希望有人能澄清以上内容.提前致谢.
编辑 - 当我说"构造函数是异步的"时,我真的指的是它启动的引擎初始化过程,以及最终调用onInit
我有一个android.speech.tts.TextToSpeech.speak()用于读取消息的应用程序.
这些消息只能读出连接的蓝牙耳机.所以在我调用说话方法之前,我会检查AudioManager.isBluetoothA2dpOn();
说话方法实施:
ttsOptions.putInt(TextToSpeech.Engine.KEY_PARAM_STREAM, AudioManager.STREAM_VOICE_CALL);
ttsOptions.putFloat(TextToSpeech.Engine.KEY_PARAM_VOLUME, 1.0f);//MAX
tts.speak(text, TextToSpeech.QUEUE_ADD, ttsOptions, utteranceID);
Run Code Online (Sandbox Code Playgroud)
这种行为按预期工作了大约一年,但最近它在三星设备上失败的方式只是它将音频路由到手机的扬声器并且消息被大声读出.
我设法通过以下方式解决了路由问题:
1.AudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
2.mAudioManager.requestAudioFocus(null, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN);
3.mAudioManager.startBluetoothSco();
4.播放简短的音频文件
如果我执行这4个步骤,音频路由将被修复并路由到蓝牙耳机.
问题:
为什么三星设备将音频路由到手机扬声器而不是蓝牙设备?
任何可靠的方法来检查音频是否将被路由到耳机而不是AudioManager.isBluetoothA2dpOn();?
android text-to-speech android-audiomanager audio-route android-bluetooth
我正在尝试在已设置为 WebChromeClient 的 Android WebView 中使用 Web 语音合成 API。但是,当我检查页面并运行以下命令时,
console.log('speechSynthesis' in window, 'webkitSpeechRecognition' in window, 'speechRecognition' in window);每个命令都会返回 false、false、false。
如果我在 Android 上使用 Chrome 检查页面,那么它会返回 true、true、false。
通过 Chrome 应用程序打开的用户代理显示为:
“Mozilla/5.0(Linux;Android 8.1.0;Pixel 2 XL Build/OPM1.171019.018)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/64.0.3282.137 Mobile Safari/537.36”
Chrome WebView 显示为:
“Mozilla/5.0(Linux;Android 8.1.0;Pixel 2 XL Build/OPM1.171019.018;wv)AppleWebKit/537.36(KHTML,如 Gecko)版本/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36”
Chrome版本完全相同,但speechSynthesis不在窗口中。
我在网络视图上启用了以下设置:
webViewSettings.setJavaScriptEnabled(true);
webViewSettings.setAllowFileAccessFromFileURLs(true);
webViewSettings.setAllowUniversalAccessFromFileURLs(true);
webViewSettings.setAllowContentAccess(true);
webViewSettings.setAllowFileAccess(true);
webViewSettings.setDatabaseEnabled(true);
webViewSettings.setMediaPlaybackRequiresUserGesture(false);
Run Code Online (Sandbox Code Playgroud)
谢谢
我已经尝试了一段时间让语音或音素发音与谷歌的文本到语音一起使用,但未能使其始终如一地执行。
\n\n我通过使用https://tophonetics.com/获得了有限的结果\n它翻译为“牛发疯了”。到“\xc3\xb0\xc9\x99 ka\xca\x8a w\xc9\x9bnt m\xc3\xa6d”。但听不到\'\'\'\xc3\xb0\xc9\x99\'\n的声音。当我尝试“\xc3\xb0\xc9\xaas \xc9\xaaz s\xc9\x99m f\xc9\x99\xcb\x88n\xc9\x9bt\xc9\xaak t\xc9\x9bkst \xcb\x88\xc9 \xaan\xcb\x8cp\xca\x8at"。
\n\n是否有任何 SSML 代码来定义文本的语音块,\n可以采用以下格式“D,Is Iz sVm f@n\'EtIk t\'Ekst \'InpUt”\n可以代替“\xc3\xb0\” xc9\xaas\xc9\xaaz s\xc9\x99m f\xc9\x99\xcb\x88n\xc9\x9bt\xc9\xaak t\xc9\x9bkst\xcb\x88\xc9\xaan\xcb\x8cp\xca\x8at “\n”
\n高达 API 29 tts 在 android 上运行良好,可以说出任何文本
但是在 API 30 tts 上不再工作,我不知道为什么
谷歌文档说:
“面向 Android 11 且使用文本转语音的应用应在其清单元素中声明 TextToSpeech.Engine#INTENT_ACTION_TTS_SERVICE”
我不完全知道它们的含义以及如何在清单中实现这一点。
我希望任何人都可以帮助我解决这个问题。
text-to-speech ×10
android ×4
.net ×2
javascript ×2
audio-route ×1
chromium ×1
html ×1
java ×1
macos ×1
python ×1
webview ×1