讯飞唤醒+VOSK语音识别+DEEPSEEK大模型+讯飞离线合成实现纯离线大模型智能语音问答。

在信息爆炸的时代,智能语音问答系统正以前所未有的速度融入我们的日常生活。然而,随着数据泄露事件的频发,用户对于隐私保护的需求日益增强。想象一下,一个无需联网、即可响应你所有问题的智能助手------这就是纯离线大模型智能语音问答系统带来的革命性体验。

应用场景

  1. 智能家居:在家庭环境中,用户可以通过纯离线大模型智能语音问答系统控制家电、查询天气、设置提醒等,享受便捷、智能的生活体验。

  2. 车载导航:在驾驶过程中,用户可以通过纯离线大模型智能语音问答系统进行语音导航、查询路况、播放音乐等操作,提高驾驶安全性和舒适度。

  3. 教育辅导:在教育领域,学生可以利用纯离线大模型智能语音问答系统进行学习辅导、解答疑问等,提高学习效率和成绩。

  4. 医疗咨询:在医疗领域,患者可以通过纯离线大模型智能语音问答系统咨询医生、了解病情、获取健康建议等,提高医疗服务的便捷性和可及性。

技术含量很高,既突破了离线语音听写的PC端限制,又实现了离线大模型的API调用,同时也整合了离线语音合成延迟高的问题解决方案,实现近乎完美的纯离线大模型智能问答。

复制代码
// 1、唤醒调用
    public static void startIvw() {
        Integer ret = IvwService.INSTANCE.MSPLogin(null, null, Constants.IVW_LOGIN_PARAMS); // 登录
        if (ret != 0) {
            System.out.println("唤醒登录失败...:" + ret);
        }
        String sessionId = IvwService.INSTANCE.QIVWSessionBegin(null, Constants.IVW_SSB_PARAMS, Constants.IVW_ERROR_CODE); // 开启会话
        if (Constants.IVW_ERROR_CODE.getValue() != 0) {
            System.out.println("开启唤醒会话失败...:" + Constants.IVW_ERROR_CODE.getValue());
        }
        ret = IvwService.INSTANCE.QIVWRegisterNotify(sessionId, new IvwCallback(), null); // 注册唤醒回调函数
        if (ret != 0) {
            System.out.println("注册唤醒回调函数失败...:" + ret);
        }
        try {
            while (true) {
                byte[] audioDataByteArray = new byte[Constants.IVW_FRAME_SIZE];
                Constants.IVW_ASR_TARGET_DATA_LINE.open(Constants.IVW_ASR_AUDIO_FORMAT);
                Constants.IVW_ASR_TARGET_DATA_LINE.start();
                int len = new AudioInputStream(Constants.IVW_ASR_TARGET_DATA_LINE).read(audioDataByteArray);
                if (len == -1) {   //    调用麦克风时候,这段将不会被执行...
                    Constants.IVW_AUDIO_STATUS = 4;
                    ret = IvwService.INSTANCE.QIVWAudioWrite(sessionId, "".getBytes(), 0, Constants.IVW_AUDIO_STATUS);
                    System.out.println("最后一帧返回的错误码:" + ret + ",即将执行退出...");
                    break;  //文件读完,跳出循环
                } else {
                    // 反复调用QIVWAudioWrite写音频方法,直到音频写完为止!!!!!!!!!!!!
                    ret = IvwService.INSTANCE.QIVWAudioWrite(sessionId, audioDataByteArray, len, Constants.IVW_AUDIO_STATUS);
                }
                Constants.IVW_AUDIO_STATUS = 2; // 中间帧
                if (ret != 0) {
                    System.err.println("唤醒音频写入失败...:" + ret);
                }
                Thread.sleep(200); // 模拟人说话时间间隙,10帧的音频200ms写入一次
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 2、合成调用
    public static void startTts(String ttsText) {
        Constants.TTS_TEXT = ttsText;
        Constants.TTS_BYTE_ARRAY_OUTPUT_STREAM = new ByteArrayOutputStream(); // 初始化
        Constants.TTS_TOTAL_AUDIO_LENGTH = 0;

        Integer ret = TtsService.INSTANCE.MSPLogin(null, null, Constants.TTS_LOGIN_PARAMS); // 登录
        if (ret != 0) {
            System.out.println("合成登录失败...:" + ret);
        }
        String session_id = TtsService.INSTANCE.QTTSSessionBegin(Constants.TTS_SESSION_BEGIN_PARAMS, Constants.TTS_ERROR_CODE); // 开启合成会话
        if (Constants.TTS_ERROR_CODE.getValue() != 0) {
            System.out.println("合成开启会话失败...:" + Constants.TTS_ERROR_CODE.getValue());
        }

        ret = TtsService.INSTANCE.QTTSTextPut(session_id, Constants.TTS_TEXT, Constants.TTS_TEXT.getBytes().length, null); // 正式合成
        if (ret != 0) {
            System.out.println("合成音频失败...:" + ret);
        }

        try {    //实时播放
            Constants.TTS_SOURCE_DATA_LINE.open(Constants.TTS_AUDIO_FORMAT);
            Constants.TTS_SOURCE_DATA_LINE.start();
        } catch (Exception e) {
            e.printStackTrace();
        }

        while (true) {
            Pointer audioPointer = TtsService.INSTANCE.QTTSAudioGet(session_id, Constants.TTS_AUDIO_LEN, Constants.TTS_SYNTH_STATUS, Constants.TTS_ERROR_CODE); // 获取音频
            byte[] audioDataByteArray = null;
            if (audioPointer != null) {
                audioDataByteArray = audioPointer.getByteArray(0, Constants.TTS_AUDIO_LEN.getValue());
            }
            if (Constants.TTS_ERROR_CODE.getValue() != 0) {
                System.out.println("合成获取音频失败...+:" + Constants.TTS_ERROR_CODE);
                break;
            }
            if (audioDataByteArray != null) {
                try {
                    Constants.TTS_SOURCE_DATA_LINE.write(audioDataByteArray, 0, Constants.TTS_AUDIO_LEN.getValue()); //实时写音频流
                    Constants.TTS_BYTE_ARRAY_OUTPUT_STREAM.write(audioDataByteArray, 0, Constants.TTS_AUDIO_LEN.getValue());   //将数据写入字节数组的输出流,用来生成音频文件
                } catch (Exception e) {
                    e.printStackTrace();
                }
                Constants.TTS_TOTAL_AUDIO_LENGTH = Constants.TTS_TOTAL_AUDIO_LENGTH + Constants.TTS_AUDIO_LEN.getValue();     //计算总音频长度,用来生成音频文件
            }
            if (Constants.TTS_SYNTH_STATUS.getValue() == 2) {
                // 说明音频已经取完,退出本次循环
                try {
                    Constants.TTS_SOURCE_DATA_LINE.drain();
                    Constants.TTS_SOURCE_DATA_LINE.close();
                    Constants.TTS_BYTE_ARRAY_OUTPUT_STREAM.flush();
                    Constants.TTS_BYTE_ARRAY_OUTPUT_STREAM.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            }
        }
        ret = TtsService.INSTANCE.QTTSSessionEnd(session_id, "正常退出"); //结束会话
        if (ret != 0) {
            System.out.println("合成结束会话失败...:" + ret);
        }
        ret = TtsService.INSTANCE.MSPLogout(); // 退出
        if (ret != 0) {
            System.out.println("合成退出失败...:" + ret);
        }
    }
    // 3、离线语音听写调用
    // 4、离线大模型调用并获取结果
相关推荐
LiJieNiub14 小时前
YOLO-V1 与 YOLO-V2 核心技术解析:目标检测的迭代突破
人工智能·yolo·目标检测
初学小刘14 小时前
深度学习在目标检测中的应用与挑战
人工智能·深度学习·目标检测
AKAMAI14 小时前
Linebreak赋能实时化企业转型:专业系统集成商携手Akamai以实时智能革新企业运营
人工智能·云原生·云计算
OpenBayes15 小时前
教程上新|重新定义下一代 OCR:IBM 最新开源 Granite-docling-258M,实现端到端的「结构+内容」统一理解
人工智能·深度学习·机器学习·自然语言处理·ocr·图像识别·文档处理
985小水博一枚呀15 小时前
【AI大模型学习路线】第三阶段之RAG与LangChain——第十九章(实战基于Advanced RAG的PDF问答)系统部署与测试?
人工智能·学习·langchain·pdf
腾视科技15 小时前
让安全驾驶有“AI”相伴|腾视科技DMS视频监控一体机,守护每一次出行
人工智能·科技·安全
桃子叔叔16 小时前
从0到1讲解大模型中的关键步骤(一)分词、词性标注、命名实体识别
人工智能·大模型·多模态
ARM+FPGA+AI工业主板定制专家16 小时前
【JETSON+FPGA+GMSL】实测分享 | 如何实现激光雷达与摄像头高精度时间同步?
人工智能·数码相机·机器学习·fpga开发·机器人·自动驾驶
Nina_71716 小时前
Google提示词白皮书总结(2)
人工智能·python
fakerth16 小时前
【OpenHarmony】AI引擎模块架构
人工智能·架构·openharmony