tencent cloud

Feedback

Quick Integration of Native SDK

Last updated: 2024-01-18 11:53:35
    This document provides a detailed description that makes it easy for Native project developers to debug and integrate the APIs for Game Multimedia Engine (GME).
    This document only provides the main APIs to help you get started with GME to debug and integrate the APIs.

    Key Considerations for Using GME

    GME provides two services: Voice chat service and voice messaging and speech-to-text service, both of which rely on key APIs such as Init and Poll.
    Note on Init API:
    If you need to use voice chat and voice messaging services at the same time, you only need to call Init API once.

    API call flowchart

    
    image
    
    

    Directions

    Core APIs

    Voice Chat

    Voice Message

    Core API Integration

    1. Download the SDK

    On the SDK download guide page, download the appropriate client SDKDownLoad.

    2. Importing the header file

    Java
    Object-C
    C++
    import com.tencent.TMG.ITMGContext;
    import com.tencent.av.sig.AuthBuffer;
    import com.tencent.bugly.crashreport.CrashReport;
    
    #import "GMESDK/TMGEngine.h"
    #import "GMESDK/QAVAuthBuffer.h"
    
    #include "auth_buffer.h"
    #include "tmg_sdk.h"
    #include "AdvanceHeaders/tmg_sdk_adv.h"
    #include <vector>
    

    3. Getting singleton

    To use the voice feature, get the ITMGContext object first.

    Function prototype

    Java
    Object-C
    C++
    public static ITMGContext GetInstance(Context context)
    
    + (ITMGContext*) GetInstance;
    
    __UNUSED static ITMGContext* ITMGContextGetInstance(){
    return ITMGContextGetInstanceInner(TMG_SDK_VERSION);
    }
    

    Sample code

    Java
    Object-C
    C++
    //MainActivity.java
    import com.tencent.TMG.ITMGContext;
    ITMGContext tmgContext = ITMGContext.GetInstance(this);
    
    //TMGSampleViewController.m
    ITMGContext* _context = [ITMGContext GetInstance];
    
    ITMGContext* context = ITMGContextGetInstance();
    

    4. Setting callback

    The API class uses the Delegate method to send callback notifications to the application. Register the callback function to the SDK for receiving callback messages before room entry.

    Function prototype and sample code

    Register the callback function to the SDK for receiving callback messages before room entry.
    Java
    Object-C
    C++
    //ITMGContext
    public abstract int SetTMGDelegate(ITMGDelegate delegate);
    
    //MainActivity.java
    tmgContext.SetTMGDelegate(TMGCallbackDispatcher.getInstance());
    
    ITMGDelegate < NSObject >
    
    //TMGSampleViewController.m
    ITMGContext* _context = [ITMGContext GetInstance];
    _context.TMGDelegate = [DispatchCenter getInstance];
    
    // When initializing the SDK
    m_pTmgContext = ITMGContextGetInstance();
    m_pTmgContext->SetTMGDelegate(this);
    // In the destructor
    CTMGSDK_For_AudioDlg::~CTMGSDK_For_AudioDlg()
    {
    ITMGContextGetInstance()->SetTMGDelegate(NULL);
    }
    

    Callback examples

    Override this callback function in the constructor to process the parameters of the callback.
    Java
    Object-C
    C++
    //MainActivity.java
    tmgContext.SetTMGDelegate(TMGCallbackDispatcher.getInstance());
    
    //RealTimeVoiceActivity.java
    public void OnEvent(ITMGContext.ITMG_MAIN_EVENT_TYPE type, Intent data) {
    if (type == ITMG_MAIN_EVENT_TYPE_ENTER_ROOM)
    {
    // Processing callbacks
    }
    }
    
    // Refer to TMGCallbackDispatcher.java, TMGCallbackHelper.java, and TMGDispatcherBase.java
    
    //TMGRealTimeViewController.m
    TMGRealTimeViewController ()< ITMGDelegate >
    
    
    - (void)OnEvent:(ITMG_MAIN_EVENT_TYPE)eventType data:(NSDictionary *)data {
    NSString *log = [NSString stringWithFormat:@"OnEvent:%d,data:%@", (int)eventType, data];
    [self showLog:log];
    NSLog(@"====%@====", log);
    switch (eventType) {
    // Step 6/11 : Perform the enter room event
    case ITMG_MAIN_EVENT_TYPE_ENTER_ROOM: {
    int result = ((NSNumber *)[data objectForKey:@"result"]).intValue;
    NSString *error_info = [data objectForKey:@"error_info"];
    
    [self showLog:[NSString stringWithFormat:@"OnEnterRoomComplete:%d msg:(%@)", result, error_info]];
    
    if (result == 0) {
    [self updateStatusEnterRoom:YES];
    }
    }
    break;
    
    }
    }
    
    // Refer to DispatchCenter.h and DispatchCenter.m
    
    // Declaration in the header file
    virtual void OnEvent(ITMG_MAIN_EVENT_TYPE eventType,const char* data);
    // Sample code
    void CTMGSDK_For_AudioDlg::OnEvent(ITMG_MAIN_EVENT_TYPE eventType, const char* data)
    {
    switch(eventType)
    {
    case ITMG_MAIN_EVENT_TYPE_XXXX_XXXX:
    {
    // Process the callback
    }
    break;
    }
    }
    
    Parameter
    Type
    Description
    type
    ITMGContext.ITMG_MAIN_EVENT_TYPE
    Event type in the callback response
    data
    Intent message type
    Callback message, i.e., event data

    5. Initializing SDK

    You need to initialize the SDK through the Init API before you can use the real-time voice, 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.

    API prototype

    Java
    Object-C
    C++
    public abstract int Init(String sdkAppId, String openId);
    
    -(int)InitEngine:(NSString*)sdkAppID openID:(NSString*)openID;
    
    ITMGContext virtual int Init(const char* sdkAppId, const char* openId)
    
    Parameter
    Type
    Description
    sdkAppId
    string
    AppID provided in the GME console, which can be obtained as instructed in Activating Services.
    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.

    Sample code

    Java
    Object-C
    C++
    //MainActivity.java
    int nRet = tmgContext.Init(appId, openId);
    if (nRet == AV_OK )
    {
    GMEAuthBufferHelper.getInstance().setGEMParams(appId, key, openId);
    // Step 4/11: Poll to trigger callback
    //https://www.tencentcloud.com/document/product/607/40860
    EnginePollHelper.createEnginePollHelper();
    showToast("Init success");
    }else if (nRet == AV_ERR_HAS_IN_THE_STATE) // SDK has been initialized. This operation is successful.
    {
    showToast("Init success");
    }else
    {
    showToast("Init error errorCode:" + nRet);
    }
    
    //TMGSampleViewController.m
    QAVResult result = [_context InitEngine:self.appIDTF.text openID:self.openIDTF.text];
    if (result == QAV_OK) {
    self.isSDKInit = YES;
    }
    
    #define SDKAPPID3RD "14000xxxxx"
    cosnt char* openId="10001";
    ITMGContext* context = ITMGContextGetInstance();
    context->Init(SDKAPPID3RD, openId);
    

    6. Triggering event callback

    Event callbacks can be triggered by periodically calling the Poll API in update. 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.

    Sample code

    Java
    Object-C
    C++
    //MainActivity.java
    [EnginePollHelper createEnginePollHelper];
    
    //EnginePollHelper.java
    private Handler mhandler = new Handler();
    private Runnable mRunnable = new Runnable() {
    @Override
    public void run() {
    if (s_pollEnabled) {
    if (ITMGContext.GetInstance(null) != null)
    ITMGContext.GetInstance(null).Poll();
    }
    mhandler.postDelayed(mRunnable, 33);
    }
    };
    // For the code of calling Poll periodically, see EnginePollHelper.java.
    
    //TMGSampleViewController.m
    [EnginePollHelper createEnginePollHelper];
    // Refer to EnginePollHelper.m and EnginePollHelper.h
    
    void TMGTestScene::update(float delta)
    {
    ITMGContextGetInstance()->Poll();
    }
    

    7. Calculating the local authentication key

    Generate AuthBuffer for encryption and authentication of relevant features. For release in the production environment, please use the backend deployment key as detailed in Authentication Key.

    API prototype

    Java
    Object-C
    C++
    AuthBuffer public native byte[] genAuthBuffer(int sdkAppId, String roomId, String openId, String key)
    
    //TMGSampleViewController.m
    [EnginePollHelper createEnginePollHelper];
    // Refer to EnginePollHelper.m and EnginePollHelper.h
    
    void TMGTestScene::update(float delta)
    {
    ITMGContextGetInstance()->Poll();
    }
    
    Parameter
    Type
    Description
    appId
    int
    AppId from the Tencent Cloud console.
    roomId
    string
    Room ID, which can contain up to 127 characters (For voice message, enter "null".)
    openId
    string
    User ID, which is the same as openId during initialization.
    key
    string
    Permission key from the Tencent Cloud console.

    Sample code

    Java
    Object-C
    C++
    //GMEAuthBufferHelper.java
    import com.tencent.av.sig.AuthBuffer;// Header file
    public byte[] createAuthBuffer(String roomId)
    {
    byte[] authBuffer;
    // Generate AuthBuffer for encryption and authentication of relevant features. For release in the production environment,
    // please use the backend deployment key as detailed in https://www.tencentcloud.com/document/product/607/12218
    if (TextUtils.isEmpty(roomId))
    {
    authBuffer = AuthBuffer.getInstance().genAuthBuffer(Integer.parseInt(mAppId), "0", mOpenId, mKey);
    }else
    {
    authBuffer = AuthBuffer.getInstance().genAuthBuffer(Integer.parseInt(mAppId), roomId, mOpenId, mKey);
    }
    return authBuffer;
    }
    
    // Voice chat authentication
    NSData* authBuffer = [QAVAuthBuffer GenAuthBuffer:SDKAPPID3RD.intValue roomID:self.roomIdTF.text openID:_openId key:_key];
    // Voice message authentication
    NSData* authBuffer = [QAVAuthBuffer GenAuthBuffer:(unsigned int)SDKAPPID3RD.integerValue roomID:nil openID:self.openId key:AUTHKEY];
    
    unsigned int bufferLen = 512;
    unsigned char retAuthBuff[512] = {0};
    QAVSDK_AuthBuffer_GenAuthBuffer(atoi(SDKAPPID3RD), roomId, "10001", AUTHKEY,retAuthBuff,bufferLen);
    

    Voice Chat Access

    1. Entering a room

    This API is used to enter a room with the generated authentication information. The mic and speaker are not turned on by default after room entry. The returned value of AV_OK indicates successful API call but not successful room entry.

    API prototype

    Java
    Object-C
    C++
    public abstract int EnterRoom(String roomID, int roomType, byte[] authBuffer);
    
    -(int)EnterRoom:(NSString*) roomId roomType:(int)roomType authBuffer:(NSData*)authBuffer;
    
    ITMGContext virtual int EnterRoom(const char* roomID, ITMG_ROOM_TYPE roomType, const char* authBuff, int buffLen);
    
    Parameter
    Type
    Description
    roomId
    String
    Room ID, which can contain up to 127 characters
    roomType
    int
    Use FLUENCY sound quality to enter the room
    authBuffer
    byte[]
    Authentication code

    Sample code

    Java
    Object-C
    C++
    //RealTimeVoiceActivity.java
    byte[] authBuffer = GMEAuthBufferHelper.getInstance().createAuthBuffer(roomId);
    ITMGContext.GetInstance(this).EnterRoom(roomId, roomType, authBuffer);
    
    //TMGRealTimeViewController.m
    [[ITMGContext GetInstance] EnterRoom:self.roomIdTF.text roomType:(int)self.roomTypeControl.selectedSegmentIndex + 1 authBuffer:authBuffer];
    
    ITMGContext* context = ITMGContextGetInstance();
    context->EnterRoom(roomID, ITMG_ROOM_TYPE_FLUENCY, (char*)retAuthBuff,bufferLen);
    

    Callback for room entry

    After the user enters the room, the message ITMG_MAIN_EVENT_TYPE_ENTER_ROOM will be sent and identified in the OnEvent function for callback and processing. A successful callback means that the room entry is successful, and the billing starts.
    Sample codeSample code for processing the callback, including room entry and network disconnection events.
    Java
    Object-C
    C++
    //RealTimeVoiceActivity.java
    public void OnEvent(ITMGContext.ITMG_MAIN_EVENT_TYPE type, Intent data) {
    if (type == ITMG_MAIN_EVENT_TYPE_ENTER_ROOM)
    {
    // Step 6/11 : Perform the enter room event
    int nErrCode = TMGCallbackHelper.ParseIntentParams2(data).nErrCode;
    String strMsg = TMGCallbackHelper.ParseIntentParams2(data).strErrMsg;
    if (nErrCode == AV_OK)
    {
    appendLog2MonitorView("EnterRomm success");
    }else
    {
    appendLog2MonitorView(String.format(Locale.getDefault(), "EnterRomm errCode:%d errMsg:%s", nErrCode, strMsg));
    }
    }
    }
    
    //TMGRealTimeViewController.m
    
    - (void)OnEvent:(ITMG_MAIN_EVENT_TYPE)eventType data:(NSDictionary *)data {
    NSString *log = [NSString stringWithFormat:@"OnEvent:%d,data:%@", (int)eventType, data];
    [self showLog:log];
    NSLog(@"====%@====", log);
    switch (eventType) {
    // Step 6/11 : Perform the enter room event
    case ITMG_MAIN_EVENT_TYPE_ENTER_ROOM: {
    int result = ((NSNumber *)[data objectForKey:@"result"]).intValue;
    NSString *error_info = [data objectForKey:@"error_info"];
    
    [self showLog:[NSString stringWithFormat:@"OnEnterRoomComplete:%d msg:(%@)", result, error_info]];
    
    if (result == 0) {
    [self updateStatusEnterRoom:YES];
    }
    }
    break;
    
    }
    
    void TMGTestScene::OnEvent(ITMG_MAIN_EVENT_TYPE eventType,const char* data){
    switch (eventType) {
    case ITMG_MAIN_EVENT_TYPE_ENTER_ROOM:
    {
    ListMicDevices();
    ListSpeakerDevices();
    std::string strText = "EnterRoom complete: ret=";
    strText += data;
    m_EditMonitor.SetWindowText(MByteToWChar(strText).c_str());
    }
    }
    }
    
    Error code
    Error Code Value
    Cause and Suggested Solution
    7006
    Authentication failed. Possible causes:
    The `AppID` does not exist or is incorrect.
    An error occurred while authenticating the `authbuff`.
    Authentication expired.
    The `openId` does not meet the specification.
    7007
    Already in another room.
    1001
    The user was already in the process of entering a room but repeated this operation. It is recommended not to call the room entering API until the room entry callback is returned.
    1003
    The user was already in the room and called the room entering 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.

    2. Turning on or off the microphone

    This API is used to turn on or off the mic. Mic and speaker are not enabled by default after room entry.

    Sample code

    Java
    Object-C
    C++
    //RealTimeVoiceActivity.java
    ITMGContext.GetInstance(this).GetAudioCtrl().EnableMic(true);
    
    //TMGRealTimeViewController.m
    [[[ITMGContext GetInstance] GetAudioCtrl] EnableMic:YES];
    
    ITMGContextGetInstance()->GetAudioCtrl()->EnableMic(true);
    

    3. Turning on or off the speaker

    This API is used to turn on/off the speaker.

    Sample code

    Java
    Object-C
    C++
    //RealTimeVoiceActivity.java
    ITMGContext.GetInstance(this).GetAudioCtrl().EnableSpeaker(true);
    
    //TMGRealTimeViewController.m
    [[[ITMGContext GetInstance] GetAudioCtrl] EnableSpeaker:YES];
    
    ITMGContextGetInstance()->GetAudioCtrl()->EnableSpeaker(true);
    

    4. Exiting the room

    This API is called to exit the current room. It needs to wait for and process the callback for exit.

    Sample code

    Java
    Object-C
    C++
    //RealTimeVoiceActivity.java
    ITMGContext.GetInstance(this).ExitRoom();
    
    //TMGRealTimeViewController.m
    [[ITMGContext GetInstance] ExitRoom];
    
    ITMGContext* context = ITMGContextGetInstance();
    context->ExitRoom();
    

    Callback for room exit

    After the user exits a room, a callback will be returned with the message being ITMG_MAIN_EVENT_TYPE_EXIT_ROOM. The sample code is shown below:
    Java
    Object-C
    C++
    //RealTimeVoiceActivity.java
    public void OnEvent(ITMGContext.ITMG_MAIN_EVENT_TYPE type, Intent data) {
    if (ITMGContext.ITMG_MAIN_EVENT_TYPE.ITMG_MAIN_EVENT_TYPE_EXIT_ROOM == type)
    {
    // Receive the event of successful room exit
    }
    }
    
    //TMGRealTimeViewController.m
    -(void)OnEvent:(ITMG_MAIN_EVENT_TYPE)eventType data:(NSDictionary *)data{
    NSLog(@"OnEvent:%lu,data:%@",(unsigned long)eventType,data);
    switch (eventType) {
    case ITMG_MAIN_EVENT_TYPE_EXIT_ROOM:
    {
    // Receive the event of successful room exit
    }
    break;
    }
    }
    
    void TMGTestScene::OnEvent(ITMG_MAIN_EVENT_TYPE eventType,const char* data){
    switch (eventType) {
    case ITMG_MAIN_EVENT_TYPE_EXIT_ROOM:
    {
    // Process
    break;
    }
    }
    }
    

    Voice Message Access

    1. Initializing authentication

    Call authentication initialization after initializing the SDK. For more information on how to get the authBuffer, please see genAuthBuffer (the voice chat authentication information API).

    API prototype

    Java
    Object-C
    C++
    public abstract int ApplyPTTAuthbuffer(byte[] authBuffer);
    
    -(QAVResult)ApplyPTTAuthbuffer:(NSData *)authBuffer;
    
    ITMGPTT virtual int ApplyPTTAuthbuffer(const char* authBuffer, int authBufferLen)
    
    Parameter
    Type
    Description
    authBuffer
    String
    Authentication

    Sample code

    Java
    Object-C
    C++
    //VoiceMessageRecognitionActivity.java
    byte[] authBuffer = GMEAuthBufferHelper.getInstance().createAuthBuffer("");
    ITMGContext.GetInstance(this).GetPTT().ApplyPTTAuthbuffer(authBuffer);
    
    //TMGPTTViewController.m
    NSData* authBuffer = [QAVAuthBuffer GenAuthBuffer:(unsigned int)SDKAPPID3RD.integerValue roomID:nil openID:self.openId key:AUTHKEY];
    [[[ITMGContext GetInstance] GetPTT] ApplyPTTAuthbuffer:authBuffer];
    
    ITMGContextGetInstance()->GetPTT()->ApplyPTTAuthbuffer(authBuffer,authBufferLen);
    

    2. Starting streaming speech recognition

    This API is used to start streaming speech recognition. Text obtained from speech-to-text conversion will be returned in real time in its callback. To stop recording, call StopRecording. The callback will be returned after the recording is stopped.

    API prototype

    Java
    Object-C
    C++
    public abstract int StartRecordingWithStreamingRecognition (String filePath);
    
    public abstract int StopRecording();
    
    -(int)StartRecordingWithStreamingRecognition:(NSString *)filePath;
    
    -(QAVResult)StopRecording;
    
    ITMGPTT virtual int StartRecordingWithStreamingRecognition(const char* filePath)
    
    ITMGPTT virtual int StopRecording()
    
    Parameter
    Type
    Description
    filePath
    String
    Path of stored audio file

    Sample code

    Java
    Object-C
    C++
    //VoiceMessageRecognitionActivity.java
    ITMGContext.GetInstance(this).GetPTT().StartRecordingWithStreamingRecognition(recordfilePath);
    
    //TMGPTTViewController.m
    QAVResult ret = [[[ITMGContext GetInstance] GetPTT] StartRecordingWithStreamingRecognition:[self pttTestPath]];
    if (ret == 0) {
    self.currentStatus = @"Start streaming recording";
    } else {
    self.currentStatus = @"Failed to start streaming recording";
    }
    
    ITMGContextGetInstance()->GetPTT()->StartRecordingWithStreamingRecognition(filePath);
    

    Callback for streaming speech recognition

    After streaming speech recognition is started, you need to listen for callback messages in the callback function onEvent. The event message is ITMG_MAIN_EVNET_TYPE_PTT_STREAMINGRECOGNITION_COMPLETE, namely returns text after the recording is stopped and the recognition is completed, which is equivalent to returning the recognized text after a paragraph of speech.
    The event message will be identified in the OnEvent function based on the actual needs. The passed parameters include the following four messages.
    Message Name
    Description
    result
    A return code for judging whether the streaming speech recognition is successful.
    text
    Text converted from speech
    file_path
    Local path of stored recording file
    file_id
    Backend URL address of recording file, which will be retained for 90 days
    Sample code
    Java
    Object-C
    C++
    //VoiceMessageRecognitionActivity.java
    import static com.tencent.TMG.ITMGContext.ITMG_MAIN_EVENT_TYPE.ITMG_MAIN_EVNET_TYPE_PTT_STREAMINGRECOGNITION_COMPLETE;
    public void OnEvent(ITMGContext.ITMG_MAIN_EVENT_TYPE type, Intent data) {
    if (type == ITMG_MAIN_EVNET_TYPE_PTT_STREAMINGRECOGNITION_COMPLETE)
    {
    // Step 1.3/3 handle ITMG_MAIN_EVNET_TYPE_PTT_STREAMINGRECOGNITION_COMPLETE event
    mIsRecording = false;
    if (nErrCode ==0)
    {
    String recordfilePath = data.getStringExtra("file_path");
    mRecFilePathView.setText(recordfilePath);
    
    String recordFileUrl = data.getStringExtra("file_id");
    mRecFileUrlView.setText(recordFileUrl);
    }
    else
    {
    appendLog2MonitorView("Record and recognition fail errCode:" + nErrCode);
    }
    }
    
    }
    
    //TMGPTTViewController.m
    
    - (void)OnEvent:(ITMG_MAIN_EVENT_TYPE)eventType data:(NSDictionary*)data
    {
    NSNumber *number = [data objectForKey:@"result"];
    switch (eventType)
    {
    case ITMG_MAIN_EVNET_TYPE_PTT_STREAMINGRECOGNITION_COMPLETE:
    {
    if (data != NULL &&[[data objectForKey:@"result"] intValue]== 0)
    {
    self.translateTF.text = [data objectForKey:@"text"] ;
    self.currentStatus = @"Streaming conversion completed";
    }
    }
    break;
    }
    
    void TMGTestScene::OnEvent(ITMG_MAIN_EVENT_TYPE eventType,const char* data){
    switch (eventType) {
    case ITMG_MAIN_EVNET_TYPE_PTT_STREAMINGRECOGNITION_COMPLETE:
    {
    HandleSTREAM2TEXTComplete(data,true);
    break;
    }
    ...
    case ITMG_MAIN_EVNET_TYPE_PTT_STREAMINGRECOGNITION_IS_RUNNING:
    {
    HandleSTREAM2TEXTComplete(data, false);
    break;
    }
    }
    }
    void CTMGSDK_For_AudioDlg::HandleSTREAM2TEXTComplete(const char* data, bool isComplete)
    {
    std::string strText = "STREAM2TEXT: ret=";
    strText += data;
    m_EditMonitor.SetWindowText(MByteToWChar(strText).c_str());
    Json::Reader reader;
    Json::Value root;
    bool parseRet = reader.parse(data, root);
    if (!parseRet) {
    ::SetWindowText(m_EditInfo.GetSafeHwnd(),MByteToWChar(std::string("parse result Json error")).c_str());
    }
    else
    {
    if (isComplete) {
    ::SetWindowText(m_EditUpload.GetSafeHwnd(), MByteToWChar(root["file_id"].asString()).c_str());
    }
    else {
    std::string isruning = "STREAMINGRECOGNITION_IS_RUNNING";
    ::SetWindowText(m_EditUpload.GetSafeHwnd(), MByteToWChar(isruning).c_str());
    }
    }
    }
    
    Error code
    Error Code
    Description
    Suggested Solution
    32775
    Streaming speech-to-text conversion failed, but recording succeeded.
    Call the `UploadRecordedFile` API to upload the recording file and then call the `SpeechToText` API to perform speech-to-text conversion.
    32777
    Streaming speech-to-text converting failed, but recording and upload succeeded
    The message returned contains a backend URL after successful upload. Call the `SpeechToText` API to perform speech-to-text conversion.
    32786
    Streaming speech-to-text conversion failed.
    During streaming recording, wait for the execution result of the streaming recording API to return.

    3. Stopping recording

    This API is used to stop recording. It is async, and a callback for recording completion will be returned after recording stops. A recording file will be available only after recording succeeds.

    API prototype

    Java
    Object-C
    C++
    public abstract int StopRecording();
    
    -(QAVResult)StopRecording;
    
    ITMGPTT virtual int StopRecording();
    

    Sample code

    Java
    Object-C
    C++
    //VoiceMessageRecognitionActivity.java
    ITMGContext.GetInstance(this).GetPTT().StopRecording();
    
    //TMGPTTViewController.m
    
    - (void)stopRecClick {
    // Step 3/12 stop recording, need handle ITMG_MAIN_EVNET_TYPE_PTT_RECORD_COMPLETE event
    // https://www.tencentcloud.com/document/product/607/15221
    QAVResult ret = [[[ITMGContext GetInstance] GetPTT] StopRecording];
    if (ret == 0) {
    self.currentStatus = @"Stop recording";
    } else {
    self.currentStatus = @"Failed to stop recording";
    }
    }
    
    ITMGContextGetInstance()->GetPTT()->StopRecording();
    
    
    Contact Us

    Contact our sales team or business advisors to help your business.

    Technical Support

    Open a ticket if you're looking for further assistance. Our Ticket is 7x24 avaliable.

    7x24 Phone Support