baresip+sherpa-onnx在sip客户端实现自定义声源及本地、对方asr及实现中转英翻译

FreeSWITCH 简单图形化界面25-SIP命令行测试工具baresip CentOS7和CentOS8 FreeSWITCH 1.10.7 简单图形化界面25-SIP命令行测试工具baresip1 、baresip安装2 、注册(1)编辑accounts文件(2)启动baresip3、呼叫4、多个配置(启动多个baresip)5、接听后自动播放文件6、接听后自动播放视频文件安装ffmpeg编译ffmpeg 图形界面安装,请参考https://blog.youkuaiyun.com/jia198810/article/details/118877824 1 、baresip安装 bar 阅读详情

1、编译libbaresp https://github.com/baresip 

win 安装cmake gui 、win openssl 即可

使用gui 的生成即可

创建项目导入lib 可以参考baresip wiki 的 lib的使用初始化

https://github.com/baresip/baresip/wiki/Using-baresip-as-a-library
 
#pragma comment(lib, "Ws2_32.lib") 
#pragma comment(lib, "winmm.lib") 
#pragma comment(lib, "re-static.lib") 
#pragma comment(lib, "libbaresip.lib") 
#pragma comment(lib, "Qwave.lib") 
#pragma comment(lib, "DbgHelp.lib")
#pragma comment(lib, "iphlpapi.lib") 
#pragma comment(lib, "libssl64MDd.lib") 
#pragma comment(lib, "libcrypto64MDd.lib") 

#pragma comment(lib, "bcg729.lib") 
#pragma comment(lib, "blibwebrtc.lib") 

2、实现本地的vad 加asr  选用VAD — sherpa 1.3 documentation 和它的asr 初始化和baresip一起

#pragma comment(lib, "sherpa-onnx-c-api.lib") 


    int err = 0; //struct tmr tmr_quit;
    const char* language = "auto";
    const char* provider = "cpu";
    const char* model_filename =
        "G:/ai/sherpa-onnx/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/model.int8.onnx";
    const char* tokens_filename =
        "G:/ai/sherpa-onnx/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/tokens.txt";
    int32_t use_inverse_text_normalization = 1;
    SherpaOnnxOfflineSenseVoiceModelConfig sense_voice_config;
    memset(&sense_voice_config, 0, sizeof(sense_voice_config));
    sense_voice_config.model = model_filename;
    sense_voice_config.language = language;
    sense_voice_config.use_itn = use_inverse_text_normalization;

    // Offline model config
    SherpaOnnxOfflineModelConfig offline_model_config;
    memset(&offline_model_config, 0, sizeof(offline_model_config));
    offline_model_config.debug = 0;
    offline_model_config.num_threads = 1;
    offline_model_config.provider = provider;
    offline_model_config.tokens = tokens_filename;
    offline_model_config.sense_voice = sense_voice_config;

    // Recognizer config
    SherpaOnnxOfflineRecognizerConfig recognizer_config;
    memset(&recognizer_config, 0, sizeof(recognizer_config));
    recognizer_config.decoding_method = "greedy_search";
    recognizer_config.model_config = offline_model_config;

    recognizer = SherpaOnnxCreateOfflineRecognizer(&recognizer_config);
     
    if (recognizer == NULL) {
        fprintf(stderr, "Please check your recognizer config!\n"); 
        goto out;
    }

    printf("asr model load ok\n");
    SherpaOnnxOfflineTtsConfig config;
    memset(&config, 0, sizeof(config));
    config.model.vits.model = "G:/ai/sherpa-onnx/vits-zh-hf-fanchen-C/vits-zh-hf-fanchen-C.onnx";
    config.model.vits.lexicon = "G:/ai/sherpa-onnx/vits-zh-hf-fanchen-C/lexicon.txt";
    config.model.vits.tokens = "G:/ai/sherpa-onnx/vits-zh-hf-fanchen-C/tokens.txt";
    config.model.vits.dict_dir = "G:/ai/sherpa-onnx/vits-zh-hf-fanchen-C/dict";
    config.model.num_threads = 1;
    config.model.debug = false;
    config.rule_fsts = "G:/ai/sherpa-onnx/vits-zh-hf-fanchen-C/phone.fst,G:/ai/sherpa-onnx/vits-zh-hf-fanchen-C/date.fst,G:/ai/sherpa-onnx/vits-zh-hf-fanchen-C/number.fst";

    tts = SherpaOnnxCreateOfflineTts(&config); 
    if (tts == NULL) {
        fprintf(stderr, "Please check your tts config!\n");
        goto out;
    }
    printf("tts model load ok\n");

    err = libre_init();

3、将aufile模块代码复制过来  将他的wsapi代码放入改初始化里面创建一个线程 实现本地的vad +语音识别

while (re_atomic_rlx(&st->run)  ) {

        if (aubuf_cur_size(st->aubuf) != 0) { continue; }

        hr = IAudioCaptureClient_GetNextPacketSize(service,
            &packet_sz);
        CHECK_HR(hr, "wasapi/src: GetNextPacketSize failed");

        if (packet_sz == 0) {
            sys_msleep(5);
            continue;
        }
        //num_frames 这个值会变化  具体输出看
        hr = IAudioCaptureClient_GetBuffer(service, (BYTE**)&af.sampv,
            &num_frames, &flags, NULL,
            NULL);
        CHECK_HR(hr, "wasapi/src: GetBuffer failed");

        af.timestamp = tmr_jiffies_usec();
        af.sampc = num_frames * format->nChannels;

        //16k的大小 稳定后160
        if (num_frames != 160) { hr = IAudioCaptureClient_ReleaseBuffer(service, num_frames); continue; }
        int16_t* int16_buffer = reinterpret_cast<int16_t*>(af.sampv);
        size_t available_space = 640 - buffer_size;
        size_t samples_to_copy = (num_frames < available_space) ? num_frames : available_space;
        memcpy(buffer + buffer_size, int16_buffer, samples_to_copy * sizeof(int16_t));
        buffer_size += samples_to_copy; 
        if (buffer_size == 640) {  
            ConvertToFloatSamples(buffer, float_samples, 640, 1);
            SherpaOnnxVoiceActivityDetectorAcceptWaveform(vad, float_samples, vadConfig.silero_vad.window_size);
            //if (SherpaOnnxVoiceActivityDetectorDetected(vad)) {
               //printf("检测dao说话\n");
            //} 
            while (!SherpaOnnxVoiceActivityDetectorEmpty(vad)) {
                const SherpaOnnxSpeechSegment* segment = SherpaOnnxVoiceActivityDetectorFront(vad);
                const SherpaOnnxOfflineStream* stream = SherpaOnnxCreateOfflineStream(mythread->recognizer);

                SherpaOnnxAcceptWaveformOffline(stream, 16000, segment->samples, segment->n);

                SherpaOnnxDecodeOfflineStream(mythread->recognizer, stream);

                const SherpaOnnxOfflineRecognizerResult* result = SherpaOnnxGetOfflineStreamResult(stream);
                if(result&& result->text && strlen(result->text) > 0){
                    float start = segment->start / 16000.0f;
                    float duration = segment->n / 16000.0f;
                    float stop = start + duration; 
                    printf("%.3f -- %.3f: %s\n", start, stop, result->text); 
                    st->asrtext = result->text ; 
                }
                SherpaOnnxDestroyOfflineRecognizerResult(result);
                SherpaOnnxDestroyOfflineStream(stream);

                SherpaOnnxDestroySpeechSegment(segment);
                SherpaOnnxVoiceActivityDetectorPop(vad);
            }
            buffer_size = 0;
        }

4、这里拿到tts文本 在翻译成英文转成tts 还是用的sherpa 的tts ,再开个线程处理   

这里要baresip的模块的aufile参考将tts的音频推入(aupcm改写的名字4注册的)发送的buf

if(audio){
            std::vector<int16_t> pcm_samples;
            convert_float_to_pcm(audio->samples, audio->n, pcm_samples);
            printf("tts send %s\n", vec.data());
            //SherpaOnnxWriteWave(audio->samples, audio->n, audio->sample_rate, "C:/Users/lilin/Desktop/test.wav");

            struct auframe af;
            auframe_init(&af, AUFMT_S16LE, NULL, 0, audio->sample_rate , 1);
            struct mbuf* mb = NULL;
            mem_deref(mb);
            int lend = pcm_samples.size() * sizeof(int16_t);
            mb = mbuf_alloc(lend);
            if (!mb){ 
                st->asrtext = "";
                continue;
            }
            memcpy(mb->buf, pcm_samples.data(), lend);

            mb->end = lend;

            uint16_t* sampv = (uint16_t*)mb->buf;

            for (size_t i = 0; i < mb->end / 2; i++) {
                sampv[i] = sys_ltohs(sampv[i]); // 小端转本地字节序
            }

            aubuf_append_auframe(st->aubuf, mb, &af);
            mem_deref(mb);
        }
        SherpaOnnxDestroyOfflineTtsGeneratedAudio(audio);

5、最后在注册url加入自己的模块;audio_source=aupcm,16000   

aupcm是注入的名字ausrc_register(&ausrc, baresip_ausrcl(), "aupcm", aufile_src_alloc);

拨打顺利的就显示

对方听到的就是翻译的tts 。

5、实现对方pcm 的翻译 这里是8k   这里用snffile模块的代码拿过来即可

 在decode(struct aufilt_dec_st* st, struct auframe* af)  里面是数据

af->sampv的就是数据  放入asr 识别就行了,

 如果模块或流程、呼叫系统觉得麻烦可以到  

https://item.taobao.com/item.htm?id=653611115230

baresip开源项目:模块化SIP用户代理实践指南 Baresip 是一个轻量级的 SIP 用户代理库,它旨在提供一个可扩展的通信平台,支持音频和视频通信、多种编解码器,以及 SIP over TLS 和 SRTP 安全特性。由于其模块化设计,开发者可以轻松定制和扩展功能,以满足特定需求。 阅读详情

相关推荐

baresip:Baresip是具有音频和视频支持的模块化SIP用户代理

裸机自述文件 Baresip是具有音频和视频支持的便携式模块化SIP用户代理。 版权所有(c)2010-2021 Alfred E.Heggestad和贡献者根据BSD许可分发 特征: 通话功能: 无限数量的SIP帐户 无限通话 无人值守呼叫转移 自动应答 通话保留并继续 麦克风静音 呼叫等待 通话录音 点对点通话 视像通话 即时通讯 自定义铃声 重复上次通话(重拨) 消息等待指示(MWI) 在场通讯录 信令: SIP协议支持 用于NAT穿越的SIP出站协议 SIP重新邀请 SIP路由 SIP早期媒体支持 DNS NAPTR / SRV支持 多帐户支持 DTMF支持(RTP,SIP INFO) 组播发送与接收 安全: 信令加密(TLS) 音频和视频加密(安全RTP) DTLS-SRTP密钥交换协议 ZRTP密钥交换协议 SDES密钥交换协议 声音的: 低延迟音频管道

【亲测免费】 探索高效轻量级 VoIP 解决方案:Baresip

是一个现代化、可移植且高效的开源VoIP应用,它基于libre和uLaw这两个强大的底层库。这个项目的目的是为用户提供简单、安全的网络通信体验,无论是视频通话还是音频通话,都能在各种操作系统上流畅运行。 ## 项目简介 Baresip的设计理念是简洁和模块化,它的核心组件包括音频编解码器、网络协议处理和媒体处理。通过使用标准的SIP(会话初始化协议)进行通信,Baresip可以与多种VoIP系

gitblog_00022的博客 1570

baresip-studio:适用于Android的基于便秘库的SIP客户端

这是一个简单的Android Studio项目,实现基于裸的SIP用户代理。 当前,该应用程序支持语音呼叫和消息传递,UDP,TCP和TLS信令传输,语音邮件消息等待指示,来电转移(REFER),PCMU / PCMA,iLBC,G.722,G.722.1,G.726,G。 729,AMR和Opus语音编解码器,以及ZRTP和(DTLS)SRTP媒体封装。 出于对不依赖第三方推送通知服务的Android安全SIP用户代理的需求。 如果您需要进行视频通话,并且拥有支持LEVEL3上Camera2 API的Android 7.0或更高版本的设备,则可以从video分支安装其姊妹应用程序baresip +,代替此应用程序。 克隆项目后,使用master分支生成静态库并将文件包含到分发目录。 然后在Android Studio 4.1.3中: 打开一个现有的Android Studio

baresip android 编译、运行教程2 :视频通话

接着上篇https://blog.youkuaiyun.com/Java_lilin/article/details/99450195 写了语音的使用这次写视频 sip客户端的voip 语音识别https://blog.youkuaiyun.com/Java_lilin/article/details/101357324 baresip 源码较为linphone 、pjsip 简单写 如果自己控制音视频比较简单些...

Java_lilin的专栏 2011

baresip-wrapper:用于BareSIP的NodeJS包装器

BareSIP NodeJS包装器 要求 在BareSIP配置中必须取消注释httpd模块 安装 $ npm install baresip-wrapper 用法 import Baresip from 'baresip-wrapper' ; const baresip = new Baresip ( 'command to start baresip' ) ; baresip . connect ( ) ; 方法 accept()接受来电 拨打(phoneNumber)拨打电话号码 hangUp()挂断 kill()杀死生成的进程。 on(事件,回调)以设置事件处理程序 reload()以重新创建生成的进程(这是必需的,例如,一旦更改帐户文件) toggleCallMuted()使当前通话的麦克风静音或取消静音 大事记 准备好BareSIP已初始化 serverConnected B

sherpa-onnx 预训练语音大模型+语音唤起模型

sherpa-onnx 预训练语音大模型+语音唤起模型

baresip android 编译、运行教程3 :sip客户端的voip 语音识别 (讯飞实时语音转写)

前面分别实现了baresip android 语音、视频 参考地址https://blog.youkuaiyun.com/Java_lilin/article/details/100039464 本文对接通后获取双方的语音用讯飞实时语音转写来识别 (如果觉得麻烦可以去https://item.taobao.com/item.htm?id=606696026272购买个维护好的) 1.获取通话数据 参考s...

Java_lilin的专栏 1747

基于PaddlePaddle的VITS语音合成项目设计源码

该项目是采用PaddlePaddle深度学习框架开发的VITS语音合成系统源码,共包含104个文件,涵盖32个Python脚本、28个JSON配置文件、28个OC文件、4个Markdown文件、2个Git忽略文件、1个许可证文件以及其他类型文件。该项目基于VITS端到端语音合成技术,简化了训练和生成流程,大幅降低了使用门槛,适合初学者和专业人士进行语音合成应用开发。

探索高效且安全的VoIP新境界:Baresip开源项目详解

探索高效且安全的VoIP新境界:Baresip开源项目详解 项目地址:https://gitcode.com/gh_mirrors/ba/baresip 项目介绍 Baresip是一款轻量级、模块化的SIP User-Agent,集成了音频和视频通信功能。它的设计目标是实现最小化、模块化,以及在保持RFC合规性的同时提供强大的性能与低内存占用。该项目由Alfred E. Heggestad领导,并...

gitblog_00028的博客 927

vits2 backbone with multilingual-bert

vits2 backbone with multilingual-bert

sherpa-onnx文字转语音TTS >vits-icefall-zh-aishell3模型

​ 有些模型的推理延迟差异很大,其中 vits-icefall-zh-aishell3 最快,38个中文字符, vits-zh-hf-fanchen-C   推理生成出语音需要7-10秒左右,vits-icefall-zh-aishell3模型推理生成出语音只需要2-3秒左右 ​

baresip windows 编译运行(win32)、运行实现sip 音视频通话

baresip 源码较为linphone 、pjsip 简单些 如果自己控制音视频比较简单些 更容易修改源码 安卓开发参考https://blog.youkuaiyun.com/Java_lilin/article/details/100039464 1.下载 http://www.creytiv.com/pub/baresip-0.6.3.tar.gz http://www.creytiv.com...

Java_lilin的专栏 4808

4.无限共轭距柯克物镜设计——zemax学习笔记

无限共轭cooker物镜

fly_daerm的博客 1593

Baresip 是一个可移植的模块化的 SIP 用户代理,支持音频和视频。

Baresip 是一个可移植的模块化的 SIP 用户代理,支持音频和视频。 特点 Audio codecs: AMR, BV32, Celt, G.711, G.722, G.722.1, GSM, iLBC, L16, OPUS, SpeexVideo codecs: H.263, H.264, MPEG4, VPXAudio drivers: Alsa, Coreaudio, Gstr

石头 2520

QGIS效率提升神器:qgis_mcp插件+VSCode联合工作流配置全解析

本文详细解析了如何通过配置qgis_mcp插件与VSCode的联合工作流,实现语音控制和代码自动化来大幅提升QGIS操作效率。该方案将自然语言交互与现代编辑器生态结合,为地理信息专业人士构建了智能、高效的全新工作模式,彻底改变传统GIS操作方式。

weixin_29228203的博客 189

小程序选项卡以及swiper套用(跨页面)

选项卡tab和swpier之间的套用 其实我之前写过一篇选项卡的切换demo,大家阔以参考一下 小程序多个选项卡切换 那今天写这个demo呢,是因为项目需求,所以仅供参考。 我是拿到了home.wxml的数组下标, 通过url传参的方式去将这个id传到下一个页面, 下一个页面接收以后再将id赋值给对应的tabI或者currentId(swiper 的下标) 实现上一个页面进来以后直接进入对应的页...

Rechal_Mei的博客 3596

baresip android 编译、运行教程1 语音通话

1.编译 在git 上找了下https://github.com/juha-h/libbaresip-android这个测试不错 相关的下载sdk和r19的ndk 并参考执行就行了 注意修改ndk路径和输出目录 make download-sources 如果执行不成功 则自己下载包 重命名和他的一样就可以了 地址在Makefile里面 (如果觉得麻烦可以去https://item.t...

Java_lilin的专栏 2752

Synopsys工具链实战:如何用VCS、DC、ICC和Calibre跑通你的第一个数字IC设计项目?

本文详细介绍了如何使用Synopsys工具链(VCS、Design Compiler、ICC和Calibre)完成数字IC设计项目,从RTL代码到GDSII版图的全流程。涵盖环境配置、RTL设计验证、逻辑综合、物理实现及签核验证等关键步骤,帮助工程师掌握高效的数字IC设计流程。

weixin_42525005的博客 196

【亲测免费】 探索Baresip:一款强大的开源SIP用户代理

在当今这个高度互联的世界中,实时通信已成为我们日常生活和工作中不可或缺的一部分。Baresip,作为一款开源且模块化的SIP用户代理,以其丰富的功能和卓越的性能,正逐渐成为开发者和企业的首选。本文将深入介绍Baresip的各项特性、技术分析、应用场景以及其独特的优势。 ## 项目介绍 Baresip是一款便携且模块化的SIP用户代理,支持音频和视频通信。自2010年以来,由Alfred E.

gitblog_00201的博客 594

APB Timer验证环境搭建——学习笔记(1)

以下为个人学习笔记,如有疏漏,请大家指正补充~~APB Timer是一个简单的下行计数器,包括一个32位计数器和一组比较器,可以实现多种计时功能。包括生成一次性中断或者定时中断。

qq_41651535的博客 1577

【漏洞复现】用友U9 UMWebService.asmx 任意文件读取漏洞

用友U9存在任意文件读取漏洞,未授权的攻击者可以通过该漏洞读取服务器任意文件,造成敏感信息泄露。

qq_67810151的博客 620

树莓派sip视频电话-5:baresip-0.5.10

在gitbub中找到baresip这个软件,经过修改可以在树莓派上稳定运行。 一、存在问题: 1.在使用libomxcam(github上)库时候,1080p@30时候帧速只能达到15,且有蓝边。不知道什么原因造成的。 2.在使用webapp模块(修改github上的)时候,退出时候有异常。 3.可能还有其他不稳定情况。 二、编译修改过程: 代码已上传至github上:https://github...

aphero的专栏 4424

华为OD机试真题 新系统【小花获胜的奶茶】

华为OD机试真题 新系统【小花获胜的奶茶】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【小花获胜的奶茶】多语言题解。

qq_45776114的博客 382

Baresip 开源项目安装与使用指南

Baresip 是一个基于SIP协议的模块化User-Agent,支持音频和视频通讯。其仓库结构体现了高度模块化的设计原则,以下是主要的目录介绍: - **`src`**: 包含了核心源代码,如主程序逻辑、模块接口等。 - **`modules`**: 存放各种功能模块的源码,例如不同编解码器、账户管理、菜单界面等。 - **`examples`**: 提供配置文件和简单的示例,帮助用户理解如何...

gitblog_00288的博客 856

【Bug已解决】Codex App returns 401 Missing bearer/basic authentication after login on multiple Windows la

原始报错:Codex App returns 401 Missing bearer/basic authentication after login on multiple Windows laptops场景:用户在 Windows 笔记本上登录应用成功了,但随后每个业务请求都返回 401,提示"Missing bearer/basic authentication"。登录态像是"假的"——明明登了,请求却没带任何认证信息。多台 Windows 设备都能复现。

一键难忘的博客 589

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【开发语音助手】android 语音识别、合成、唤醒 sherpa

前面介绍了 android 部署大模型,下一步就是语音处理,这里我们选用 sherpa 开源项目部署语音识别、合成、唤醒等模型。离线语音识别库有whisper、kaldi、pocketshpinx等,在了解这些库的时候,发现了所谓“下一代Kaldi”的sherpa。从文档和模型名称看,它是一个很新的离线语音识别库,支持中英双语识别,文件和实时语音识别。sherpa是一个基于下一代 Kaldi 和 onnxruntime 的开源项目,专注于语音识别、文本转语音、说话人识别和语音活动检测(VAD)等功能。

这个人很懒什么都没有~ 9416

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: Java jni调用nnom rnn-denoise 降噪
下一篇: esp32 sip voip 软电话
java_lilin
博客等级 码龄14年 364粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值