製品概要
製品の利点
応用シナリオ
sudo gem install cocoapods
pod init
platform :ios, '8.0'source 'https://github.com/CocoaPods/Specs.git'target 'App' do# 完全版のIM SDKを統合する場合、バージョン番号は'8.1.6129'以上にする必要がありますpod 'TXIMSDK_Plus_iOS','8.1.6129'# または、ボリュームを削減したIM SDK(AIシグナリング関連機能のみを含む)を統合する場合、バージョン番号は'8.2.6361'以上にする必要がありますpod 'TXIMSDK_Plus_SignalingSDK','8.2.6361'end
pod install
pod update
Xcode > Build Setting > Header Search Paths でSDKヘッダーファイルのパスを設定し、プロジェクトでSDK APIを使用する必要があるファイルに具体的なヘッダーファイルを導入します。#import "ImSDK_Plus.h"
#import <ImSDK_Plus/ImSDK_Plus.h>
repositories {google()// mavenCentral リポジトリを追加mavenCentral()}
dependencies {// 完全版のIM SDKを統合する場合、バージョン番号は'8.1.6129'以上にする必要がありますapi 'com.tencent.imsdk:imsdk-plus:8.1.6129'// または、ボリュームを削減したIM SDK(AIシグナリング関連機能のみを含む)を統合する場合、バージョン番号は'8.2.6361'以上にする必要がありますapi 'com.tencent.imsdk:signalingsdk:8.2.6361'}
defaultConfig {ndk {abiFilters "arm64-v8a"}}

<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-keep class com.tencent.imsdk.** { *; }
// バージョン番号v3.4.5以上npm install @tencentcloud/chat
npm config set registry http://r.cnpmjs.org/
import TencentCloudChat from '@tencentcloud/chat';
// 1. ChatコンソールからアプリケーションのSDKAppIDを取得します。// 2. configオブジェクトを初期化しますV2TIMSDKConfig *config = [[V2TIMSDKConfig alloc] init];// 3. log出力レベルを指定します。config.logLevel = V2TIM_LOG_INFO;// 4. V2TIMSDKListenerのイベントリスナーを追加します。selfはid<V2TIMSDKListener>の実装クラスです。IM SDKのイベントを監視する必要がない場合、このステップを省略できます。[[V2TIMManager sharedInstance] addIMSDKListener:self];// 5. IM SDKを初期化し、このインターフェースを呼び出した後、すぐにログインインターフェースを呼び出すことができます。[[V2TIMManager sharedInstance] initSDK:sdkAppID config:config];
NSString *userID = @"your user id";NSString *userSig = @"userSig from your server";[[V2TIMManager sharedInstance] login:userID userSig:userSig succ:^{NSLog(@"success");} fail:^(int code, NSString *desc) {// 以下のエラーコードが返された場合、UserSigが期限切れであることを示します。新しく発行された UserSig を使用して再度ログインしてください。// 1. ERR_USER_SIG_EXPIRED(6206)// 2. ERR_SVR_ACCOUNT_USERSIG_EXPIRED(70001)// 注意:他のエラーコードの場合は、ここでログインインターフェースを呼び出さないでください。IM SDK のログインが無限ループになるのを避けるためです。NSLog(@"failure, code:%d, desc:%@", code, desc);}];
// 1. ChatコンソールからアプリケーションのSDKAppIDを取得します。// 2. configオブジェクトを初期化します。V2TIMSDKConfig config = new V2TIMSDKConfig();// 3. log出力レベルを指定します。config.setLogLevel(V2TIMSDKConfig.V2TIM_LOG_INFO);// 4. V2TIMSDKListenerのイベントリスナーを追加します。sdkListenerはV2TIMSDKListenerの実現クラスです。IM SDKのイベントを監視する必要がない場合、このステップを省略できます。V2TIMManager.getInstance().addIMSDKListener(sdkListener);// 5. IM SDKを初期化し、このインターフェースを呼び出した後、すぐにログインインターフェースを呼び出すことができます。V2TIMManager.getInstance().initSDK(context, sdkAppID, config);
String userID = "your user id";String userSig = "userSig from your server";V2TIMManager.getInstance().login(userID, userSig, new V2TIMCallback() {@Overridepublic void onSuccess() {Log.i("imsdk", "success");}@Overridepublic void onError(int code, String desc) {// 以下のエラーコードが返された場合、UserSigが期限切れであることを示します。新しく発行された UserSig を使用して再度ログインしてください。// 1. ERR_USER_SIG_EXPIRED(6206)// 2. ERR_SVR_ACCOUNT_USERSIG_EXPIRED(70001)// 注意:他のエラーコードの場合は、ここでログインインターフェースを呼び出さないでください。IM SDK のログインが無限ループになるのを避けるためです。Log.i("imsdk", "failure, code:" + code + ", desc:" + desc);}});
import TencentCloudChat from '@tencentcloud/chat';let options = {SDKAppID: 0 // 導入時には0をChatアプリケーションのSDKAppIDに置き換えてください};// SDKインスタンスを作成します。`TencentCloudChat.create()`メソッドは同じ`SDKAppID`に対して同じインスタンスのみを返しますlet chat = TencentCloudChat.create(options); // SDKインスタンスは通常chatで表されますchat.setLogLevel(0); // 通常レベル、ログ量が多く、導入時にはこの設定をお勧めします// chat.setLogLevel(1); // release レベル、SDKは重要な情報を出力し、本番環境でこの設定をお勧めします
let promise = chat.login({userID: 'your userID', userSig: 'your userSig'});promise.then(function(imResponse) {console.log(imResponse.data); // ログイン成功if (imResponse.data.repeatLogin === true) {// アカウントがすでにログイン済みであり、今回のログイン操作は重複ログインです。console.log(imResponse.data.errorInfo);}}).catch(function(imError) {console.warn('login error:', imError); // ログイン失敗に関する情報});
sdkAppId と secretKey は同じでなければなりません。userIdでなければなりません(即ち、同じuserIdを使用してRTC Engineルームに入室し、IMにログインする必要があります)。type | 说明 |
10000 | リアルタイム字幕、翻訳の配信 |
10001 | AI対話リアルタイム状態の配信 |
10010 | 大規模モデルメッセージのパススルー |
{"type": 10000, // 10000はリアルタイム字幕の配信を示します"sender": "user_a", // 発言者のuserid"receiver": [], // 受信者useridリスト、このメッセージは実際にはルーム内でブロードキャストされます"payload": {"text":"", // 音声認識されたテキスト"translation_text":"", // 翻訳されたテキスト"start_time":"00:00:01", // この文の開始時間"end_time":"00:00:02", // この文の終了時間"roundid": "xxxxx" // 一連の対話を一意に識別します"end": true // trueの場合、これは完全な文であることを示します}}
{"type": 10001, // ボットの状態"sender": "user_a", // 送信者userid、ここはボットのidです"receiver": [], // 受信者useridリスト、このメッセージは実際にはルーム内でブロードキャストされます"payload": {"roundid": "xxx", // 一連の対話を一意に識別します"timestamp": 123"state": 1, // 1 聴取中 2 思考中 3 発言中 4 中断された}}
{"type": 10010, // 大規模モデルメッセージのパススルー・ダウンリング"sender": "user_a", // 送信者userid、ここはボットのidです"receiver": [], // 受信者useridリスト、このメッセージは実際にはルーム内でブロードキャストされます"payload": {"id": "uuid", // メッセージID、uuidを使用可能、問題の調査に使用 オプション"taskid":"xxxxxx", // このai対話のtaskid、必須"timestamp": 123 // タイムスタンプ、問題の調査に使用、オプション"data": {"key": "value" //業務でカスタマイズされたjson形式}}}
// addSimpleMsgListenerを呼び出してイベントリスナーを設定しますV2TIMManager.sharedInstance().addSimpleMsgListener(listener: self)/// 1対1チャットのカスタムメッセージを受信します/// @param msgID メッセージID/// @param info 送信者情報/// @param data カスタムメッセージのバイナリ内容func onRecvC2CCustomMessage(_ msgID: String!, sender info: V2TIMUserInfo!, customData data: Data!) {do {if let jsonObject = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {print("onRecvGroupCustomMessage: \\(jsonObject)")handleMessage(jsonObject)} else {print("The data is not a dictionary.")}} catch {print("Error parsing JSON: \\(error)")}}
// addSimpleMsgListenerを呼び出してイベントリスナーを設定しますV2TIMManager.getInstance().addSimpleMsgListener(sdkListener);/*** 1対1チャットのカスタムメッセージを受信します* @param msgID メッセージID* @param sender 送信者情報* @param customData 送信内容*/public void onRecvC2CCustomMessage(String msgID, V2TIMUserInfo sender, byte[] customData) {Log.i("onRecvC2CCustomMessage", "msgID:" + msgID + ", from:" + sender.getNickName() + ", content:" + new String(customData));try {String jsonString = new String(customData, "UTF-8");JSONObject jsonObject = new JSONObject(jsonString);System.out.println("onRecvGroupCustomMessage: " + jsonObject);handleMessage(jsonObject);} catch (UnsupportedEncodingException e) {System.out.println("The data is not a dictionary.");} catch (JSONException e) {System.out.println("Error parsing JSON: " + e);}}
const onMessageReceived = (event) => {const messageList = event.data;messageList?.forEach((msg) => {if (msg.type === TencentCloudChat.TYPES.MSG_CUSTOM) {console.log('カスタムメッセージを受信しました', event);const { data } = msg.payload;try {const jsonData = JSON.parse(data);console.log(`receive custom msg from ${msg.from} data: ${data}`);if (jsonData.type === 10000) {console.log('字幕メッセージ', jsonData);return;}if (jsonData.type === 10001) {console.log('ボットの状態', jsonData);return;}if (jsonData.type === 10010) {console.log('大規模モデルメッセージのパススルー・ダウンリンク', jsonData);return;}} catch (error) {console.error('receive custom msg', data, error);}}});}// メッセージを監視chat.on(TencentCloudChat.EVENT.MESSAGE_RECEIVED, onMessageReceived);
type | 说明 |
20000 | ai_conversation_chat:AI対話テキストを送信 |
20001 | ai_conversation_interrupt:手動で中断 |
20010 | 大規模モデルにパススルー情報を送信 |
{"type": 20000,"sender": "user_a", // 送信者useridであり、サーバー側はこのuseridが有効かどうかをチェックします"receiver": ["user_bot"], // 受信者 userid リストであり、ボットのuseridを記入するだけで十分です。サーバー側でuseridが有効かどうかをチェックします"payload": {"id": "uuid", // メッセージidであり、uuidを使用可能、問題の調査に使用"message": "xxx", // メッセージ内容"timestamp": 123, // タイムスタンプ、問題の調査に使用"taskid": "v2_20240920_xxxxx",}}
{"type": 20001,"sender": "userid", // 送信者のuseridであり、サーバー側はこのuseridが有効かどうかをチェックします"receiver": ["user_bot"], // 受信者 userid リストであり、ボットのuseridを記入するだけで十分です"payload": {"id": "uuid", // メッセージidであり、uuidを使用可能、問題の調査に使用"timestamp": 123 // タイムスタンプ、問題の調査に使用"taskid": "v2_20240920_xxxxx",}}
{"type": 20010,"sender": "userid","receiver": ["robotid"],"payload": {"id": "uuid","taskid": "v2_20240920_xxxxx","timestamp": 1234,"data": {"key": "value" //業務でカスタマイズされたjson形式}}}
@IBAction func interruptAi(_ sender: UIButton) {let timestamp = Int(Date().timeIntervalSince1970 * 1000)let payload = ["id": userId + "_\\(roomId)" + "_\\(timestamp)", // メッセージidであり、uuidを使用可能、問題の調査に使用"timestamp": timestamp, // タイムスタンプ、問題の調査に使用"taskid": aiTaskId,] as [String : Any]let content = ["type": 20001,"sender": userId,"receiver": [botId],"payload": payload] as [String : Any]let contentData = try! JSONSerialization.data(withJSONObject: content, options: [])let contentString = String(data: contentData, encoding: .utf8)!let dataDict = ["service_command": "trtc_ai_service.SendCustomCmdMsg","request_content": contentString] as [String : Any]do {let jsonData = try JSONSerialization.data(withJSONObject: dataDict, options: [])V2TIMManager.sharedInstance().callExperimentalAPI("sendTRTCCustomData", param: jsonData as NSObject) { _ inprint("sendTRTCCustomData success")} fail: { code, desc inprint("sendTRTCCustomData error, \\(code), \\(desc ?? "null")")}} catch {print("Error serializing dictionary to JSON: \\(error)")}}
public void interruptAi() {long timestamp = System.currentTimeMillis();Map<String, Object> payload = new HashMap<>();payload.put("id", userId + "_" + roomId + "_" + timestamp); // メッセージid、uuidを使用可能、問題の調査に使用payload.put("timestamp", timestamp); // タイムスタンプ、問題の調査に使用payload.put("taskid", aiTaskId);Map<String, Object> content = new HashMap<>();content.put("type", 20001);content.put("sender", userId);content.put("receiver", Collections.singletonList(botId));content.put("payload", payload);String contentString = new JSONObject(content).toString();Map<String, Object> dataDict = new HashMap<>();dataDict.put("service_command", "trtc_ai_service.SendCustomCmdMsg");dataDict.put("request_content", contentString);try {byte[] jsonData = new JSONObject(dataDict).toString().getBytes("UTF-8");V2TIMManager.getInstance().callExperimentalAPI("sendTRTCCustomData", jsonData, new V2TIMValueCallback() {@Overridepublic void onSuccess(Object o) {System.out.println("sendTRTCCustomData success");}@Overridepublic void onError(int code, String desc) {System.out.println("sendTRTCCustomData error, " + code + ", " + (desc != null ? desc : "null"));}});} catch (UnsupportedEncodingException e) {System.out.println("Error serializing dictionary to JSON: " + e);}}
// 中断シグナルを送信chat.callExperimentalAPI('sendTRTCCustomData', {serviceCommand: 'trtc_ai_service.SendCustomCmdMsg',data: {type: 20001,sender: "user_a", // 送信者useridであり、サーバー側はこのuseridが有効かどうかをチェックしますreceiver: ["user_bot"], // 受信者 userid リストであり、ボットのuseridを記入するだけで十分ですpayload: {id: "uuid", // メッセージid、uuidを使用可能、問題の調査に使用timestamp: 123, // タイムスタンプ、問題の調査に使用taskid: "タスクのtaskid"}}});
type、sender、receiver および payload の taskid、id、timestamp は必須フィールドです。フィードバック