You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Avaya服务器开发自动呼叫并播放音频的软电话替代方案咨询

实现Avaya自动呼叫并播放TTS音频的技术方案

嗨,我来帮你梳理下实现这个Avaya软电话替代程序的可行路径,不管你用Java还是C#,核心都是基于Avaya官方的SDK来对接服务器,下面是具体的技术指导:

前提准备

首先你得确保你的Avaya服务器已经开启了 Avaya Aura Application Enablement Services (AES),并且给你的应用配置了对应的CTI(计算机电话集成)权限——这是第三方程序能控制Avaya呼叫和媒体的基础,你需要在AES控制台里添加你的应用为授权CTI客户端,分配要操作的分机权限。


Java 实现方案

Java这边推荐使用Avaya官方的 AES CTI Link Java SDK,它提供了完整的呼叫控制和媒体操作API。

核心步骤与代码示例

  1. 初始化AES连接
    首先要建立和AES服务器的CTI连接,用应用账号或者分机账号登录:

    import com.avaya.api.cti.Connection;
    import com.avaya.api.cti.ConnectionListener;
    import com.avaya.api.cti.CtiException;
    
    public class AvayaCallClient {
        private Connection ctiConnection;
    
        public void connectToAES(String aesHost, int port, String username, String password) throws CtiException {
            ctiConnection = new Connection(aesHost, port);
            ctiConnection.addConnectionListener(new ConnectionListener() {
                @Override
                public void onConnectionEstablished() {
                    System.out.println("成功连接到Avaya AES服务器");
                }
    
                @Override
                public void onConnectionFailed(String reason) {
                    System.err.println("连接失败: " + reason);
                }
            });
            ctiConnection.login(username, password);
        }
    }
    
  2. 从数据库查询分机号码
    这部分就是常规的JDBC操作,比如用PreparedStatement查询目标被叫号码:

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    public String getTargetExtension(String dbUrl, String dbUser, String dbPass) throws Exception {
        String targetExt = "";
        try (Connection dbConn = DriverManager.getConnection(dbUrl, dbUser, dbPass);
             PreparedStatement stmt = dbConn.prepareStatement("SELECT extension FROM target_numbers WHERE id = ?")) {
            stmt.setInt(1, 1); // 假设查询指定ID的分机
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                targetExt = rs.getString("extension");
            }
        }
        return targetExt;
    }
    
  3. 发起自动呼叫
    连接建立且拿到目标分机后,用SDK的呼叫控制API发起呼叫:

    import com.avaya.api.cti.call.Call;
    import com.avaya.api.cti.call.CallManager;
    
    public void initiateCall(String sourceExt, String targetExt) throws CtiException {
        CallManager callManager = ctiConnection.getCallManager();
        Call outgoingCall = callManager.placeCall(sourceExt, targetExt);
        // 监听呼叫状态,确保接通后再播放音频
        outgoingCall.addCallStateListener(callState -> {
            if (callState == Call.CallState.CONNECTED) {
                playAudioOnCall(outgoingCall, "path/to/your/tts.wav");
            }
        });
    }
    
  4. 播放TTS音频
    呼叫接通后,用媒体播放器加载音频文件并在通话中播放。注意Avaya通常要求音频是8kHz、16位单声道PCM格式,如果是MP3,需要先解码成PCM(可以用JLayer等第三方库处理):

    import com.avaya.api.cti.media.MediaPlayer;
    import com.avaya.api.cti.media.MediaException;
    
    public void playAudioOnCall(Call call, String audioPath) throws MediaException {
        MediaPlayer player = ctiConnection.getMediaManager().createMediaPlayer();
        player.setAudioSource(audioPath);
        player.attachToCall(call);
        player.play();
        // 监听播放完成事件
        player.addMediaListener(event -> {
            if (event.getType() == MediaPlayer.MediaEvent.PLAY_COMPLETE) {
                player.stop();
                player.detachFromCall();
            }
        });
    }
    

C# 实现方案

C#这边可以使用Avaya官方的 AES .NET CTI SDK,或者更轻量的Avaya One-X Agent API(如果你的场景适合)。

核心步骤与代码示例

  1. 初始化AES连接

    using Avaya.Cti;
    using Avaya.Cti.Connection;
    
    public class AvayaCallService
    {
        private IConnection _ctiConnection;
    
        public async Task ConnectToAES(string aesHost, int port, string username, string password)
        {
            _ctiConnection = new ConnectionFactory().CreateConnection(aesHost, port);
            _ctiConnection.ConnectionEstablished += (sender, e) => 
                Console.WriteLine("成功连接到Avaya AES服务器");
            _ctiConnection.ConnectionFailed += (sender, e) => 
                Console.WriteLine($"连接失败: {e.Reason}");
            await _ctiConnection.LoginAsync(username, password);
        }
    }
    
  2. 查询数据库获取分机
    用ADO.NET或者Entity Framework查询,比如:

    using System.Data.SqlClient;
    
    public async Task<string> GetTargetExtension(string connectionString)
    {
        string targetExt = string.Empty;
        using (var conn = new SqlConnection(connectionString))
        {
            await conn.OpenAsync();
            var cmd = new SqlCommand("SELECT extension FROM target_numbers WHERE id = @Id", conn);
            cmd.Parameters.AddWithValue("@Id", 1);
            var result = await cmd.ExecuteScalarAsync();
            if (result != null) targetExt = result.ToString();
        }
        return targetExt;
    }
    
  3. 发起自动呼叫

    using Avaya.Cti.CallManagement;
    
    public async Task InitiateCall(string sourceExt, string targetExt)
    {
        var callManager = _ctiConnection.GetService<ICallManager>();
        var outgoingCall = await callManager.PlaceCallAsync(sourceExt, targetExt);
        // 监听呼叫接通事件
        outgoingCall.CallStateChanged += (sender, e) =>
        {
            if (e.NewState == CallState.Connected)
            {
                PlayAudioOnCall(outgoingCall, "path/to/your/tts.wav");
            }
        };
    }
    
  4. 播放TTS音频
    同样注意音频格式要求,MP3需要转码为PCM,可以用NAudio库处理解码:

    using Avaya.Cti.Media;
    using NAudio.Wave;
    
    public void PlayAudioOnCall(ICall call, string audioPath)
    {
        // 如果是MP3,先转成PCM
        WaveStream audioStream;
        if (audioPath.EndsWith(".mp3"))
        {
            audioStream = new Mp3FileReader(audioPath);
            audioStream = WaveFormatConversionStream.CreatePcmStream(audioStream);
        }
        else
        {
            audioStream = new WaveFileReader(audioPath);
        }
    
        var mediaManager = _ctiConnection.GetService<IMediaManager>();
        var player = mediaManager.CreateMediaPlayer();
        player.AttachToCall(call);
        player.SetAudioSource(audioStream);
        player.Play();
    
        player.PlayCompleted += (sender, e) =>
        {
            player.Stop();
            player.DetachFromCall();
            audioStream.Dispose();
        };
    }
    

关键注意事项

  • 音频格式兼容性:Avaya的媒体通道对音频格式要求严格,建议提前把TTS生成的MP3转成8kHz、16位单声道的PCM WAV文件,避免播放失败。
  • 权限验证:务必在AES控制台中配置你的应用IP为信任地址,并且给操作的分机分配“允许CTI控制”的权限,否则会出现呼叫被拒绝的情况。
  • 错误处理:实际开发中要添加完善的异常捕获,比如连接中断、呼叫超时、音频文件不存在等场景的处理逻辑。

内容的提问来源于stack exchange,提问作者Anwar Fazza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:44:43