如何使用onSynthesizeDataArrived来进行缓存并实现后期播放?
cn...y@263.net 发布于2016-03 浏览:1857 回复:5
0
收藏
public void onSynthesizeDataArrived(String utteranceId, byte[] data, int progress)

返回的data数据是否能实现内存缓存,并在后期播放?

1、data的格式可通过参数设置,但没有pcm格式,无法采用audioTrack进行播放。有无解决方案?

2、data的是否可以保存为文件,并实现文件播放?如果可行,默认参数下保存的文件名后缀是什么?如何播放?

收藏
点赞
0
个赞
共5条回复 最后由用户已被禁言回复于2022-04
#6水寒319回复于2016-08

0
#5tel28810回复于2016-08

    public void onSynthesizeStart(String utteranceId) {
        toPrint("onSynthesizeStart utteranceId=" + utteranceId);
        prepareLocalfile(utteranceId);
    }

    public void onSynthesizeDataArrived(String utteranceId, byte[] data, int progress) {
        if (null != data) {
            appendLocalfileSection(data);
        }
    }

    public void onSynthesizeFinish(String utteranceId) {
        toPrint("onSynthesizeFinish utteranceId=" + utteranceId);
        endLocalFileData();
    }

    private void prepareLocalfile(String utteranceId) {
        String fileName = utteranceId + ".pcm";
        File folder = new File(audioPath);
        if (!folder.exists()) {/* 判断文件夹是否存在(不存在则创建这个文件夹) */
            toPrint("create dir " + audioPath);
            folder.mkdirs();/* 创建文件夹 */
        }

        try {
            File file = new File(audioPath, fileName);
            toPrint("create file " + audioPath + "/" + fileName);
            FileOutputStream outSTr = new FileOutputStream(file);
            Buff = new BufferedOutputStream(outSTr);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void appendLocalfileSection(byte[] buffer) {
        try {
            Log.i(TAG, String.valueOf(buffer));
            Buff.write(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void endLocalFileData() {
        try {
            toPrint("close file.");
            Buff.flush();
            Buff.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

0
#4tel28810回复于2016-08

    private void playAudioTrack() throws IOException {
        int frequence = 16000;
        int channelConfig = AudioFormat.CHANNEL_OUT_MONO;
        int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
        int streamType = AudioManager.STREAM_MUSIC;
        int bufferSize = AudioTrack.getMinBufferSize(frequence, channelConfig, audioEncoding);
        byte[] buffer = new byte[bufferSize / 4];
        File file = new File(audioPath, "0.pcm");
        FileInputStream is = new FileInputStream(file);
        DataInputStream dis = new DataInputStream(new BufferedInputStream(is));
        AudioTrack track = new AudioTrack(streamType, frequence, channelConfig, audioEncoding, bufferSize,
                AudioTrack.MODE_STREAM);
        track.setPlaybackRate(frequence);
        /* start play */
        track.setStereoVolume(1.0f, 1.0f);
        track.play();
        while (dis.available() > 0) {
            int i = 0;
            while (dis.available() > 0 && i < buffer.length) {
                buffer[i] = dis.readByte();
                i++;
            }
            /*write data to AudioTrack*/
            track.write(buffer, 0, buffer.length);
        }
        /*stop play*/
        track.stop();
        dis.close();
    }

0
#3cn...y@263.net回复于2016-04

谢谢,亲测可用。把采样率设置一致后和speak效果一致。

0
#2水寒319回复于2016-03

1、data数据是最原始的语音数据,可以直接保存为pcm格式,是可以采用audioTrack进行播放。如果需要其他的格式的数据需要自己压缩成其他格式没有提供相印的格式。

2、data数据可以直接保存为pcm进行通过支持的播放器播放或者通过audioTrack播放。

0
TOP
切换版块