实现一边录音一边转化为文字的功能

实现一边录音一边转化为文字的功能

我们知道,讯飞可以实现在线语音转化功能,可以将语音实时的进行翻译,同时录音,但是这个实时转为文字功能,不是长连接,是个短连接,导致没法长时间的实现一边录音一边转换功能,本文便是为此完成的一种思路设计。

主要动作:本来实现的是一直去检测录音,当语音识别库停止录音后重启语音识别,让继续实现转换。这里因为出现一个问题,当再次重启时,之前的录音文件则会丢掉,这样使得我们本地的录音文件不完整,于是换了一种新的思路。主要依据于语音识别可以传语音数据,让识别。那么我们可以去做如此设计:让本地一直录音,录音过程实时将录音数据传给语音识别,完成转换功能。思路描述完成,具体实现代码:(不能提供完整的代码,给出主要代码)

    private void creatAudioRecord() {
        // 获得缓冲区字节大小
        bufferSizeInBytes = AudioRecord.getMinBufferSize(AudioFileFunc.AUDIO_SAMPLE_RATE,
                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
        // 创建AudioRecord对象
        audioRecord = new AudioRecord(AudioFileFunc.AUDIO_INPUT, AudioFileFunc.AUDIO_SAMPLE_RATE,
                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes);
    }
       private void writeDateToFileAndRecongnizer() {
        // new一个byte数组用来存一些字节数据,大小为缓冲区大小
        byte[] audiodata = new byte[bufferSizeInBytes];
        FileOutputStream fos = null;
        int readsize = 0;
        try {
            File file = FileUtils.makeFilePath(getOutBase(), mOutPcm);
            if (file.exists()) {
                file.delete();
            }
            fos = new FileOutputStream(file);// 建立一个可存取字节的文件
        } catch (Exception e) {
            e.printStackTrace();
        }
        while (mIsRecognizer && !Thread.currentThread().isInterrupted()) {
            readsize = audioRecord.read(audiodata, 0, bufferSizeInBytes);
            if (AudioRecord.ERROR_INVALID_OPERATION != readsize && fos != null) {
                try {
                    mSpeechRecognizer.writeAudio(audiodata, 0, audiodata.length);
                    fos.write(audiodata);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        try {
            if (fos != null)
                fos.close();// 关闭写入流
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    mSpeechRecognizer = SpeechRecognizer.createRecognizer(DiaryPost.this, mInitListener);
     /**
     * 初始化监听器。
     */
    private InitListener mInitListener = new InitListener() {

        @Override
        public void onInit(int code) {
            L.d("SpeechRecognizer init() code = " + code);
            if (code != ErrorCode.SUCCESS) {
                showToast("初始化失败,错误码:" + code);
            }
        }
    };
    /**
     * 听写监听器。
     */
    private RecognizerListener recognizerListener = new RecognizerListener() {

        @Override
        public void onBeginOfSpeech() {
            if (!mIsRecognizer) {
                onRecognizerEnd();
            }
        }

        @Override
        public void onError(SpeechError error) {
            if (mIsRecognizer) {
                onRecognizerStart();
            }
        }

        @Override
        public void onEndOfSpeech() {
            if (mIsRecognizer) {
                onRecognizerStart();
            }
        }

        @Override
        public void onResult(RecognizerResult results, boolean isLast) {
            showResult(results);
            if (isLast) {
                // TODO 最后的结果
            }
        }

        @Override
        public void onVolumeChanged(int i, byte[] bytes) {
            if (mIsRecognizer) {
                int decibel = calculateDecibel(bytes);
                mVisualizer.receive(decibel);
            }

        }

        @Override
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
        }
    };

       private void showResult(RecognizerResult results) {
        String text = JsonParser.parseIatResult(results.getResultString());
        mSpeechRecognizerIndex++;
        mSpeechRecognizerResults.put(mSpeechRecognizerIndex, text);
        StringBuffer resultBuffer = new StringBuffer();
        for (int key : mSpeechRecognizerResults.keySet()) {
            resultBuffer.append(mSpeechRecognizerResults.get(key));
        }
        mEditText.setText(resultBuffer.toString());
        mEditText.setSelection(mEditText.length());
    }

       public void bindParams() {
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        // 清空参数
        mSpeechRecognizer.setParameter(SpeechConstant.PARAMS, null);
        mSpeechRecognizer.setParameter(SpeechConstant.AUDIO_SOURCE, "-1");
        // 设置听写引擎
        mSpeechRecognizer.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
        // 设置返回结果格式
        mSpeechRecognizer.setParameter(SpeechConstant.RESULT_TYPE, "json");
        String lag = sp.getString("iat_language_preference",
                "mandarin");
        if (lag.equals("en_us")) {
            // 设置语言
            mSpeechRecognizer.setParameter(SpeechConstant.LANGUAGE, "en_us");
        } else {
            // 设置语言
            mSpeechRecognizer.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
            // 设置语言区域
            mSpeechRecognizer.setParameter(SpeechConstant.ACCENT, lag);
        }

        // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
        mSpeechRecognizer.setParameter(SpeechConstant.VAD_BOS, sp.getString("iat_vadbos_preference", "3000"));

        // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
        mSpeechRecognizer.setParameter(SpeechConstant.VAD_EOS, sp.getString("iat_vadeos_preference", "1000"));

        // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
        mSpeechRecognizer.setParameter(SpeechConstant.ASR_PTT, sp.getString("iat_punc_preference", "1"));

        // 设置听写结果是否结果动态修正,为“1”则在听写过程中动态递增地返回结果,否则只在听写结束之后返回最终结果
        // 注:该参数暂时只对在线听写有效
        mSpeechRecognizer.setParameter(SpeechConstant.ASR_DWA, sp.getString("iat_dwa_preference", "0"));
    }

        private void onRecognizerStart() {
        Intent intent = new Intent();
        bindParams();
        mSpeechRecognizer.startListening(recognizerListener);
    }
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员入门进阶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值