当前位置: 首页 > news >正文

离线知识库文档问答用唤醒+VOSK离线听写+DS-V2-16B+离线合成轻松高效实现

1、私域医疗病历问答结果展示:

最终识别结果==》张三 的 既往 疾病 是 什么
 张三的既往疾病是高血压病史5年(未规律服药)。
 

回调函数返回的唤醒结果...:{"sst":"wakeup", "id":0, "score":2264, "bos":6030, "eos":6700 ,"keyword":"da4-fei1-da4-fei1"}


最终识别结果==》张三 的 过敏史 是 什么
 张三的过敏史是青霉素过敏(皮疹反应)。
2、实现核心技术

ollama run deepseek-v2:16b

3、讯飞离线唤醒+离线合成

 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();
        }
    }
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);
        }
    }


4、JAVA通过API调用VOSK离线语音识别+DS大模型

  public static void startIat() {
        // System.out.println("开始调用听写");
            AIMain.startTts("主人,您请说[p500]");
            while (true) {
                bytesRead = Constants.IVW_ASR_TARGET_DATA_LINE.read(buffer, 0, buffer.length);
                if (bytesRead < 0) {
                    break;
                }
                if (recognizer.acceptWaveForm(buffer, bytesRead)) {
                    // System.out.println(recognizer.getFinalResult());
                    JsonParseFinal jsonParseFinal = gson.fromJson(recognizer.getFinalResult(), JsonParseFinal.class);
                    System.err.println("最终识别结果==》" + jsonParseFinal.text);
                    AIMain.startModel(jsonParseFinal.text);
                    break; // 仅做一次识别
                } else {
                    // System.out.println(recognizer.getPartialResult());
                    JsonParseMid jsonParseMid = gson.fromJson(recognizer.getPartialResult(), JsonParseMid.class);
                    System.out.println("中间识别结果==》" + jsonParseMid.partial);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

相关文章:

  • Rocky Linux 9.5中完美迁移mysql5.6.17到mysql5.7.11
  • 20250330-傅里叶级数专题之离散时间傅里叶变换(4/6)
  • js 强引用 ​弱引用
  • leetcode 28 Find the Index of the First Occurrence in a String
  • uv vs pip 速度实测
  • ENSP学习day12
  • aws(学习笔记第三十七课) lambda调用rekognition(名人视频分析)
  • PHY——LAN8720A 寄存器读写 (二)
  • 前向扩散公式推导细节
  • Matlab自学笔记四十九:类型识别:判断数据的类型和类别
  • 2025/3/20 心得
  • HCIA—— 31 HTTP的报文、请求响应报文、方法、URI和URL
  • 【数据标准】数据标准化框架体系-基础类数据标准
  • 基于Real-Sim-Real循环框架的机器人策略迁移方法
  • react拖拽库dnd-kit
  • 【jQuery】插件
  • 【C++初阶】----模板初阶
  • Flask登录页面后点击按钮在远程CentOS上自动执行一条命令
  • 极速版:栈的内存/局部变量表/堆的内存细分
  • 从 select 到 epoll:拆解 I/O 多路复用的演进与实战
  • 自己做的网站怎么用qq登入/一份完整的营销策划书
  • 东莞市建设质量监督站/最近最新新闻
  • 您公司需要做网站吗的其他说法/化妆培训
  • 个人备案的域名拿来做别的网站/优化法治化营商环境
  • 菜鸟如何做网站/东莞网络公司排行榜
  • 网站建设方案书b2b/免费的网站推广软件