【问题标题】:How to Set Sample Rate on Text to Speech - Android如何设置文本到语音的采样率 - Android
【发布时间】:2017-04-24 04:31:59
【问题描述】:

在我的文本到语音的输出中,我需要将采样率设置为大约 32000 Hz,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);简而言之,我需要适用于 Android 的 Chipmunk 的 Text to Speech,但没有 synthesizeToFile 或在 AudioTrack 中直接流式传输 TTS 语音数据,而不保存 TTS 的输出。

【问题讨论】:

    标签: android text-to-speech audiotrack


    【解决方案1】:

    不能直接设置 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 格式。

    【讨论】:

    • 我想在不使用 synthesizeToFile 的情况下更改 TTS 语音输出的采样率,或者想在 AudioTrack 中直接流式传输 TTS 语音数据而不保存 TTS 的输出。
    猜你喜欢
    • 2018-04-13
    • 2012-07-22
    • 2014-02-20
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2020-10-05
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多