freeswitch集成tts和asr

news/2024/12/19 19:04:43/文章来源:https://www.cnblogs.com/IxXi1120/p/18617795

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 = 1function again(s)if(currentQuestion > 2)thens:speak("问题回答完毕,感谢您的参与,再见!")s:hangup()elses: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") thens:speak("你按到了" .. obj.digit .. ",请重新回答问题!\n")again(s)-- return "break"end-- 发生终端输入事件if (type == "event") thenlocal event = obj:getHeader("Speech-Type")-- 触发了begin-speaking事件,也就是发现终端开始说话了if (event == "begin-speaking") thenreturn ""end-- 触发了detected-speech事件,也就是发现终端说话结束了if (event == "detected-speech") thens:execute("detect_speech", "pause")local speech_output = obj:getBody() -- 取到事件的消息体,也就是xml类型的语音识别结果if (speech_output) thenresults = getResults(speech_output)if (results.result ~= nil) thens:speak("您的回答是:" .. results.result .. "\n")   -- 把识别结果再说给终端-- 插入操作(拼接字符串)local question = questions[currentQuestion]local answer = results.resultlocal insert_sql = string.format("INSERT INTO record (question, answer) VALUES ('%s', '%s')", question, answer)-- 执行插入操作local res, serr = dbcon:execute(insert_sql)elses:speak("对不起,我没听清你说什么了")endcurrentQuestion = currentQuestion + 1again(s)    -- 继续下一轮游戏endreturn "break"elses:speak("对不起,我没听见你说什么")return "break"endreturn "break"endreturn "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) thenlocal rec_result = xmlHandler.root.result.interpretation.instancereturn rec_resultelsereturn nilend
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");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/855529.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCL 编程步骤 2. 获取设备

clGetDeviceIDs 查询支持OpenCL设备列表: cl_int clGetDeviceIDs(cl_platform_id platform ,cl_device_type device_type ,cl_uint num_entries ,cl_device_id *devices ,cl_uint *num_devices )与clGetPlatformIDs函数类似,第一次调用时,devic…

记录一下:小华半导体HC32F448建立MDK工程

1.先到官网上下载文件 a>下载驱动库:HC32F448_DDL_Rev1.1.0.zip 驱动库中是包括了例程的。 b>下载样例:HC32F448_Template_Rev1.0.1.zip 可以直接复制官方的样例,就不用自己创建工程了。 c>下载芯片支持包:HC32F448_IDE_Rev1.0.1.zip 下载后双击安装即可。否则KEI…

4大应用场景揭秘:AI视频监控在养老院中的智能化管理与安全保障

随着人口老龄化的加剧,养老院的管理面临着越来越多的挑战。传统的人工巡查方式不仅难以做到全天候监控,而且存在响应迟缓、效率低下等问题。为了解决这些问题,思通数科推出的AI视频监控系统,利用人工智能技术提供了一种高效、智能化的解决方案。尤其在养老院的老人体征监控…

考勤管理系统

实现对用户信息的添加,查看,删除 实现对部门信息的添加,查看 实现用户登录功能,修改密码功能。 页面与之前的大相径庭。 还是一样的框架总体感觉换汤不换药,目前就是熟练度问题

浏览器怎么渲染数据的

突然发现自己对于css的样式规则一直都没有完全明白,今天写文好好整明白 浏览器渲染原理 1. 浏览器向服务器请求html文件 2. html文件返回浏览器 3. 浏览器解读html文件<!DOCTYPE html>//告诉浏览器,这是html5文件// html树<html lang="en">//语言<h…

在宝塔里添加反向代理

安装OnlyOffice时,需要配置反向代理; 完成以上操作之后,访问时有可能出现504报错,也可能就可以正常访问了。如果报错可以修改上图反向代理中的目标URL的内容将域名改成127.0.0.1。我当时改成http://127.0.0.1:9633就可以了本文来自博客园,作者:飞龙在生,转载请注明原文链…

2024 Clion安装使用教程(附激活以及常见问题处理)

第一步:下载Clion安装包 访问Clion官网,下载Clion第二步: 安装 Clion下载完成后,进行安装,next,安装完成点击xx 关掉程序! 第三步: 下载补丁 Clion补丁文件 点击获取补丁下载成功后,打开标注的文件文件夹 , 进入到文件夹 /jetbra 注意: 这个文件夹单独copy一份,所属文…

语言沟通中的设计实现

系统设计的目的是更好的支持需求 我们常说,只要业务能将你的需求描述清楚,能自圆其说,我们就有办法实现。 这其实是系统设计的最理想的状态, 如果业务没想清楚,那么在系统实现中,一定会把问题暴露出来。很多时候,问题的暴露源于没有考虑周全亦或都没有考虑这种场景! 比…

Python 解密 Navicat导出的数据库连接,Navicat数据库连接导入DBeaver。

最近公司收到Navicat律师告知书,让停止使用Navicat,用了那么久的数据库连接工具,不得不换其他的。 最终选择了开源的DBeaver。 安装完DBeaver后,把Navicat导出的connections.ncx文件直接导入DBeaver。直接访问提示连接失败,因为connections.ncx文件里的密码都是加密的。 如…

营销系统缺失投放概念

营销系统现阶段分为营销权益工具、玩法、招商提报三大块。其中权益工具主要负责创建券、促销、换购类优惠权益。玩法负责用户与平台之间的连接,通过任务式交互获得权益。招商提报主要是面向商家参与活动的连接。比如要做一个活动,需要从招商发布活动信息,提报统一创建营销权…

一款使用NET+MQTT+Arduino开发的智能浇花工具

最近闲来无事,对硬件控制产生了兴趣。看到家里的盆栽,我突然萌生了制作一个自动浇水工具的想法。通过在淘宝搜索并查找相关资料,我了解了需要的硬件和通信协议。接下来,我们先看看需要做哪些准备工作(如安装 Arduino、.NET、EMQX 工具等,请自行搜索并完成安装)。 准备工…