先把一通录音做完整
这期让 7101 拨 7815,FS 呼叫 7102。接起后两人轮流报不同的短句,挂机后找到一个以通道 UUID 命名的 WAV 文件。用音频工具确认两个声道,再分别听每个声道里是谁的声音。接听前先等几秒,还能比较文件里的音频从哪个阶段开始。
沿用已经互拨成功的目录域和 training-internal 测试入口,媒体经过 FS 正常处理。第 12 期试过的代理或绕过媒体配置先恢复。本期用独立测试路由,录音挂在 7101 所在的主叫通道。目录分机、队列 agent 和 tier 各管自己的部分,直接桥接 7102 有助于先把录音验证清楚。
先准备目录和写入权限
在 fs_cli 分别执行 eval {conf_dir} 和 eval {recordings_dir},取得配置根目录和录音根目录。确认 FS 服务的实际运行用户,再在录音根目录下建立 fs-lab-14,目录属主和组按服务身份配置。可以由运维使用 install -d 指定属主、组和 0750 权限,路径替换为查询到的实际目录。父目录的进入权限和存储挂载权限也要检查。
用服务身份在这个目录建立一个临时测试文件,确认可写后移走测试文件。文件系统只读、空间或 inode 不足,都会影响落盘。容器部署还要对照容器内路径和宿主机挂载位置。录音目录涉及通话内容,给确实需要读写的服务授予权限即可。
目录准备完成,再保存下面的 XML 到 dialplan/default/00_training_record_14.xml。检查 default.xml 的包含链,确认认证后的 7101 进入 default,7815 以及更早的宽泛号码规则没有抢先匹配。使用其他受控 context 时,按已有加载方式放到对应目录。
<include>
<extension name="fs_record_lab_14">
<condition field="destination_number" expression="^7815$">
<!-- 保持普通媒体路径,服务器能够处理音频 -->
<action application="set" data="bypass_media=false"/>
<action application="set" data="proxy_media=false"/>
<!-- 文件按当前通道UUID命名,父目录提前准备好 -->
<action application="set"
data="lab_record_file=$${recordings_dir}/fs-lab-14/${uuid}.wav"/>
<!-- 读写两路分别保存为两个声道 -->
<action application="set" data="RECORD_STEREO=true"/>
<!-- 只在当前通道已接听并进入桥接后采集音频 -->
<action application="set" data="RECORD_ANSWER_REQ=true"/>
<action application="set" data="RECORD_BRIDGE_REQ=true"/>
<!-- 在主叫腿挂载录音,随后再呼叫7102 -->
<action application="record_session" data="${lab_record_file}"/>
<action application="set" data="hangup_after_bridge=true"/>
<!-- 使用已经验证的目录域定位7102 -->
<action application="bridge" data="user/7102@${domain_name}"/>
</condition>
</extension>
</include>
lab_record_file 把展开后的录音根目录与当前通道 UUID 拼成路径,文件后缀 .wav 交给已加载的音频文件模块处理。UUID 能避免不同呼叫同名覆盖。需要按日期建子目录时,也要一起解决目录创建与访问权限。业务通话编号和通道 UUID 的对应关系放进自己的通话记录,质检平台才方便定位文件。
这里的域仍沿用现有 domain_name。跨域系统若原来有不同的目录定位方式,保留已验证的查找方法。应用可能在同一通电话里创建多条通道,以其中一条通道 UUID 命名时,记录清楚它属于哪一腿。
双声道分别是谁的声音
RECORD_STEREO=true 把读、写两路音频分开保存。在本例主叫通道上,读方向是 7101 送进 FS 的声音,写方向是 FS 送回 7101 的声音,桥接中通常来自 7102。后者也可能包含服务器播放的音频。先通过两边轮流说话确认,再给两个声道贴业务角色标签。
如果录音挂在被叫通道,方向的解释要跟着那条通道重新判断。RECORD_STEREO_SWAP 可以调换两路在文件中的排列。RECORD_READ_ONLY 和 RECORD_WRITE_ONLY 可以只采一侧,它们与双声道设置一起出现时值得逐项核对。本期先采用普通双向采集,避免历史的单向开关让某个声道一直为空。
文件的两个声道描述保存结果,SIP 两条腿各自使用什么编码,仍按第 11 期的方法核对。录成双声道并不要求话机发送立体声音频,服务器可以把当前通道读写两路放到同一个双声道文件。
挂载录音和开始采集是两步
record_session 在执行时把后台录音挂到当前通道,后续 bridge 可以继续运行。RECORD_ANSWER_REQ 要求当前通道已接听,RECORD_BRIDGE_REQ 再要求它进入桥接。本例把两个条件都打开,目标是采集接听并桥接后的对话。文件创建时间可能早于真正写入对话音频的时间,验收时要看波形和听音。
如果路由在 bridge 前主动 answer 再播放欢迎语,当前通道已经接听。只设 answer 条件就可能把欢迎语也录进去。想覆盖接听后的 IVR,就按需求评估 bridge 条件;想包含振铃或早期媒体,则要重新设计开始条件并验证实际到达的音频。把需要保留的阶段列清楚,再调整条件。
保持、咨询转接可能改变桥接状态或通道。录音挂在哪条腿、需要保存哪些片段,都要在对应阶段验证。一个文件路径本身无法承担完整业务通话的分段关联,先在直接互拨闭环通过后,再扩展到队列和转接。
加载后,先看文件再听两路
在 fs_cli 执行 reloadxml,新拨一通 7101 到 7815 的电话。只增加拨号计划时不需要重启 Profile。让 7102 晚几秒接听,接起后轮流说“7101 开始”和“7102 开始”,再交替说一段话。挂机后等文件关闭,按本次主叫通道 UUID 查找文件。
验收机器已经安装 FFmpeg 时,可用下面的 ffprobe 命令检查文件。输出是预期检查项,本文没有提供伪造的运行结果。
# 在已安装FFmpeg的验收机器上检查已完成的测试文件
# 替换为实际文件路径,双声道应看到channels为2
ffprobe -v error -select_streams a:0 \
-show_entries stream=codec_name,sample_rate,channels:format=duration \
-of json /path/to/completed-test.wav
channels 应为 2,sample_rate 是保存文件的采样率,单位 Hz,duration 是容器时长,单位秒。再用能独立监听左右声道的播放器或音频编辑器,逐段核对两句话。把接听前等待、接听、桥接和挂机时间与音频对应起来。普通播放器把两路混着放时,很难发现某一路没有内容。
record_sample_rate 可指定保存采样率。本例先沿用会话相关的默认处理,后续给 ASR 或归档系统适配时再明确设置。把窄带音频存成更高采样率,原来的频带内容也不会自动增加。文件还在写入时,某些容器字段可能尚未收尾,先用完成文件做检查。
四种常见表现怎么处理
- 目录里没文件。核对路由命中与 lab_record_file 的展开值,再检查服务用户能否写入、文件模块是否可用以及错误日志。现网的 Profile、ESL 或其他路由也可能已经启动录音,先查当前录音来源。
- 文件存在却只有很短一段。核对接听和桥接条件何时满足,再看通道何时结束、录音何时停止。RECORD_MIN_SEC 还可能删除太短的文件,核对本机是否有该变量。
- 两个声道都保存了同样的混音。检查是否真的设置 RECORD_STEREO、录音挂在哪一腿,以及后处理是否又做了混音转换。用原始完成文件回放确认。
- 录到一半出现缺口。对照暂停、掩码、保持和转接的时间。pause 丢弃暂停期间音频,mask 用静音替换受遮蔽片段,停止后重开又涉及新的文件或片段。按业务要求选择,并用同一个实际录音路径控制。
停止某个后台录音时,stop_record_session 的路径要和开始时一致。RECORD_APPEND 用来追加同一文件,需要核对并发写入和文件命名策略后再用。本例每通使用独立文件,挂机会结束当前通道上的录音。
回退时先等实验通话结束,把新增 XML 移出包含目录并 reloadxml,恢复本次试过的录音变量及已有业务入口。保留验收文件和结果供审核,目录与文件的后续处理遵循项目的留存规则。最后回到 7101、7102 原有互拨及实际录音入口做回归。