gpt4 book ai didi

android - 如何从 TextToSpeech 引擎创建的合成语音中获取音频 byte[]?

转载 作者:行者123 更新时间:2023-12-04 03:09:43 25 4
gpt4 key购买 nike

我正在尝试获取在 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() 已被弃用,我的回调也没有被调用。

所以解决方法是:

  1. Activity 中:

    try
    {
    tts.shutdown();
    tts = null;
    }
    catch (Exception e)
    {}
    tts = new TextToSpeech(this, this);
  2. 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 中提到的那样的库。

总结:

  1. 创建 TTS 引擎。
  2. 初始化它。
  3. OnInit 被调用。
  4. OnInit() 中,您设置了一个新的 HashMap 并放置了话语 ID。
  5. 注册setOnUtteranceProgressListener
  6. 将一些东西合成到一个文件中。
  7. 调用wait();
  8. onDone()方法中调用notify();
  9. wait(); 之后将合成文件读入缓冲区。

关于android - 如何从 TextToSpeech 引擎创建的合成语音中获取音频 byte[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46263426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com