作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试获取在 TextToSpeech 引擎合成文本时创建的音频 byte[]。
我已经尝试创建一个 Visualiser 并分配一个 OnDataCaptureListener
但它提供的 byte[] 始终相同,因此我不认为该数组与语音文本相关联。
这是我的实现:
AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
audioManager.requestAudioFocus(focusChange -> Log.d(TAG, "focusChange is: is: " + focusChange), AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
int audioSessionId = audioManager.generateAudioSessionId();
mVisualizer = new Visualizer(audioSessionId);
mVisualizer.setEnabled(false);
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[0]);
mVisualizer.setDataCaptureListener(
new Visualizer.OnDataCaptureListener() {
public void onWaveFormDataCapture(Visualizer visualizer,
byte[] bytes, int samplingRate) {
//here the bytes are always equal to the bytes received in the last call
}
public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
}
}, Visualizer.getMaxCaptureRate(), true, true);
mVisualizer.setEnabled(true);
我还发现您可以使用 SynthesisCallback通过它的 audioAvailable()
方法接收 byte[] 但我似乎无法正确实现它。
我创建了一个 TextToSpeechService
但它的 onSynthesizeText()
方法从未被调用。但是,我可以看出该服务在调用 onLoadLanguage()
时正在运行。
我的问题简而言之:如何获取 TextToSpeech 引擎合成文本时创建的音频的音频字节 [] 表示?
提前致谢。
最佳答案
我听说 onAudioAvailable()
已被弃用,我的回调也没有被调用。
所以解决方法是:
Activity 中:
try
{
tts.shutdown();
tts = null;
}
catch (Exception e)
{}
tts = new TextToSpeech(this, this);
在OnInit()
方法中:
@Override
public void onInit(int p1)
{
HashMap<String,String> mTTSMap = new HashMap<String,String>();
tts.setOnUtteranceProgressListener(new UtteranceProgressListener()
{
@Override
public void onStart(final String p1)
{
// TODO: Implement this method
Log.e(TAG, "START");
}
@Override
public void onDone(final String p1)
{
if (p1.compareTo("abcde") == 0)
{
synchronized (MainActivity.this)
{
MainActivity.this.notifyAll();
}
}
}
@Override
public void onError(final String p1)
{
//this is also deprecated...
}
@Override
public void onAudioAvailable(final String id, final byte[] bytes)
{
//never calked!
runOnUiThread(new Runnable(){
@Override
public void run()
{
// TODO: Implement this method
Toast.makeText(MainActivity.this, "id:" + id /*"bytes:" + Arrays.toString(bytes)*/, 1).show();
Log.v(TAG, "BYTES");
}});
//super.onAudioAvailable(id,bytes);
}
});
Locale enEn = new Locale("en_EN");
if (tts.isLanguageAvailable(enEn) == TextToSpeech.LANG_AVAILABLE)
{
tts.setLanguage(enEn);
}
/*public int synthesizeToFile(java.lang.CharSequence text, android.os.Bundle params, java.io.File file, java.lang.String utteranceId);*/
//@java.lang.Deprecated()
// public int synthesizeToFile(java.lang.String text, java.util.HashMap<java.lang.String, java.lang.String> params, java.lang.String filename);
mTTSMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "abcde"); tts.synthesizeToFile("Hello",mTTSMap,"/storage/emulated/0/a.wav");
synchronized(MainActivity.this){
try{
MainActivity.this.wait();
}catch(InterruptedException e){}
ReadTheFile();
}
}
然后你的工作就是将 a.wav 加载到你想要的缓冲区中。使用像 this SO answer 中提到的那样的库。
总结:
OnInit
被调用。OnInit()
中,您设置了一个新的 HashMap 并放置了话语 ID。setOnUtteranceProgressListener
。wait();
onDone()
方法中调用notify();
wait();
之后将合成文件读入缓冲区。关于android - 如何从 TextToSpeech 引擎创建的合成语音中获取音频 byte[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46263426/
我是一名优秀的程序员,十分优秀!