簡體   English   中英

如何設置文本到語音的采樣率 - Android

[英]How to Set Sample Rate on Text to Speech - Android

在我的文本到語音的輸出中,我需要將采樣率設置為大約32000赫茲,Pitch - 1和SpeechRate - 0.2(我已經做過)。 但我無法設置采樣率。

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獲取Stream到AudioTrack,如DataInputStream dis = new DataInputStream(tts.speak("bla bla bla").getDataInputStream); 簡而言之,我需要Chipmunk的Android文本到語音,但沒有在AudioTrack中使用synthesizeToFile或直接流TTS語音數據而不保存TTS的輸出。

您無法直接設置TTS采樣率:

我在一個項目中做了類似的事情(Dint使用TTS)

這可能對你有幫助,

用不同的語音類型播放錄音: -

waveSampling = 90000; (花栗鼠)

waveSampling = 24200; (“慢動作”)

waveSampling = 30000;(“BANE”)/蝙蝠俠角色

waveSampling = 18000;(鬼)

waveSampling = 70000;(蜜蜂)

waveSampling = 60000;(女性)

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格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM