我在我的 C# WPF 项目中实现了 TTS。
以前,我使用 System.Speech.Synthesis 命名空间中的 TTS 来说话。说话内容为SSML格式(语音合成器标记语言,支持自定义语速、语音、强调)如下:
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US"><prosody rate="x-fast">hello world. This is a long sentence speaking very fast!</prosody></speak>
Run Code Online (Sandbox Code Playgroud)
但不幸的是,System.Speech.Synthesis TTS 存在内存泄漏问题,正如我在问题Memory Leak in .Net Speech.Synthesizer?中提到的那样。。
所以我决定使用SAPI COM组件。我可以轻松地让SAPI讲纯文本内容。但后来我继续尝试让它说出 SSML 字符串,但失败了。代码如下:
//Initialize TTS instance
SpeechLib.SpVoiceClass tts = new SpeechLib.SpVoiceClass();
//Generate SSML string
string textToSpeak = "hello world speak Extra Fast.";
PromptBuilder pb = new PromptBuilder();
pb.StartStyle(new PromptStyle(PromptRate.ExtraFast));
pb.AppendText(textToSpeak);
pb.EndStyle();
ssmlString = pb.ToXml(); //ssmlString = @"<speak version=""1.0"" ....
//Speak!
tts.Speak(ssmlString, SpeechLib.SpeechVoiceSpeakFlags.SVSFParseSsml);
Run Code Online (Sandbox Code Playgroud)
代码的重要部分是
tts.Speak(ssmlString, SpeechLib.SpeechVoiceSpeakFlags.SVSFParseSsml);
Run Code Online (Sandbox Code Playgroud)
它使用 …
我正在开发文本到语音应用程序,我想将土耳其语设置为这样:
tts.setLanguage(Locale.TR);
Run Code Online (Sandbox Code Playgroud)
但这在android中不可用,这种添加方式是错误的还是有不同的方法将土耳其语添加到文本到语音中。
任何帮助和建议将不胜感激
文本转语音代码:
public class AndroidTextToSpeechActivity extends Activity implements
TextToSpeech.OnInitListener {
/** Called when the activity is first created. */
private TextToSpeech tts;
private Button btnSpeak;
private EditText txtText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tts = new TextToSpeech(this, this);
btnSpeak = (Button) findViewById(R.id.btnSpeak);
txtText = (EditText) findViewById(R.id.txtText);
// button on click event
btnSpeak.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
speakOut();}
});}
@Override
public void onDestroy() {
// Don't forget to shutdown!
if (tts …Run Code Online (Sandbox Code Playgroud) 我目前正在为视障人士开发一个应用程序,它将读取 .txt 文件。我正在考虑加载带有 50 个字符的块中的文本,这将类似于“页面”。问题是如何在 TTS 中连接这些“块”。我正在使用方法Tts.speak(speechText, TextToSpeech.QUEUE_ADD, null),块之间总是有一个空格。当单词或句子(由于语调)被语音空间分开时,这是很烦人的。难道没有像“流”这样的东西可以连续向 tts 添加语音文本并且不提供语音空间吗?
我知道我可以不将文本划分为页面,而是划分为句子,但并非所有文本都在句子中,因此我必须定义一些如何划分文本的好方法。现在,具有相同字符数的块的解决方案对我来说似乎更好。
当我使用这条线设置日语区域设置时,它工作得很好。
tts.setLanguage(Locale.JAPANESE);
Run Code Online (Sandbox Code Playgroud)
当我替换法语、德语、意大利语和中文时,它也有效。
当我替换西班牙语、俄语或印地语时,Eclipse 告诉我“西班牙语无法解析或不是一个字段”[填写其他语言]。
我听说 Android 确实提供了对这些语言的支持,那么我怎么可能找不到它们呢?
我正在构建简单的文本到语音应用程序,并且好奇是否可以在声音的性别之间切换?
非常感谢任何形式的帮助!
我有一个应用程序,根据某些事件,将正常通知更改为文本到语音,因为有时用户无法使用手机,并且不处理手机会更安全。
例如,当你开车时,这很危险,所以我想将通知转换为文本到语音。我已经寻找了很长一段时间关于开车时将文本转换为语音的一些解释,但我在搜索的地方找不到任何参考。
为了生成文本到语音,我有这部分,效果很好:
private TextToSpeech mTextToSpeech;
public void sayText(Context context, final String message) {
mTextToSpeech = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
try {
if (mTextToSpeech != null && status == TextToSpeech.SUCCESS) {
mTextToSpeech.setLanguage(Locale.US);
mTextToSpeech.speak(message, TextToSpeech.QUEUE_ADD, null);
}
} catch (Exception ex) {
System.out.print("Error handling TextToSpeech GCM notification " + ex.getMessage());
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何检查我当前是否正在开车。
我正在开发一个应用程序,可以通过蓝牙 SCO 播放 TextToSpeech 音频。连接到目标蓝牙设备(汽车立体声),然后指示 TextToSpeech 引擎说话后,即使我在通过 SCO 连接和播放 TextToSpeech 之间等待了几秒钟,也需要大约 15 秒才能开始播放音频。
这是我用来通过 SCO 连接的代码:
AudioManager audioM = (AudioManager) getApplicationContext().getSystemService(getApplicationContext().AUDIO_SERVICE);
audioM.setMode(audioM.MODE_IN_COMMUNICATION);
audioM.setBluetoothScoOn(true);
audioM.startBluetoothSco();
audioM.setSpeakerphoneOn(false);
Run Code Online (Sandbox Code Playgroud)
这是我用来播放 TextToSpeech 的代码:
String text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry.";
HashMap<String, String> ttsParams = new HashMap<String, String>();
ttsParams.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_VOICE_CALL));
mTts.speak(text, TextToSpeech.QUEUE_FLUSH, ttsParams);
Run Code Online (Sandbox Code Playgroud)
其他 Android 应用程序(包括 VOIP 和内置电话应用程序)不会受到此延迟的影响。我创建的一个等效的 iOS 应用程序没有延迟。所以我知道问题不在于立体声。
任何帮助将不胜感激,谢谢
TextToSpeech当按下后退按钮时,我正试图停止。但即使我关闭我的应用程序,讲话也不会停止。仅当我清除缓存时,语音才会停止。我该如何解决这个问题?请帮助我理解。
private boolean mShouldSpeak = true;\nTextToSpeech tts;\n @Override\nprotected void onCreate(Bundle savedInstanceState) {\n super.onCreate(savedInstanceState);\n setContentView(R.layout.activity_cat);\n\n tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {\n @Override\n public void onInit(int status) {\n if (status == TextToSpeech.SUCCESS) {\n tts.setEngineByPackageName(enginePackageName);\n tts.setLanguage(Locale.getDefault());\n tts.setPitch(0);\n tts.setSpeechRate(1);\n speak();\n }\n }\n });\n}\n private void speak() {\n\n if (mShouldSpeak == true)\n {\n tts.speak("\xd0\x90\xd0\xb2\xd1\x82\xd0\xbe\xd1\x80: " +getResources().getString(R.string.catAuthor), TextToSpeech.QUEUE_ADD, null);\n tts.playSilence(1000, TextToSpeech.QUEUE_ADD, null);\n tts.speak(getResources().getString(R.string.catName), TextToSpeech.QUEUE_ADD, null);\n tts.playSilence(1000, TextToSpeech.QUEUE_ADD, null);\n tts.speak(getResources().getString(R.string.catDesc), TextToSpeech.QUEUE_ADD, null);\n tts.playSilence(1000, TextToSpeech.QUEUE_ADD, null);\n }\n\n}\n @Override\nprotected void onDestroy() {\n if (tts != null)\n …Run Code Online (Sandbox Code Playgroud) 我首先要说的是,我在 C# 编程方面非常新手。我正在开发一个应用程序,用于使用 C# 结合 SAPI v5.4 ( speechlib ) 以编程方式修改 Windows 语音词典。到目前为止,一切都运行良好,但我需要更深入地了解字符串在合成(有声)时如何解释。
我的理解是,在 SAPI 5.4 中,单词被分解为音素表示,并且我在使用音素正确“训练”单词发音方面取得了一些成功。我还知道我可以手动将单词添加到 Windows 语音识别词典中,提供录音,然后提取单词的发音(音素)...但这很麻烦。探索默认情况下如何合成单词也很有用,即没有我的输入(例如合成器如何解释“海豚”?)。
从编码的角度来看,这是我到目前为止所得到的:
using System;
using System.Speech.Synthesis;
namespace SpeechTest
{
class Program
{
static void Main(string[] args)
{
// Set up the speech synthesizer
SpeechSynthesizer synthesizer = new SpeechSynthesizer();
synthesizer.Volume = 100;
synthesizer.Rate = -2;
// Configure the audio output
synthesizer.SetOutputToDefaultAudioDevice();
// Initialize string to store word of interest (not in the speech dictionary)
string myWord = "dolphins";
// Speak the …Run Code Online (Sandbox Code Playgroud) AVSpeechSynthesizer 被标记为可在 macOS Mojave beta 上使用。
此前,它仅适用于 iOS、tvOS 和 watchOS。但是,如果我在 Xcode 10 中准备一个小型 macOS 测试项目,则会出现错误“使用未解析的标识符‘AVSpeechSynthesizer’”。在顶部,我有:
import Cocoa
import NaturalLanguage
import AVFoundation
Run Code Online (Sandbox Code Playgroud)
我的代码是:
let string = "Mickey mouse went to town"
let recognizer = NLLanguageRecognizer()
recognizer.processString(string)
let language = recognizer.dominantLanguage!.rawValue
let speechSynthesizer = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string: string)
utterance.voice = AVSpeechSynthesisVoice(language: language)
speechSynthesizer.speak(utterance)
Run Code Online (Sandbox Code Playgroud)
它与 iOS 上的代码完全相同,但在 iOS 上它可以工作,在 macOS 上它会给出错误。任何帮助深表感谢。谢谢