首页 > 系统相关 >FreeSwitch之TTS 对接paddlespeech (windowsJava版)

FreeSwitch之TTS 对接paddlespeech (windowsJava版)

时间:2024-09-10 20:25:01浏览次数:10  
标签:TTS System println windowsJava context FreeSwitch speak event out

本来计划FreeSwitch 通过tts_commandline对接第三方语音合成,但是由于在家安装的是windows版本,系统安装后mod缺少commandline模版,所以导致无法使用该模版。系统自带的TTS引起filter效果非常差,且不支持中文语音合成,导致在测试的过程中很多工作进行不下去。

家里的电脑是windows10操作系统,安装的也是windows版本的FreeSwitch v1.11.2版本。由于测试语音播报,无法使用TTS引擎,所以自己今天徒手手撕paddlespeech TTS 与FreeSwitch集成。

整体的实现原理:

实现步骤:

第一步:安装paddlespeech 语音系统,PaddleSpeech 的window环境搭建

第二步:开启paddlespeech的流式服务,PaddleSpeech 本地部署+启用流式服务

 第三步:代理模块请求语音服务器获得音频流,存储到FS指定的位置

第四步:代理模块与FS通信播放相关音频流。

具体相关代码:

监听FS发送过来的指令

/**
 *
 * FreeSwitch Outbound 方式服务器
 *
 * @author 赵海洋
 * @date 2024-09-10
 */
public class SpeakAgentApp {
    public static void main(String[] args) throws InterruptedException {
        SocketClient outboundServer = new SocketClient(new InetSocketAddress("127.0.0.1", 18086),
                new IClientHandlerFactory() {
                    @Override
                    public IClientHandler createClientHandler(){
                        return new TTSOutboundHandler();
                    }
                });
        outboundServer.startAsync();
    }
}
/**
 *
 * FreeSwitch OutboundHandler 方式服务器
 *
 * @author 赵海洋
 * @date 2024-09-10
 */   
public class TTSOutboundHandler implements IClientHandler {

        @Override
        public void onEslEvent(Context ctx, EslEvent event) {
            String eventName = event.getEventName();
            String calleeNumber = event.getEventHeaders().get("Caller-Callee-ID-Number");
            String callerNumber = event.getEventHeaders().get("Caller-Caller-ID-Number");

            System.out.println("事件:" + eventName);
            System.out.println("---------------");
            System.out.println("calleeNumber:" + calleeNumber);
            System.out.println("callerNumber:" + callerNumber);
            System.out.println("---------------");
            System.out.println("over");
            System.out.println("---------------");

            Map<String, String> eventHeaders = event.getEventHeaders();
            System.out.println("--------eventHeaders:-------");
            if(eventHeaders!=null){
                eventHeaders.forEach((key,value) ->{
                    System.out.println(" "+eventName+" Headers "+key+":"+value);
                });
            }
            Map<EslHeaders.Name, String>  messageHeaders = event.getMessageHeaders();
            System.out.println("--------messageHeaders:-------");
            if(messageHeaders!=null){
                messageHeaders.forEach((key,value) ->{
                    System.out.println("  "+eventName+" message  "+key+":"+value);
                });
            }

        }

        @Override
        public void onConnect(Context ctx, EslEvent event) {
            String uuid = event.getEventHeaders().get("Unique-ID");
            if (event.getEventName().equalsIgnoreCase("CHANNEL_DATA")) {
                // this is the response to the initial connect
                System.out.println("=======================  incoming channel data  =============================");
                System.out.println("Event-Date-Local: " + event.getEventDateLocal());
                System.out.println("Unique-ID: " + uuid);
                System.out.println("speak context: " + event.getEventHeaders().get("variable_speak_context"));
                System.out.println("Answer-State: " + event.getEventHeaders().get("Answer-State"));
                System.out.println("Caller-Destination-Number: " + event.getEventHeaders().get("Caller-Destination-Number"));
                System.out.println("=======================  = = = = = = = = = = =  =============================");

                String speak_context =  event.getEventHeaders().get("variable_speak_context");
                //得到文字
                System.out.println("speak context======: " +speak_context);
                try{
                    String audioFile = new TTSServer("http://127.0.0.1:8092/paddlespeech/tts/streaming").text2Wav(speak_context);
                    System.out.println("audioFile======: " +audioFile);
                    if(audioFile!=null){
                        playSound(ctx,uuid,audioFile);
                    }
                }catch (IOException e){
                    e.printStackTrace();
                }
                //播放语音
                ctx.closeChannel();

                System.out.println("命令已送达!");

            } else {
                throw new IllegalStateException("Unexpected event after connect: [" + event.getEventName() + ']');
            }
        }
}

FS通过lua脚本实现相关操作

/**
 *
 * FreeSwitch 测试脚本
 *
 * @author 赵海洋
 * @date 2024-09-10
 */  

function speak(context)
	session:setVariable("speak_context", context)
	session:execute("socket","127.0.0.1:18086 full")
end

session:answer();
while (session:ready() == true) do
    -- 防止自动挂断
    session:setAutoHangup(false);
    speak("我是中国人何必学外文")
	
	--休眠5秒
	session:sleep(5000)
    session:hangup();
end	

标签:TTS,System,println,windowsJava,context,FreeSwitch,speak,event,out
From: https://blog.csdn.net/zhyooo123/article/details/142102256

相关文章

  • PaddleSpeech TTS API与流式速度对比(windows Java版)
    首先本地环境要安装部署PaddleSpeech语音识别系统,参考Windows10系统部署PaddleSpeech本地部署好后,根据官方文档启动TTS的流式服务,参考PaddleSpeech语音启用流式服务1、相关服务的启动 1.1本机启动TTSAPI服务paddlespeech_serverstart--config_file./demos/speech_ser......
  • 基于mediapipe和pyttsx3技术实现一个姿态识别语音播报器
    系列文章目录第一章Python机器学习入门之mediapipe和pyttsx3的结合使用文章目录系列文章目录前言一、mediapipe和pyttsx3是什么?二、使用步骤1.引入库2.读入数据总结前言在比赛准备时,由于比赛任务要求需要机器人在自主迅游中记录家庭成员的行为动作,并进行语音播报......
  • 14-STM32F103+ML307(中移4G Cat1)基本控制篇(自建物联网平台)-STM32+ML307以SSL单向认
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/ML307/my.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  说明安装的MQ......
  • 基于ChatTTS与zhipuai虚拟聊天助手(demo)
        demo采用的是streamlit,首先可以是能进行文字沟通,然后ai能够返回语音。正好streamlit中有streamlit.audio可以播放语音。所以剩下的就是如何将输入输出串起来,能够被streamlit.write。虚拟聊天助手的具体思路可以参考上篇文章baseline基于ChatTTS与zhipuai虚拟聊天助......
  • Android 9.0 内置google tts语音包功能实现
    1.前言 在9.0的产品开发中,在gms的相关项目对于文字转语音包功能不是内置功能,需要自己下载google的tts语音包,然后内置,在设置googletts语音包apk作为默认的tts语音引擎功能,接下来分析实现这个功能2.内置googletts语音包功能实现的核心类frameworks/base/core/java/androi......
  • 8月最新版ChatGPT商业运营网站程序源码,支持Midjourney绘画Dalle3绘画,多种语音对话+sun
    8月最新版ChatGPT商业运营网站程序源码,支持Midjourney绘画Dalle3绘画,多种语音对话+suno-ai音乐生成+TTS语音对话+支持GPTs文章目录8月最新版ChatGPT商业运营网站程序源码,支持Midjourney绘画Dalle3绘画,多种语音对话+suno-ai音乐生成+TTS语音对话+支持GPTs前言一、文档总......
  • ChatTTS 长音频合成和本地部署2种方式,让你的“儿童绘本”发声的实战教程(文末有福利)
    接上文(GLM-4-Flash大模型API免费了,手把手构建“儿童绘本”应用实战(附源码)),老牛同学通过GLM-4-Flash文生文和CogView-3文生图大模型,和大家一起编写了一个图文并茂的儿童绘本应用,并且以《黑神话·悟空》当前热门游戏为背景,做了一本名为《悟空探秘之旅》的儿童小绘本。绘本我......
  • freeswitch 32秒自动挂断问题
    freeswitch32秒自动挂断问题说明:首次发表日期:2024-08-23参考:https://serverfault.com/questions/1008661/freeswitch-drops-calls-after-32-secondshttps://blog.csdn.net/qq_32110203/article/details/141126033https://stackoverflow.com/questions/73708045/freeswitc......
  • AI文本转语音:Toucan TTS 支持 7000 多种语言的语音合成工具箱,突破性 OCR 技术:支持多种
    AI文本转语音:ToucanTTS支持7000多种语言的语音合成工具箱,突破性OCR技术:支持多种语言识别,媲美顶级云服务。AI文本转语音:ToucanTTS支持7000多种语言的语音合成工具箱ToucanTTS是由德国斯图加特大学自然语言处理研究所(MS)精心打造的文本转语音(TTS)工具箱,它支持超过......
  • Edge-TTS:文字转语音的魔法棒,让你的世界“声”动起来!
    嘿,听我说,Edge-TTS可不简单!想象一下,你正对着电脑屏幕上的密密麻麻的文字发愁,突然,一根神奇的“魔法棒”——Edge-TTS出现在你眼前。在Edge-TTS在线工具上你轻轻一点,那些静止的文字就像被施了魔法一样,瞬间“活”了起来,变成了一个个生动有趣的声音,在你的耳边跳跃、舞动。Edge-TTS的......