首页 > 其他分享 >freeswitch集成tts和asr

freeswitch集成tts和asr

时间:2024-12-19 19:09:57浏览次数:4  
标签:asr end .. record tts -- session freeswitch local

LUA脚本实现语音的对话并记录在数据库

-- 引入 LuaSQL MySQL 模块
local luasql = require "luasql.mysql"

-- 数据库连接设置
DBHOST = '127.0.0.1'  -- MySQL 服务器地址
DBNAME = 'freeswitch'  -- 这里使用你实际的数据库名称
DBUSER = 'root'        -- MySQL 数据库用户名
DBPASS = '0.123456'    -- MySQL 数据库密码
DBPORT = 3306          -- MySQL 的默认端口

-- 创建 LuaSQL MySQL 环境
local env = assert(luasql.mysql())

-- 连接到 MySQL 数据库
local dbcon = assert(env:connect(DBNAME, DBUSER, DBPASS, DBHOST, DBPORT))
-- 设置数据库连接的字符集为 utf8mb4
dbcon:execute("SET NAMES 'utf8mb4'")

local questions = {
    "请问您的姓名是什么?",
    "请问您的年龄是?",
    "请问您的职业是什么?",
    "您最喜欢的城市是哪个?",
    "最后一个问题,您对我们的服务满意吗?"
}

local currentQuestion = 1

function again(s)
    if(currentQuestion > 2)then
        s:speak("问题回答完毕,感谢您的参与,再见!")
        s:hangup()

    else
        s:speak(questions[currentQuestion])
        s:execute("detect_speech", "unimrcp:aliyun-mrcpserver alimrcp hello")
        s:streamFile("silence_stream://-1")
    end
end

--[[
    session:setInputCallback的回调函数
    @param s        session
    @param type     由FreeSWITCH传递的input-type,可能是dtmf,event等
    @param obj      发生input的消息包,包括消息头和消息体
    @param arg      自定义的参数
]]
function onInput(s, type, obj, arg)
    -- 终端触发了dtmf(按了按键)
    if (type == "dtmf") then
        s:speak("你按到了" .. obj.digit .. ",请重新回答问题!\n")
        again(s)
        -- return "break"
    end
    -- 发生终端输入事件
    if (type == "event") then
        local event = obj:getHeader("Speech-Type")
        -- 触发了begin-speaking事件,也就是发现终端开始说话了
        if (event == "begin-speaking") then
            return ""
        end
        -- 触发了detected-speech事件,也就是发现终端说话结束了
        if (event == "detected-speech") then
            s:execute("detect_speech", "pause")
            local speech_output = obj:getBody() -- 取到事件的消息体,也就是xml类型的语音识别结果
            if (speech_output) then
                results = getResults(speech_output)
                if (results.result ~= nil) then
                    s:speak("您的回答是:" .. results.result .. "\n")   -- 把识别结果再说给终端
                    -- 插入操作(拼接字符串)
                    local question = questions[currentQuestion]
                    local answer = results.result
                    local insert_sql = string.format("INSERT INTO record (question, answer) VALUES ('%s', '%s')", question, answer)

                    -- 执行插入操作
                    local res, serr = dbcon:execute(insert_sql)
                else
                    s:speak("对不起,我没听清你说什么了")
                end
                currentQuestion = currentQuestion + 1
                again(s)    -- 继续下一轮游戏
            end
            return "break"
        else
            s:speak("对不起,我没听见你说什么")
            return "break"
        end
        return "break"
    end
    return "break"
end

--[[
    把mrcp传来的xml识别结果解析成lua的table类型
    @param asrXml   mrcp的语音识别结果
]]
function getResults(asrXml)
    local xml2lua = require('xml2lua')
    local handler = require('xmlhandler.tree')
    local xmlHandler = handler:new()
    local xmlParser = xml2lua.parser(xmlHandler)
    xmlParser:parse(asrXml)
    xml2lua.printable(xmlHandler.root)
    --[[
        <?xml version="1.0" encoding="utf-8"?><result>
        <interpretation grammar="session:hello" confidence="1">
        <instance>
        <result>乘风破浪。</result>
        <beginTime>160</beginTime>
        <endTime>1660</endTime>
        <taskId>0a07801cb19c48ad9ebe75e001b00e07</taskId>
        <waveformUri>dc834b5c7039441f-1.wav</waveformUri>
        </instance>
        <input mode="speech">乘风破浪。</input>
        </interpretation>
        </result>
    ]]
    if (xmlHandler.root ~= nil) then
        local rec_result = xmlHandler.root.result.interpretation.instance
        return rec_result
    else
        return nil
    end
end

-- 脚本实际上从这里开始
session:execute("ring_ready", "1000")
-- 播放一个回铃音
session:execute("playback", "tone_stream://%(1850,4150,475,425);loops=1")
-- 设置录音文件名
local record_time = os.time()
local record_dir =  os.date("%Y%m%d", record_time)
local record_filename = os.date("%Y%m%d%H%M%S", record_time).."-"..session:getVariable("caller_id_number").."-"..session:getVariable("destination_number")..".wav"
session:execute("record_session", "$${recordings_dir}/"..record_dir.."/"..record_filename)
-- 接电话
session:answer()
-- 设置input回调和tts参数
session:setInputCallback('onInput', '')
-- zhibei_emo可以换成阿里云的其他发音人
session:set_tts_params("unimrcp:aliyun-mrcpserver", "zhibei_emo")
-- 播放欢迎语
session:speak("您好,接下来我们将进行五个问题的调查!")
-- 播放第一个问题
session:speak(questions[currentQuestion])
-- 等待对端说话
session:execute("detect_speech", "unimrcp:aliyun-mrcpserver alimrcp hello")
-- 用无限长静音来使保持会话
session:streamFile("silence_stream://-1");

标签:asr,end,..,record,tts,--,session,freeswitch,local
From: https://www.cnblogs.com/IxXi1120/p/18617795

相关文章

  • F5-TTS :具备零样本生成能力的TTS工具!支持多语言切换、速度控制、情感表达!
    随着技术的发展,文本转语音(TTS)系统的应用越来越广泛。无论是在智能助手、内容创作,还是语言学习领域,TTS技术都扮演着重要角色。特别是近两年,随着AI技术的迅速发展,TTS技术(应用)也越来越好,今天为大家推荐一款新型的高级的TTS系统:F5-TTS。项目介绍F5-TTS是一款支持多语言切......
  • 我的AI工具箱Tauri版-VideoRepeatFunAsr短剧解说
    本教程基于自研的AI工具箱Tauri版进行VideoRepeatFunAsr短剧解说。随着短剧创作需求的不断提升,视频解说的原创性与内容品质变得尤为重要。基于自研的AI工具箱Tauri版,VideoRepeatFunAsr短剧解说工具为用户提供了解说视频优化和重构的便捷解决方案。它通过智能技术对解说部分......
  • freeswitch(开启支持MCU视频会议,使用mod_av模块)
    亲测版本centos7.9系统–》freeswitch1.10.9本人freeswitch安装路径(根据自己的路径进入)/usr/local/freeswitch/etc/freeswitch场景说明:有些场景想使用视频会议MCU融合画面进行开会使用方法:第一步:下载插件yuminstall-yepel-releaseyuminstall......
  • 机器学习】ChatTTS-开源文本转语音(text-to-speech)大模型天花板
    【机器学习】ChatTTS:开源文本转语音(text-to-speech)大模型天花板目录一、引言二、TTS(text-to-speech)模型原理2.1VITS模型架构2.2VITS模型训练2.3VITS模型推理三、ChatTTS模型实战3.1ChatTTS简介3.2ChatTTS亮点3.3ChatTTS数据集3.4ChatTTS部署3.4......
  • FreeSWITCH外呼系统是什么?
    FreeSWITCH外呼系统是什么?作者:开源呼叫中心系统FreeIPCC作者介绍:致力于成为大模型呼叫中心系统、电话机器人、客服机器人、智能呼叫中心系统、大模型智能客服系统;开源呼叫中心系统、开源客服系统;视频呼叫中心系统、视频客服系统;全渠道客服系统、在线客服系统等客户服务、企业......
  • FreeSWITCH外呼系统的常见应用场景有哪些?
    外呼系统的常见应用场景有哪些?作者:开源呼叫中心系统FreeIPCC外呼系统凭借其灵活性、可扩展性和强大的功能特性,广泛应用于多个行业和场景中。它不仅支持传统的电话营销活动,还能满足更加复杂的企业沟通需求。以下是外呼系统的几个常见应用场景:1. 电话营销与销售推广批量呼叫......
  • HTK-HResults计算ASR字错、句错
    工作中有测试AI智能助手,当时没有工具,脚本来不及写,人工手动进行测试,从头到尾人工手动测试比对,字错和句错也都是直接在excel中计算,感触就是,确实很累人!接触HTK,有文章已经写过下载以及安装,详情请看HTK下载安装以及示例先来介绍一下基本概念一、语音识别(ASR)语音识别(speechrecognit......
  • 利用pdf.js +FastAPI+openai-TTS 搭建 在线PDF 文档语音阅读服务
    之前一直用NuturalReader阅读英文pdf,校准英文单词发音的准确性,无奈NuturalReader的LLM真人语音价格太贵了,一年要有110刀。实在肉疼。最近基于ManyiAPI聚合接口站:https://api.manyi88.top,ManyiAPI注册链接(注册优惠)可以直接调用openai的tts服务,就有了自己写个在线语音阅读pd......
  • Fish Speech 1.5 发布,TTS-Arena 排名开源第一;DeepMind Genie 2,一键生成无限虚拟世界
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • ASR6601 是完整意义的 LPWAN SOC 无线通信 LORA 射频收发器芯片
    ASR6601是完整意义的LPWANSOC无线通信芯片,该芯片集成了LORA射频收发器、调制解调器和32位RISCMCU。MUC采用cortexM4,频率48mhz。LORA射频收发器从150MHz到960MHz连续频率覆盖。调制解调器支持LPWAN用例的LoRa调制和传统的(G)FSK调制。调制解调器还支持在发......