Init
and Poll
.AppID
and key. For more information, see Activating Services.GmeError.AV_OK
will be returned with the value being 0
.Poll
API should be called periodically for GME to trigger event callbacks.Poll
periodically to trigger callbacksAPI | Description |
Init | Initializes GME. |
Poll | Triggers an event callback. |
Pause | Pauses the system. |
Resume | Resumes the system. |
Uninit | Uninitializes GME. |
const { GmeContext } = require('gme-electron-sdk');
GmeSDK
object first.context = new GmeContext();
Init
API before you can use the real-time voice chat, voice message, and speech-to-text services. The Init
API must be called in the same thread as other APIs. We recommend you call all APIs in the main thread.//class GmeSDKInit(appid: string, openid: string): number;
Parameter | Type | Description |
sdkAppId | string | |
openID | string | openID can only be in Int64 type, which is passed in after being converted to a string. You can customize its rules, and it must be unique in the application. To pass in openID as a string, submit a ticket for application. |
Returned Value | Description |
GmeError.AV_OK= 0 | The SDK was initialized successfully. |
AV_ERR_SDK_NOT_FULL_UPDATE=7015 | Check whether the SDK file is complete. We recommend that you delete it and then import it again. |
AV_ERR_SDK_NOT_FULL_UPDATE
is only a reminder but will not cause an initialization failure.string SDKAPPID3RD = "14000xxxxx";string openId="10001";number ret = context.Init(SDKAPPID3RD, openId);// Determine whether the initialization is successful by the returned valueif (ret != GmeError.AV_OK){console.log("Failed to initialize the SDK:");return;}
Delegate
method to send callback notifications to the application. Register the callback function to the SDK for receiving callback messages before room entry.SetTMGDelegate(cb: ITMGDelegate);// When initializing the SDKcontext = GmeSDK.GetInstance();context.setTMGDelegate(function(eventId, msg){if (type == ITMG_MAIN_EVENT_TYPE_ENTER_ROOM){// Processing callbacks}});
Poll
API to trigger event callbacks. The Poll
API is GME's message pump and should be called periodically for GME to trigger event callbacks; otherwise, the entire SDK service will run abnormally. For more information, see the EnginePollHelper
file in SDK Download Guide.Poll
API periodicallyPoll
API must be called periodically and in the main thread to avoid abnormal API callbacks.Poll():number;
setInterval(function () {context.Poll();}, 50);
Pause
event occurs in the system, the engine should also be notified for pause. For example, when the application switches to the background (OnApplicationPause, isPause=True), and you do not need the background to play back the audio in the room, please call Pause
API to pause the GME service.Pause() :number
Resume
event occurs in the system, the engine should also be notified for resumption. The Resume
API only supports resuming voice chat.Resume() :number
openid
, switching game account requires uninitializing GME and then using the new openid
to initialize again.Uninit() : number;
API | Description |
GenAuthBuffer | Calculates the local authentication key. |
EnterRoom | Enters a room. |
ExitRoom | Exits a room. |
IsRoomEntered | Determines whether room entry is successful. |
AuthBuffer
for encryption and authentication of relevant features. For release in the production environment, use the backend deployment key as detailed in Authentication Key.GenAuthBuffer(appId: string,roomId: string, openId:string, appKey: number) :string;
Parameter | Type | Description |
appId | string | AppID from the Tencent Cloud console |
roomId | string | Room ID, which can contain up to 127 characters. |
openId | string | User ID, which is the same as openID during initialization. |
key | number |
let userSig = context.GenAuthBuffer(this.appid, this.roomId, this.userId, this.authKey)context.EnterRoom(this.roomId, this.roomType, userSig);
0
, the room entry is successful. If 0
is returned from the EnterRoom
API, it doesn't necessarily mean that the room entry is successful.ChangeRoomType
API, the audio type of the room will be changed.EnterRoom(roomid: string, roomType: number, appKey: string) :number;
Parameter | Type | Description |
roomId | string | Room ID, which can contain up to 127 characters. |
roomType | ITMGRoomType | Room type. We recommend that you select ITMG_ROOM_TYPE_FLUENCY for games. For more information on room audio types, see Sound Quality. |
appKey | string | Authentication key |
context.EnterRoom(roomID, ITMG_ROOM_TYPE_STANDARD, retAuthBuff);
ITMG_MAIN_EVENT_TYPE_ENTER_ROOM
event type will be called back to notify the room entry result, which can be listened on for processing. A successful callback means that the room entry is successful, and the billing starts.// Listen on an event:gmeContext.setTMGDelegate(function(eventId, msg){switch (eventId) {case ITMG_MAIN_EVENT_TYPE_ENTER_ROOM:{}}});
Message | Data | Example |
ITMG_MAIN_EVENT_TYPE_ENTER_ROOM | result; error_info | {"error_info":"","result":0} |
ITMG_MAIN_EVENT_TYPE_ROOM_DISCONNECT | result; error_info | {"error_info":"waiting timeout, please check your network","result":0} |
ITMG_MAIN_EVENT_TYPE.ITMG_MAIN_EVENT_TYPE_ROOM_DISCONNECT
. At this time, the SDK will automatically reconnect, and the callback is ITMG_MAIN_EVENT_TYPE_RECONNECT_START
. When the reconnection is successful, there will be a callback ITMG_MAIN_EVENT_TYPE_RECONNECT_SUCCESS
.Error Code | Cause and Suggested Solution |
7006 | Authentication failure causes: AppID doesn't exist or is incorrect.An error occurred while authenticating authbuff .Authentication expired. OpenId is invalid. |
7007 | The user was already in another room. |
1001 | The user was already in the process of entering a room but repeated this operation. We recommend that you not call the room entry API until the room entry callback is returned. |
1003 | The user was already in the room and called the room entry API again. |
1101 | Make sure that the SDK is initialized, OpenId complies with the rules, the APIs are called in the same thread, and the Poll API is called normally. |
AV_OK
indicates a successful async delivery. If there is a scenario in the application where room entry is performed immediately after room exit, you don't need to wait for the RoomExitComplete
callback notification from the ExitRoom
API; instead, you can directly call the EnterRoom
API.ExitRoom(): number;
context.ExitRoom();
ITMG_MAIN_EVENT_TYPE_EXIT_ROOM
. The sample code is shown below:gmeContext.setTMGDelegate(function(eventId, msg){switch (eventId) {case ITMG_MAIN_EVENT_TYPE_EXIT_ROOM:{// Processbreak;}}});
IsRoomEntered() :boolean
context.IsRoomEntered();
API/Notification | Description |
ITMG_MAIN_EVNET_TYPE_USER_UPDATE | The member status changed. |
AddAudioBlackList | Mutes a member in the room. |
RemoveAudioBlackList | Unmutes a member. |
IsOpenIdInAudioBlackList | Queries whether the user of the specified openid is muted. |
ITMG_MAIN_EVNET_TYPE_USER_UPDATE
containing event_id
, count
, and openIdList
will be returned, which will be identified in the OnEvent
notification.EVENT_ID_ENDPOINT_NO_AUDIO
audio event will be sent only when the threshold is exceeded; that is, other members in the room can receive the notification that the local user stops speaking only after the local client captures no voice for two seconds.GetVolumeById
API.event_id | Description | Maintenance |
EVENT_ID_ENDPOINT_ENTER | Return the openid of the member entering the room. | Member list |
EVENT_ID_ENDPOINT_EXIT | Return the openid of the member exiting the room. | Member list |
EVENT_ID_ENDPOINT_HAS_AUDIO | Return the openid of the member sending audio packets in the room. This event can be used to determine whether a user is speaking and display the voiceprint effect. | Chat member list |
EVENT_ID_ENDPOINT_NO_AUDIO | Return the openid of the member stopping sending audio packets in the room. | Chat member list |
context.setTMGDelegate(function(eventId, msg){if (type == ITMG_MAIN_EVENT_TYPE_ENTER_ROOM){// Processswitch (eventID){case EVENT_ID_ENDPOINT_ENTER:// A member enters the roombreak;case EVENT_ID_ENDPOINT_EXIT:// A member exits the roombreak;case EVENT_ID_ENDPOINT_HAS_AUDIO:// A member sends audio packetsbreak;case EVENT_ID_ENDPOINT_NO_AUDIO:// A member stops sending audio packetsbreak;default:break;}break;}});
0
indicates that the call is successful. Assume that users A, B, and C are all speaking using their mic in a room:AddAudioBlackList(openId: string) :number
Parameter | Type | Description |
openId | string | openid of the user to be blocked |
context.AddAudioBlackList(openId);
RemoveAudioBlackList(openId: string) :number
Parameter | Type | Description |
openId | string | ID to be unblocked |
context.RemoveAudioBlackList(openId);
true
indicates that the ID is blocked, while false
indicates not.IsOpenIdInAudioBlackList(openId: string) :boolean
Parameter | Type | Description |
openId | string | ID to be queried |
boolean isInBlackList = context.IsOpenIdInAudioBlackList(openId);
EnableMic
or EnableSpeaker
API.EnableAudioCaptureDevice
once during room entry and call EnableAudioSend
to enable the user to speak while pressing the button.API | Description |
EnableMic | Enables/Disables the mic. |
GetMicState | Gets the mic status. |
EnableAudioCaptureDevice | Enables/Disables the capturing device. |
IsAudioCaptureDeviceEnabled | Gets the capturing device status. |
EnableAudioSend | Enables/Disables audio upstreaming. |
IsAudioSendEnabled | Gets the audio upstreaming status. |
GetMicLevel | Gets the real-time mic volume level. |
GetSendStreamLevel | Gets the real-time audio upstreaming volume level. |
SetMicVolume | Sets the mic volume level. |
GetMicVolume | Gets the mic volume level. |
EnableMic(bEnable: boolean) : number
Parameter | Type | Description |
isEnabled | boolean | To enable the mic, set this parameter to true ; otherwise, set it to false . |
// Turn on miccontext.EnableMic(true);
GetMicState() :number
context.GetMicState();
EnableAudioCaptureDevice(enable:boolean) :number
Parameter | Type | Description |
enable | boolean | To enable the capturing device, set this parameter to true , otherwise, set it to false . |
// Enable capturing devicecontext.EnableAudioCaptureDevice(true);
IsAudioCaptureDeviceEnabled():boolean
boolean IsAudioCaptureDevice = context.IsAudioCaptureDeviceEnabled();
EnableAudioCaptureDevice
API.EnableAudioSend(bEnable: boolean) :number
Parameter | Type | Description |
isEnabled | boolean | To enable audio upstreaming, set this parameter to true ; otherwise, set it to false . |
context.EnableAudioSend(true);
IsAudioSendEnabled():boolean
boolean IsAudioSend = context.IsAudioSendEnabled();
GetMicLevel():number
context.GetMicLevel();
GetSendStreamLevel() :number
context.GetSendStreamLevel();
volume
, which is equivalent to attenuating or gaining the captured sound.SetMicVolume(volume:number) :number
Parameter | Type | Description |
volume | number | Value range: 0-200. Default value: 100 . 0 indicates that the audio is muted, while 100 indicates that the volume level remains unchanged. |
number micVol = (value * 100);context.SetMicVolume (micVol);
101
indicates that the SetMicVolume
API has not been called.GetMicVolume()
context.GetMicVolume();
API | Description |
EnableSpeaker | Enables/Disables the speaker. |
GetSpeakerState | Gets the speaker status. |
EnableAudioPlayDevice | Enables/Disables the playback device. |
IsAudioPlayDeviceEnabled | Gets the playback device status. |
EnableAudioRecv | Enables/Disables audio downstreaming. |
IsAudioRecvEnabled | Gets the audio downstreaming status. |
GetSpeakerLevel | Gets the real-time speaker volume level. |
GetRecvStreamLevel | Gets the real-time downstreaming audio levels of other members in the room. |
SetSpeakerVolume | Sets the speaker volume level. |
GetSpeakerVolume | Gets the speaker volume level. |
EnableSpeaker(bEnable: boolean) : number;
Parameter | Type | Description |
bEnable | boolean | To disable the speaker, set this parameter to false ; otherwise, set it to true . |
// Turn on the speakercontext.EnableSpeaker(true);
GetSpeakerState() :number
context.GetSpeakerState();
EnableAudioPlayDevice(enable:boolean) :number
Parameter | Type | Description |
enable | boolean | To disable the playback device, set this parameter to false ; otherwise, set it to true . |
context.EnableAudioPlayDevice(true);
IsAudioPlayDeviceEnabled() :boolean
boolean enable = context.IsAudioPlayDeviceEnabled();
EnableAudioPlayDevice
API.EnableAudioRecv(bEnable: boolean) :number
Parameter | Type | Description |
isEnabled | boolean | To enable audio downstreaming, set this parameter to true ; otherwise, set it to false . |
context.EnableAudioRecv(true);
IsAudioRecvEnabled():boolean
boolean IsAudioRecv = context.IsAudioRecvEnabled();
GetSpeakerLevel():number
context.GetSpeakerLevel();
GetRecvStreamLevel(openId: string) :number
Parameter | Type | Description |
openId | string | openId of another member in the room |
number level =GetRecvStreamLevel(openId);
SetSpeakerVolumeByOpenID(openId: string, volume:number) :number;
Parameter | Type | Description |
openId | string | OpenID of the target user |
volume | number | Percentage. Recommended value range: 0–200. Default value: 100 . |
context.SetSpeakerVolumeByOpenID(openId, 100);
SetSpeakerVolumeByOpenID
.GetSpeakerVolumeByOpenID(openId: string) :number;
Parameter | Type | Description |
openId | string | OpenID of the target user |
context.GetSpeakerVolumeByOpenID(openId);
SetSpeakerVolume(volume:number) :number
Parameter | Type | Description |
volume | number | Volume level. Value range: 0–200. Default value: 100 . 0 indicates that the audio is muted, while 100 indicates that the volume level remains unchanged. |
number vol = 100;context.SetSpeakerVolume(vol);
101
indicates that the SetSpeakerVolume
API has not been called.
"Level" indicates the real-time volume, and "Volume" the speaker volume. The final volume = Level * Volume%. For example, if the "Level" is 100 and "Volume" is 60, the final volume is "60".GetSpeakerVolume() :number
numbet volume = context.GetSpeakerVolume();
API | Description |
GetMicListCount | Gets the number of mics. |
GetMicList | Enumerates mics. |
GetSpeakerListCount | Gets the number of speakers. |
GetSpeakerList | Enumerates speakers. |
SelectMic | Selects a mic. |
SelectSpeaker | Selects a speaker. |
GetMicListCount() :number
var micListCount = context.GetMicListCount();
GetMicListCount
API to enumerate mics.GetMicList() :GmeAudioDeviceInfo[];
var micList = context.GetMicList();
DEVICEID_DEFAULT
is passed in, the default mic will be selected.
The 0th device id returned in the GetMicList API is the default device of the call device. If there is a selected call device, it will be maintained by service. If it is unplugged, the call device will be changed back into the default device.SelectMic(micId: string) :number;
Parameter | Type | Description |
micId | string | Mic ID, which is from the list returned by GetMicList . |
context.SelectMic(deviceID);
GetSpeakerListCount() :number;
context.GetSpeakerListCount();
GetSpeakerListCount
API to enumerate speakers.GetSpeakerList(): GmeAudioDeviceInfo[]
var speakList = GetSpeakerList();
DEVICEID_DEFAULT
is passed in, the default playback device will be selected.SelectSpeaker(speakerId: string) :number
Parameter | Type | Description |
speakerId | string | Speaker ID, which is from the list returned by GetSpeakerList . |
var ret = SelectSpeaker(deviceID);
EnableLoopBack+EnableSpeaker
before you can hear your own voice.EnableLoopBack(bEnable: boolean) :number
Parameter | Type | Description |
enable | boolean | Specifies whether to enable. |
context.EnableLoopBack(true);
EnterRoom
API.GetRoomType() :number
context.GetRoomType();
ITMG_MAIN_EVENT_TYPE_CHANGE_ROOM_TYPE
. The audio type of the room is determined by the first user to enter the room. After that, if a member in the room changes the room type, it will take effect for all members there.ChangeRoomType(roomType: number) :number
Parameter | Type | Description |
roomtype | number | Room type to be switched to. For room audio types, see the EnterRoom API. |
context.ChangeRoomType(ITMG_ROOM_TYPE_FLUENCY);
ITMG_MAIN_EVENT_TYPE_CHANGE_ROOM_TYPE
will be returned in the callback. The returned parameters include result
, error_info
, and new_room_type
. The new_room_type
represents the following information. The event message will be identified in the OnEvent
function.Event Subtype | Parameter | Description |
ITMG_ROOM_CHANGE_EVENT_ENTERROOM | 1 | The existing audio type is inconsistent with and changed to that of the entered room. |
ITMG_ROOM_CHANGE_EVENT_START | 2 | A user is already in the room and the audio type starts changing (e.g., calling the ChangeRoomType API to change the audio type). |
ITMG_ROOM_CHANGE_EVENT_COMPLETE | 3 | A user is already in the room, and the audio type has been changed. |
ITMG_ROOM_CHANGE_EVENT_REQUEST | 4 | A room member calls the ChangeRoomType API to request a change of the room audio type. |
context.setTMGDelegate(function(eventId, msg){if (ITMGContext.ITMG_MAIN_EVENT_TYPE.ITMG_MAIN_EVENT_TYPE_CHANGE_ROOM_TYPE == type){// Process room type events}});
ITMG_MAIN_EVENT_TYPE_CHANGE_ROOM_QUALITY
. The returned parameters include weight
, loss
, and delay
, which are as detailed below:Parameter | Type | Description |
weight | number | Value range: 1–50. 50 indicates excellent sound quality, 1 indicates very poor (barely usable) sound quality, and 0 represents an initial meaningless value. Generally, if the value is below 30, you can remind users that the network is poor and recommend them to switch the network. |
Loss | var | Upstream packet loss rate |
Delay | number | Voice chat delay in ms |
GetSDKVersion() :string
context.GetSDKVersion();
SetAppVersion(appVersion: string) : number
Parameter | Type | Description |
appVersion | string | Application name and version |
context.SetAppVersion("gme V2.0.0");
SetLogLevel(level: number) : number
Parameter | Type | Description |
level | number | Sets the log level. TMG_LOG_LEVEL_NONE indicates not to log. Default value: TMG_LOG_LEVEL_INFO . |
level
description:level | Description |
TMG_LOG_LEVEL_NONE | Does not print logs |
TMG_LOG_LEVEL_ERROR | Prints error logs (default) |
TMG_LOG_LEVEL_INFO | Prints info logs |
TMG_LOG_LEVEL_DEBUG | Prints debug logs |
TMG_LOG_LEVEL_VERBOSE | Prints verbose logs |
context.SetLogLevel(TMG_LOG_LEVEL_INFO);
Platform | Path |
Windows | %appdata%\\GMEGLOBAL\\GME\\ProcessName |
SetLogPath(logPath: string)
Parameter | Type | Description |
logPath | string | Path |
string logDir = ""// Set a path by yourselfcontext.SetLogPath(logDir);
GetQualityTips() :string
string tips = context.GetQualityTips();
Message | Description | Data | Example |
ITMG_MAIN_EVENT_TYPE_ENTER_ROOM | A member entered the audio room. | result; error_info | {"error_info":"","result":0} |
ITMG_MAIN_EVENT_TYPE_EXIT_ROOM | A member exited the audio room. | result; error_info | {"error_info":"","result":0} |
ITMG_MAIN_EVENT_TYPE_ROOM_DISCONNECT | The room was disconnected due to a network or another issue. | result; error_info | {"error_info":"waiting timeout, please check your network","result":0} |
ITMG_MAIN_EVNET_TYPE_USER_UPDATE | Room members were updated. | user_list; event_id | {"event_id":1,"user_list":["0"]} |
ITMG_MAIN_EVENT_TYPE_RECONNECT_START | The reconnection to the room started. | result; error_info | {"error_info":"","result":0} |
ITMG_MAIN_EVENT_TYPE_RECONNECT_SUCCESS | The reconnection to the room succeeded. | result; error_info | {"error_info":"","result":0} |
ITMG_MAIN_EVENT_TYPE_SWITCH_ROOM | The room was quickly switched. | result; error_info | {"error_info":"","result":0} |
ITMG_MAIN_EVENT_TYPE_CHANGE_ROOM_TYPE | The room status was changed. | result; error_info; sub_event_type; new_room_type | {"error_info":"","new_room_type":0,"result":0} |
ITMG_MAIN_EVENT_TYPE_ROOM_SHARING_START | Cross-room mic connect started. | result; | {"result":0} |
ITMG_MAIN_EVENT_TYPE_ROOM_SHARING_STOP | Cross-room mic connect stopped. | result; | {"result":0} |
ITMG_MAIN_EVENT_TYPE_SPEAKER_DEFAULT_DEVICE_CHANGED | The default speaker was changed. | result; error_info | {"deviceID":"{0.0.0.00000000}.{a4f1e8be-49fa-43e2-b8cf-dd00542b47ae}","deviceName":"Speaker (Realtek High Definition Audio)","error_info":"","isNewDevice":true,"isUsedDevice":false,"result":0} |
ITMG_MAIN_EVENT_TYPE_SPEAKER_NEW_DEVICE | A new speaker was added. | result; error_info | {"deviceID":"{0.0.0.00000000}.{a4f1e8be-49fa-43e2-b8cf-dd00542b47ae}","deviceName":"Speaker (Realtek High Definition Audio)","error_info":"","isNewDevice":true,"isUsedDevice":false,"result":0} |
ITMG_MAIN_EVENT_TYPE_SPEAKER_LOST_DEVICE | A speaker was lost. | result; error_info | {"deviceID":"{0.0.0.00000000}.{a4f1e8be-49fa-43e2-b8cf-dd00542b47ae}","deviceName":"Speaker (Realtek High Definition Audio)","error_info":"","isNewDevice":false,"isUsedDevice":false,"result":0} |
ITMG_MAIN_EVENT_TYPE_MIC_NEW_DEVICE | A new mic was added. | result; error_info | {"deviceID":"{0.0.1.00000000}.{5fdf1a5b-f42d-4ab2-890a-7e454093f229}","deviceName":"Mic (Realtek High Definition Audio)","error_info":"","isNewDevice":true,"isUsedDevice":true,"result":0} |
ITMG_MAIN_EVENT_TYPE_MIC_LOST_DEVICE | A mic was lost. | result; error_info | {"deviceID":"{0.0.1.00000000}.{5fdf1a5b-f42d-4ab2-890a-7e454093f229}","deviceName":"Mic (Realtek High Definition Audio)","error_info":"","isNewDevice":false,"isUsedDevice":true,"result":0} |
ITMG_MAIN_EVENT_TYPE_MIC_DEFAULT_DEVICE_CHANGED | The default mic was changed. | result; error_info | {"deviceID":"{0.0.1.00000000}.{5fdf1a5b-f42d-4ab2-890a-7e454093f229}","deviceName":"Mic (Realtek High Definition Audio)","error_info":"","isNewDevice":false,"isUsedDevice":true,"result":0} |
ITMG_MAIN_EVENT_TYPE_CHANGE_ROOM_QUALITY | The room network quality changed. | weight; loss; delay | {"weight":5,"loss":0.1,"delay":1} |
ITMG_MAIN_EVNET_TYPE_PTT_RECORD_COMPLETE | Voice message recording was completed. | result; file_path | {"file_path":"","result":0} |
ITMG_MAIN_EVNET_TYPE_PTT_UPLOAD_COMPLETE | Voice message upload was completed. | result; file_path;file_id | {"file_id":"","file_path":"","result":0} |
ITMG_MAIN_EVNET_TYPE_PTT_DOWNLOAD_COMPLETE | Voice message download was completed. | result; file_path;file_id | {"file_id":"","file_path":"","result":0} |
ITMG_MAIN_EVNET_TYPE_PTT_PLAY_COMPLETE | Voice message playback was completed. | result; file_path | {"file_path":"","result":0} |
ITMG_MAIN_EVNET_TYPE_PTT_SPEECH2TEXT_COMPLETE | Fast speech-to-text conversion was completed. | result; text;file_id | {"file_id":"","text":"","result":0} |
ITMG_MAIN_EVNET_TYPE_PTT_STREAMINGRECOGNITION_COMPLETE | Streaming speech-to-text conversion was completed. | result; file_path; text;file_id | {{"file_id":"","file_path":","text":"","result":0}} |
ITMG_MAIN_EVNET_TYPE_PTT_STREAMINGRECOGNITION_IS_RUNNING | Streaming speech-to-text conversion is in progress. | result; file_path; text;file_id | {{"file_id":"","file_path":","text":"","result":0}} |
ITMG_MAIN_EVNET_TYPE_PTT_TEXT2SPEECH_COMPLETE | Text-to-speech conversion was completed. | result; text;file_id | {{"file_id":"","text":"","result":0}} |
ITMG_MAIN_EVNET_TYPE_PTT_TRANSLATE_TEXT_COMPLETE | Text translation was completed. | result; text;file_id | {{"file_id":"","text":"","result":0}} |
문제 해결에 도움이 되었나요?