2017-04-24 44 views
3

在我的文本到语音的输出中,我需要设置采样率约为32000赫兹,使用Pitch-1和SpeechRate-0.2(我已经这样做了)。但我无法设置采样率。如何在文本上设置采样率到语音 - Android

tts = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() { 
     @Override 
     public void onInit(int status) { 
      if(status != TextToSpeech.ERROR) { 
       tts.setLanguage(Locale.US); 
       tts.setSpeechRate((float) 0.2); 
       tts.setPitch((float) 1); 
      } 
     } 
    }, TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS); 

我以前AudioTrack设置采样率,但花了大量的时间,因为我得先TTS synthesizeToFile然后我在AudioTrack播放。

HashMap<String, String> myHasRead = new HashMap<String, String>(); 
myHasRead.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, outPutS); 
String StorePath = Environment.getExternalStorageDirectory().getAbsolutePath(); 
File myF = new File(StorePath+"/tempAudio.wav"); 
          try { 
           myF.createNewFile(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          tts.setOnUtteranceProgressListener(new TtsUtteranceListener()); 
          tts.synthesizeToFile("Bla Bla bla",myHasRead, StorePath+"/tempAudio.wav"); 

.... 

private class TtsUtteranceListener extends UtteranceProgressListener { 
     @Override 
     public void onStart(String utteranceId) { 

     } 

     @Override 
     public void onDone(String utteranceId) { 
      playWav(); 
     } 

     @Override 
     public void onError(String utteranceId) { 

     } 
    } 

    public void playWav(){ 
     int minBufferSize = AudioTrack.getMinBufferSize(32000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); 
     int bufferSize = 512; 
     AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 32000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM); 
     String filepath = Environment.getExternalStorageDirectory().getAbsolutePath(); 

     int i = 0; 
     byte[] s = new byte[bufferSize]; 
     try { 
      FileInputStream fin = new FileInputStream(filepath + "/tempAudio.wav"); 
      DataInputStream dis = new DataInputStream(fin); 

      at.play(); 
      while((i = dis.read(s, 0, bufferSize)) > -1){ 
       at.write(s, 0, i); 
      } 
      at.stop(); 
      at.release(); 
      dis.close(); 
      fin.close(); 

     } catch (FileNotFoundException e) { 
      // TODO 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO 
      e.printStackTrace(); 
     } 
    } 

有什么办法来设置采样率直接到TTS像tts.setSampleRate(32000);或TTS获得流至AudioTrack像DataInputStream dis = new DataInputStream(tts.speak("bla bla bla").getDataInputStream);简而言之,我需要Chipmunk的Text to Speech for Android,但不需要合成文件或者直接在AudioTrack中传输TTS语音数据,而不需要保存TTS的输出。

回答

-1

你不能直接设置TTS采样率:

我做了这样的事情在一个项目(力使用TTS)

这可以帮助你,

播放记录具有不同的语音类型: -

waveSampling = 90000; (Chipmunk)

waveSampling = 24200; ( “慢镜头”)

waveSampling = 30000;( “BANE”)/蝙蝠侠字符

waveSampling = 18000;(鬼)

waveSampling = 70000;(蜜蜂)

waveSampling = 60000;(Woman)

waveSampling = 37000; (普通)

void playRecord() throws IOException { 




      int minBufferSize = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); 
      int bufferSize = 512; 
       at = new AudioTrack(AudioManager.STREAM_MUSIC, waveSampling, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM); 
      String filepath = Environment.getExternalStorageDirectory().getAbsolutePath(); 

      int i = 0; 
      byte[] s = new byte[bufferSize]; 
      try { 
       FileInputStream fin = new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Voice Changer/temp/"+filename+".wav"); 
       DataInputStream dis = new DataInputStream(fin); 

       at.play(); 
       while((i = dis.read(s, 0, bufferSize)) > -1){ 
        at.write(s, 0, i); 

       } 
       at.stop(); 
       at.release(); 
       dis.close(); 
       fin.close(); 

        openmenu(); 


      } catch (FileNotFoundException e) { 
       // TODO 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO 
       e.printStackTrace(); 
      } 



    } 

保存音频: -

public void save() throws IOException { 
     Random r = new Random(); 
     final int i1 = r.nextInt(80 - 65) + 65; 
     File tempfile2=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Voice Changer/temp/"+i1+filename+".wav"); 

     savedfile=Environment.getExternalStorageDirectory().getAbsolutePath()+"/Voice Changer/"+"VOICE CHANGER"+i1+filename+".mp3"; 






     Toast.makeText(this, "File Saved", Toast.LENGTH_SHORT).show(); 



     rawToWave(tempfile,tempfile2); 

     File wavFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Voice Changer/temp/"+i1+filename+".wav"); 
     IConvertCallback callback = new IConvertCallback() { 
      @Override 
      public void onSuccess(File convertedFile) { 

       File newfile=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Voice Changer/"+"VOICE CHANGER"+i1+filename+".mp3"); 
       File savedmp3=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Voice Changer/temp/"+i1+filename+".mp3"); 
       Toast.makeText(MainActivity.this, "SUCCESS: " + newfile.getPath(), Toast.LENGTH_LONG).show(); 

       try { 
        copyit(savedmp3,newfile); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      @Override 
      public void onFailure(Exception error) { 
       Toast.makeText(MainActivity.this, "ERROR: " + error.getMessage(), Toast.LENGTH_LONG).show(); 


      } 
     }; 
     Toast.makeText(this, "Converting audio file...", Toast.LENGTH_SHORT).show(); 
     AndroidAudioConverter.with(this) 
       .setFile(wavFile) 
       .setFormat(cafe.adriel.androidaudioconverter.model.AudioFormat.MP3) 
       .setCallback(callback) 
       .convert(); 





    } 

输出将是一个.MP3文件。如果你想快速输出,你可以使用.wav格式。

+0

我想要更改TTS语音输出的采样率而不合成文件,或者要在AudioTrack中直接传输数据的TTS语音而不保存TTS的输出。 –

相关问题