- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当用户将网络合成语音设置为默认语音时,我的应用程序会缓存经常发生的请求,以防止将来出现网络延迟。
我的代码 here 展示了我是如何做到这一点的.简而言之,它将引擎名称和话语与请求匹配,如果它们匹配,我将流式传输缓存的音频而不是使用 TTS 引擎。
如果用户随后在 Android 文本到语音设置中更改了他们的音高和语速,缓存的音频当然将不再反射(reflect)这一点,需要忽略并“重新缓存”,或者对音频进行相应的操作。
我的问题:如何获取音调和语速的系统默认设置。
要设置音调和速率,TextToSpeech API 中提供公开的方法:
/**
* Sets the speech rate.
*
* This has no effect on any pre-recorded speech.
*
* @param speechRate Speech rate. {@code 1.0} is the normal speech rate,
* lower values slow down the speech ({@code 0.5} is half the normal speech rate),
* greater values accelerate it ({@code 2.0} is twice the normal speech rate).
*
* @return {@link #ERROR} or {@link #SUCCESS}.
*/
public int setSpeechRate(float speechRate) {
if (speechRate > 0.0f) {
int intRate = (int)(speechRate * 100);
if (intRate > 0) {
synchronized (mStartLock) {
mParams.putInt(Engine.KEY_PARAM_RATE, intRate);
}
return SUCCESS;
}
}
return ERROR;
}
/**
* Sets the speech pitch for the TextToSpeech engine.
*
* This has no effect on any pre-recorded speech.
*
* @param pitch Speech pitch. {@code 1.0} is the normal pitch,
* lower values lower the tone of the synthesized voice,
* greater values increase it.
*
* @return {@link #ERROR} or {@link #SUCCESS}.
*/
public int setPitch(float pitch) {
if (pitch > 0.0f) {
int intPitch = (int)(pitch * 100);
if (intPitch > 0) {
synchronized (mStartLock) {
mParams.putInt(Engine.KEY_PARAM_PITCH, intPitch);
}
return SUCCESS;
}
}
return ERROR;
}
假设上述方法都将值放入绑定(bind) TTS 引擎 (link) 的 Private Bundle
中:
private final Bundle mParams = new Bundle();
我使用反射来查看这些值是否由绑定(bind)引擎默认/持久化或注入(inject)。下面是一个浓缩示例,其中 the Class扩展 TextToSpeech
:
private int getSpeechRate() {
Bundle reflectBundle;
try {
final Field f = this.getClass().getSuperclass().getDeclaredField(TTSDefaults.BOUND_PARAMS);
f.setAccessible(true);
reflectBundle = (Bundle) f.get(this);
if (reflectBundle != null && !reflectBundle.isEmpty()) {
examineBundle(reflectBundle);
if (reflectBundle.containsKey(TTSDefaults.KEY_PARAM_RATE)) {
final int reflectRate = reflectBundle.getInt(TTSDefaults.KEY_PARAM_RATE);
// log
return reflectRate;
} else {
// missing
}
} else {
// empty or null
}
} catch (final NoSuchFieldException e) {
} catch (final IllegalAccessException e) {
} catch (final NullPointerException e) {
}
return -1;
}
/**
* For debugging the bundle extras
*
* @param bundle containing potential extras
*/
private void examineBundle(@Nullable final Bundle bundle) {
if (bundle != null) {
final Set<String> keys = bundle.keySet();
//noinspection Convert2streamapi
for (final String key : keys) {
Log.v(CLS_NAME, "examineBundle: " + key + " ~ " + bundle.get(key));
}
}
}
缺少值,因此,也许可以理解,这不是它们“全局”保存的方式。
当我第一次尝试解决这个问题时,我认为这很微不足道 - 我希望事实证明是这样,但我就是只见树木不见森林...
感谢您阅读到这里 - 帮助!
最佳答案
首先,我假设您熟悉 TextToSpeech 源代码。
我认为您无法通过反射获得音高和语速。这些值存储在 TextToSpeech 类的实例变量中,每次查询文本时都会将它们提供给引擎。这意味着当您调用 setSpeechRate
或 setPitch
方法时,它们不会改变全局文本到语音设置的音调和语速。
除此之外,pitch和 speech rate在 Android 安全系统设置中定义,这些设置是用户必须通过系统 UI 或专用 API(系统应用程序或根访问权限)明确修改这些值的首选项,而不是由应用程序直接修改。
使用以下代码读取与音高和语速相关的安全设置:
Settings.Secure.getInt(getContentResolver(), Settings.Secure.TTS_DEFAULT_RATE);
Settings.Secure.getInt(getContentResolver(), Settings.Secure.TTS_DEFAULT_PITCH);
在Google Talkback中可以看到略有不同的用法和 TextToSpeechSettings .
用 Settings.SettingNotFoundException
包围,如果未设置任何值,将抛出该异常,在这种情况下,您可以回退到 the hidden 的等效值TextToSpeech.Engine.FALLBACK_TTS_DEFAULT_PITCH
或者,您可以添加一个额外的参数作为默认值。
Settings.Secure.getInt(getContentResolver(), Settings.Secure.TTS_DEFAULT_PITCH, FALLBACK_TTS_DEFAULT_PITCH);
关于java - Text to Speech 获取系统默认音调和语速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47084476/
我环顾了 Google 和 SO,但找不到这个...... 有没有一种方法可以在 Mac 上仅使用 Python 标准库来生成简单的音调(即蜂鸣声、方波、锯齿声)? 基本上,我正在尝试在文本角色扮演游
我搜索了很多术语和量刑,但找不到任何相关信息。所以无论如何:我怎样才能为警报(默认应用程序)获取默认或当前设置的音乐/音调/声音? 假设我每天早上醒来时都会播放闹钟歌曲:Song#1 使用默认闹钟应用
我正在读取来自麦克风的原始波流。 (这部分工作,因为我可以将它发送到扬声器并得到很好的回声。) 为简单起见,假设我想检测波形数据中的 DTMF 音调。实际上我想检测任何频率,而不仅仅是 DTMF 中的
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是偏离
Android 的新手。我有一个应用程序正在运行,我正在生成 DTMF 信号并解释微 Controller 生成的内容。我成功地生成了音调,但是音调是通过扬声器播放的,我想通过一个拼接的耳机插孔播放音
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
我录制了几秒钟的音频,其中包含以相同频率生成的两个相似的音调。他们相隔几秒钟。我想做的是根据该音频文件的采样间隔,检测出第一声的结束和第二声的开始。假设以48KHz音频的16位带符号PCM和一个字节数
我有 wav 文件,使用 naudio 库我已经能够从 wav 文件中获取原始数据。 有谁知道如何循环检测 DTMF 音调的 block 中的数据? 最佳答案 NuGet 包 DtmfDetectio
我有一个使用 OpenEars API 读取文本的 iOS 应用程序。我使用的是最新版本 (1.2.5)。我无法弄清楚如何在阅读单词时改变音调(“即时”)。我创建了一个 slider 来控制音高。更改
如何在 iPhone 中以编程方式检测 dtmf 音调?。我想检测接收到的音频信号(麦克风输入)是否应该是 dtmf 音调? 请帮助我?我真的为此苦苦挣扎了两天。提前致谢...... 最佳答案 由于
我想在 android 中执行以下操作。可能吗? 1) 调用+xx xxxxxxx 2) 等待第一声结束 3) 插入通行证:xxxx 4)等待短高音结束 5) 按 1 直到听到特定的声音。 这里的音调
当对方在通话中按 1,2,3.....9 时,是否可以在 android 中获取 DTMF 音调?如果是,怎么办? 最佳答案 查看此 http://code.google.com/p/dtmf-dec
我目前正在研究汽车安全系统.... 我需要通过输入到外部数字电路的电话耳机产生 DTMF 音调。是否有任何 API 可以执行此操作?任何人都可以帮助.... 提前致谢... 最佳答案 我得到了答案..
我想在 php 中生成一个正弦波。但是构建我的 wav 我需要以字节为单位给出值。我不知道该怎么做: 这是我的代码: $freqOfTone = 440; $sampleRate = 44100; $
我正在尝试在 linphone 的 SIP 调用期间发送一系列 DTMF 音调,为 iPhone 编译,以便在我设置的本地交换机上进行一些调用管理。我从代码中看到各个数字发送 DTMF(线路上没有音频
我正在尝试从电话线上检测来电显示信息。收到的来电显示信息采用 DTMF 音调(而非 FSK)。我怎样才能检测到这个 DTMF 音调?电话和传真调制解调器可以吗?电话和传真调制解调器能够检测 FSK 信
这就是我所拥有的。它生成 5 秒 Au file具有 440 Hz 正弦波,灵感来自 this question . -- file: tone.hs import qualified Data.By
我有一个 double 组,这是对数组应用 FFT 的结果,其中包含我添加了 1000Hz 音调的 Wav 音频文件的音频数据。 我通过“数值食谱”中定义的 DREALFT 获得了这个数组。(我必须使
Tone.BufferSource:缓冲区未设置或未加载。此错误发生在 try/catch block 中。它只会在我不断或有时随机触发更新功能时发生。发生此错误时,我的音频会暂时关闭。 我的代码背后
我正在 iphone 上开发一个应用程序,我需要一种方法来检测通过麦克风传入的声音的音调。 (即 A#、G、C♭ 等)我以为我会使用 AVAudio,但我真的不知道,而且我在文档中找不到任何内容。 有
我是一名优秀的程序员,十分优秀!