서버시간과 상관없이 cron instance만들때 한국시간 기준으로 동작하게
parent
d2bac81363
commit
8f066c0814
@ -1,727 +0,0 @@
|
||||
//go:build !test
|
||||
// +build !test
|
||||
|
||||
// for STT SELVAS STT
|
||||
package stt
|
||||
|
||||
/*
|
||||
#cgo LDFLAGS: -lstdc++ -ldl ./extlib/selvasstt/SDK/LIB/c_linux/x64/libASRLIB.a ./extlib/selvasstt/SDK/OpenSSL/Linux/Linux_x64/libssl.a ./extlib/selvasstt/SDK/OpenSSL/Linux/Linux_x64/libcrypto.a
|
||||
#cgo CFLAGS: -I ../extlib/selvasstt/SDK/INCLUDE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <Lvcsr_Api.h>
|
||||
|
||||
char* getResultData(LVCSR_DATA_RESULT* pDataResult, long long nCount) {
|
||||
char* skip1 = "<eps>";
|
||||
char* space = " ";
|
||||
int len = 0;
|
||||
long long i;
|
||||
|
||||
for (i = 0; i < nCount; i++) {
|
||||
len += strlen(pDataResult[i].pTokenStr) + 1;
|
||||
printf("start: %ld, end: %ld\n", pDataResult[i].nStart, pDataResult[i].nEnd);
|
||||
}
|
||||
|
||||
char* result = malloc(sizeof(char) * len);
|
||||
strcpy(result, "");
|
||||
|
||||
for (i = 0; i < nCount; i++) {
|
||||
if (strcmp(pDataResult[i].pTokenStr,skip1) == 0) {
|
||||
} else {
|
||||
strcat(result, space);
|
||||
strcat(result, pDataResult[i].pTokenStr);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void freeResult(char* result){
|
||||
if(result == NULL) {
|
||||
return;
|
||||
}
|
||||
free(result);
|
||||
}
|
||||
|
||||
int getMidResultEPD(LVCSR_RECOG_MID_RESULT *midResult){
|
||||
return midResult->bEngineDetectionFlag;
|
||||
}
|
||||
|
||||
void printMidResult(LVCSR_RECOG_MID_RESULT *midResult){
|
||||
printf("result len : %ld\n", midResult->nResultLen);
|
||||
printf("pResult : %s\n", midResult->pResult);
|
||||
printf("flag : %d\n", midResult->bEngineDetectionFlag);
|
||||
printf("count: %ld\n\n", midResult->nCount);
|
||||
}
|
||||
|
||||
void setSid(LVCSR_DATA_LOGINFO *logInfo, char* sid, int size) {
|
||||
// memset(logInfo.tloItemSId, 0, 51);
|
||||
// memcpy(logInfo.tloItemSId, sid, size);
|
||||
sprintf(logInfo->tloItemSId, "%s", sid);
|
||||
// printf("logInfo.tloItemSId-%s\n ", logInfo.tloItemSId);
|
||||
}
|
||||
|
||||
void setCallId(LVCSR_DATA_LOGINFO *logInfo, char* callId, int size) {
|
||||
// memset(logInfo.tloItemCallId, 0, 61);
|
||||
// memcpy(logInfo.tloItemCallId, callId, size);
|
||||
sprintf(logInfo->tloItemCallId, "%s", callId);
|
||||
// printf("logInfo.tloItemCallId-%s\n ", logInfo.tloItemSId);
|
||||
}
|
||||
|
||||
void setTrId(LVCSR_DATA_LOGINFO *logInfo, char* trId, int size) {
|
||||
// memset(logInfo.tloItemTransactionId, 0, 101);
|
||||
// memcpy(logInfo.tloItemTransactionId, trId, size);
|
||||
sprintf(logInfo->tloItemTransactionId, "%s", trId);
|
||||
// printf("logInfo.tloItemTransactionId-%s\n ", logInfo.tloItemTransactionId);
|
||||
}
|
||||
|
||||
void setItemStartMessage(LVCSR_DATA_LOGINFO *logInfo, char* tloTime, int size) {
|
||||
// memset(logInfo.tloItemStartMessage, 0, 101);
|
||||
// memcpy(logInfo.tloItemStartMessage, trId, size);
|
||||
sprintf(logInfo->tloItemStartMessage, "%s", tloTime);
|
||||
// printf("logInfo.tloItemStartMessage-%s\n ", logInfo.tloItemStartMessage);
|
||||
}
|
||||
|
||||
long getSTTSockID(LVCSR_SOCK_HEAD sockhead) {
|
||||
return sockhead.uSock;
|
||||
}
|
||||
|
||||
*/
|
||||
import "C"
|
||||
import (
|
||||
"fmt"
|
||||
"mybatch/icserror"
|
||||
"mybatch/icslog"
|
||||
"runtime/debug"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
"unsafe"
|
||||
|
||||
// "git.icomsys.co.kr/icomsys/voicegateway/voiceagent/icsconf"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
const (
|
||||
CONNECT_TIMEOUT = 3
|
||||
READ_CONNECT_TIMEOUT = 5
|
||||
READ_CONNECT_TIMEOUT_LONGVOICE = 10
|
||||
|
||||
// model Info
|
||||
MODEL_ID = 0
|
||||
KWD_ID = -1
|
||||
CODEC_TYPE = 0 // 8k
|
||||
LANGUAGE = 1 // utf-8
|
||||
USED_EPD = 1 // epd used
|
||||
NO_USED_EPD = 0 // epd used
|
||||
//USED_EPD = 1 // epd used
|
||||
USED_SCORE = 0 // used off
|
||||
)
|
||||
|
||||
type STTSelvas struct {
|
||||
sessionID int
|
||||
//handle int
|
||||
authCode string
|
||||
//ch int
|
||||
sttID C.long
|
||||
text string
|
||||
voiceBuf []byte
|
||||
voiceBufCur int64
|
||||
silencenum int
|
||||
validnum int64 //rms counter
|
||||
uDataSize int
|
||||
uEndOfSpeech int
|
||||
STTInfo STTInfo
|
||||
IsClose bool
|
||||
SpeechStatus int
|
||||
RecordFilePath string
|
||||
RecordStart *bool
|
||||
rrData *RRData
|
||||
M *sync.Mutex
|
||||
txNum int //number of sending stt audio packet
|
||||
callID string
|
||||
custID string
|
||||
sreserved string
|
||||
trid string
|
||||
errCode string
|
||||
errFunName string
|
||||
errMsg string
|
||||
result string
|
||||
reqTime time.Time
|
||||
rspTime time.Time
|
||||
svcReqTime time.Time
|
||||
svcRspTime time.Time
|
||||
sttcount int
|
||||
sttStatus int
|
||||
//icsstat.StatInfos
|
||||
language string
|
||||
}
|
||||
|
||||
type STTInfo struct {
|
||||
LVCSR_SOCK_HEAD C.LVCSR_SOCK_HEAD
|
||||
LVCSR_EPD_INFO C.LVCSR_EPD_INFO
|
||||
LVCSR_DATA_AUTHENTICATION C.LVCSR_DATA_AUTHENTICATION
|
||||
LVCSR_RECOG_RESULT C.LVCSR_RECOG_RESULT
|
||||
LVCSR_DATA_RESULT C.LVCSR_DATA_RESULT
|
||||
LVCSR_RECOG_MID_RESULT C.LVCSR_RECOG_MID_RESULT
|
||||
LVCSR_DATA_INFO C.LVCSR_DATA_INFO
|
||||
LVCSR_DATA_LOGINFO C.LVCSR_DATA_LOGINFO
|
||||
LVCSR_ERROR_RESULT C.LVCSR_ERROR_RESULT
|
||||
}
|
||||
|
||||
type STTSResult struct {
|
||||
result string
|
||||
error *icserror.IcsError
|
||||
}
|
||||
type NewSTTResult struct {
|
||||
Res string
|
||||
NStart int
|
||||
NEnd int
|
||||
}
|
||||
|
||||
func (s STTSelvas) GetTrID() string {
|
||||
return s.trid
|
||||
}
|
||||
|
||||
// connect SELVAS STT Server
|
||||
func NewSTTS(IP string, port int, callID string, custID string, filePath string) (*STTSelvas, *icserror.IcsError) {
|
||||
//func NewSTTS(sid int, IP string, port int, callID string, custID string, filePath string, sreserved string, statOK bool) (*STTSelvas, *icserror.IcsError) {
|
||||
l := icslog.InitializeLogger()
|
||||
var derr *icserror.IcsError = nil
|
||||
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
switch v := err.(type) {
|
||||
case error:
|
||||
icserror.ICSERRSTTFailInit.SetError(v)
|
||||
l.Printf("PANIC! %s\n%s", icserror.ICSERRSTTFailInit.GetError().Error(), string(debug.Stack()))
|
||||
default:
|
||||
l.Print(icserror.ICSERRSTTFailInit.GetError().Error())
|
||||
}
|
||||
}
|
||||
derr = icserror.ICSERRSTTFailInit
|
||||
}()
|
||||
|
||||
if len(IP) <= 0 || port <= 0 {
|
||||
derr = icserror.ICSERRInvalidParam
|
||||
return nil, derr
|
||||
}
|
||||
|
||||
stts := STTSelvas{authCode: "LGUPlusManager", uDataSize: 1600, uEndOfSpeech: 0, IsClose: false, SpeechStatus: 0, reqTime: time.Now(), svcReqTime: time.Time{}, svcRspTime: time.Time{}, callID: callID, custID: custID, result: "", errCode: "", errMsg: "", errFunName: ""}
|
||||
//stts := STTSelvas{handle: -1, authCode: "LGUPlusManager", uDataSize: 1600, uEndOfSpeech: 0, IsClose: false}
|
||||
|
||||
stts.M = &sync.Mutex{}
|
||||
stts.txNum = 0
|
||||
|
||||
//recording
|
||||
stts.RecordFilePath = filePath
|
||||
stts.RecordStart = new(bool)
|
||||
*stts.RecordStart = false
|
||||
stts.rrData = NewRRData(960000) //60sec
|
||||
|
||||
csIP := C.CString(IP)
|
||||
defer C.free(unsafe.Pointer(csIP))
|
||||
csPort := C.long(port)
|
||||
csConTimeout := C.long(CONNECT_TIMEOUT)
|
||||
csReadTimeout := C.long(READ_CONNECT_TIMEOUT)
|
||||
|
||||
// 셀바스 API는 현재 통합통계가 있어야 동작을함
|
||||
trID := uuid.New().String()
|
||||
trID = strings.ReplaceAll(trID, "-", "a")
|
||||
stts.trid = trID
|
||||
|
||||
/*
|
||||
if stts.sttStatus == STTMemo {
|
||||
return &stts, nil
|
||||
}
|
||||
*/
|
||||
|
||||
//svcReqTime := time.Now()
|
||||
l.Printf("STT ASR_SVC_OPEN Start")
|
||||
rc := C.ASR_SVC_OPEN(csIP, csPort, csConTimeout, csReadTimeout, &stts.STTInfo.LVCSR_SOCK_HEAD) // add LVCSR_SOCK_HEAD
|
||||
if int(rc) == -1 {
|
||||
////////////////테스트코드/////////////////////
|
||||
rc = C.ASR_SVC_GET_ERROR(&stts.STTInfo.LVCSR_SOCK_HEAD, &stts.STTInfo.LVCSR_ERROR_RESULT)
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d] ASR_SVC_GET_ERROR Fail.. %d", int(stts.sttID), rc)
|
||||
// return "", derr
|
||||
} else {
|
||||
l.Printf("[%d] LVCSR_ERROR_RESULT - [%d]%s", int(stts.sttID), stts.STTInfo.LVCSR_ERROR_RESULT.nErrorCode, C.GoString(&stts.STTInfo.LVCSR_ERROR_RESULT.pErrorMsg[0]))
|
||||
}
|
||||
l.Printf("STT ASR_SVC_OPEN Fail - rc:%d", rc)
|
||||
derr = icserror.ICSERRSTTConnectTimeout
|
||||
return nil, derr
|
||||
} else if int(rc) == -2 {
|
||||
l.Printf("STT ASR_SVC_OPEN Fail - rc:%d", rc)
|
||||
////////////////테스트코드/////////////////////
|
||||
rc = C.ASR_SVC_GET_ERROR(&stts.STTInfo.LVCSR_SOCK_HEAD, &stts.STTInfo.LVCSR_ERROR_RESULT)
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d] ASR_SVC_GET_ERROR Fail.. %d", int(stts.sttID), rc)
|
||||
// return "", derr
|
||||
} else {
|
||||
l.Printf("[%d] LVCSR_ERROR_RESULT - [%d]%s ", int(stts.sttID), stts.STTInfo.LVCSR_ERROR_RESULT.nErrorCode, C.GoString(&stts.STTInfo.LVCSR_ERROR_RESULT.pErrorMsg[0]))
|
||||
}
|
||||
///////////////////////////////////////////////
|
||||
derr = icserror.ICSERRSTTFailInit
|
||||
return nil, derr
|
||||
}
|
||||
// 통합통계
|
||||
now := time.Now()
|
||||
tloTime := fmt.Sprintf("%d%02d%02d%02d%02d%02d", now.Year(), int(now.Month()), now.Day(), now.Hour(), now.Minute(), now.Minute())
|
||||
csTrId := C.CString(trID)
|
||||
defer C.free(unsafe.Pointer(csTrId))
|
||||
csCallId := C.CString(callID)
|
||||
defer C.free(unsafe.Pointer(csCallId))
|
||||
csTloTime := C.CString(tloTime)
|
||||
defer C.free(unsafe.Pointer(csTloTime))
|
||||
csCustID := C.CString(custID)
|
||||
defer C.free(unsafe.Pointer(csCustID))
|
||||
|
||||
C.setSid(&stts.STTInfo.LVCSR_DATA_LOGINFO, csCustID, C.int(len(custID)))
|
||||
C.setCallId(&stts.STTInfo.LVCSR_DATA_LOGINFO, csCallId, C.int(len(callID)))
|
||||
C.setTrId(&stts.STTInfo.LVCSR_DATA_LOGINFO, csTrId, C.int(len(trID)))
|
||||
C.setItemStartMessage(&stts.STTInfo.LVCSR_DATA_LOGINFO, csTloTime, C.int(len(tloTime)))
|
||||
|
||||
l.Printf("[%d] SET ASR_SVC_SET_LOGINFO > trID:%s, callID:%s, tloTime:%+v, custID:%s", int(stts.sttID), trID, callID, tloTime, custID)
|
||||
//svcReqTime = time.Now()
|
||||
rs := C.ASR_SVC_SET_LOGINFO(&stts.STTInfo.LVCSR_SOCK_HEAD, &stts.STTInfo.LVCSR_DATA_LOGINFO) // 통합통계 설정
|
||||
//ljhwan
|
||||
//rs = 0
|
||||
if int(rs) < 0 {
|
||||
l.Printf("[%d] STT ASR_SVC_SET_LOGINFO Fail Result rs:%d, LVCSR_DATA_LOGINFO: %+v", int(stts.sttID), rs, stts.STTInfo.LVCSR_DATA_LOGINFO)
|
||||
////////////////테스트코드/////////////////////
|
||||
rc = C.ASR_SVC_GET_ERROR(&stts.STTInfo.LVCSR_SOCK_HEAD, &stts.STTInfo.LVCSR_ERROR_RESULT)
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d] ASR_SVC_GET_ERROR Fail..", int(stts.sttID))
|
||||
// return "", derr
|
||||
} else {
|
||||
l.Printf("[%d] LVCSR_ERROR_RESULT - [%d]%s", int(stts.sttID), stts.STTInfo.LVCSR_ERROR_RESULT.nErrorCode, C.GoString(&stts.STTInfo.LVCSR_ERROR_RESULT.pErrorMsg[0]))
|
||||
}
|
||||
///////////////////////////////////////////////
|
||||
|
||||
// Server Close
|
||||
//svcReqTime = time.Now()
|
||||
l.Printf("[%d] STT ASR_SVC_CLOS Start", int(stts.sttID))
|
||||
rc = C.ASR_SVC_CLOS(&stts.STTInfo.LVCSR_SOCK_HEAD)
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d] STT ASR_SVC_CLOS Fail Result rs:%d", int(stts.sttID), rs)
|
||||
|
||||
derr = icserror.ICSERRSTTFailInit
|
||||
return nil, derr
|
||||
}
|
||||
|
||||
derr = icserror.ICSERRSTTFailInit
|
||||
return nil, derr
|
||||
}
|
||||
|
||||
// Channel Connect
|
||||
//svcReqTime = time.Now()
|
||||
l.Printf("[%d] STT ASR_SVC_RECG_OPEN Start", int(stts.sttID))
|
||||
rc = C.ASR_SVC_RECG_OPEN(&stts.STTInfo.LVCSR_SOCK_HEAD) // add LVCSR_SOCK_HEAD
|
||||
//ljhwan
|
||||
//rc = 0
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d] STT ASR_SVC_RECG_OPEN Fail, LVCSR_SOCK_HEAD: %+v\r\n", int(stts.sttID), stts.STTInfo.LVCSR_SOCK_HEAD)
|
||||
// Server Close
|
||||
//svcReqTime = time.Now()
|
||||
l.Printf("[%d] STT ASR_SVC_CLOS Start", int(stts.sttID))
|
||||
rc = C.ASR_SVC_CLOS(&stts.STTInfo.LVCSR_SOCK_HEAD)
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d]STT ASR_SVC_CLOS Fail Result rs:%d, LVCSR_SOCK_HEAD: %+v", int(stts.sttID), rs, stts.STTInfo.LVCSR_SOCK_HEAD)
|
||||
|
||||
derr = icserror.ICSERRSTTFailInit
|
||||
return nil, derr
|
||||
}
|
||||
|
||||
derr = icserror.ICSERRSTTFailInit
|
||||
return nil, derr
|
||||
}
|
||||
|
||||
// Set Model List
|
||||
stts.STTInfo.LVCSR_DATA_INFO.nModelId = MODEL_ID
|
||||
stts.STTInfo.LVCSR_DATA_INFO.nKwdId = KWD_ID
|
||||
stts.STTInfo.LVCSR_DATA_INFO.nCodecType = CODEC_TYPE
|
||||
stts.STTInfo.LVCSR_DATA_INFO.nCharSet = LANGUAGE
|
||||
// if stts.sttStatus == STTMemo {
|
||||
// stts.STTInfo.LVCSR_DATA_INFO.bEpdUsed = NO_USED_EPD
|
||||
// } else {
|
||||
// stts.STTInfo.LVCSR_DATA_INFO.bEpdUsed = USED_EPD
|
||||
// }
|
||||
stts.STTInfo.LVCSR_DATA_INFO.bScoreUsed = USED_SCORE
|
||||
|
||||
//svcReqTime = time.Now()
|
||||
rc = C.ASR_SVC_RECG_SET_LIST(&stts.STTInfo.LVCSR_SOCK_HEAD, &stts.STTInfo.LVCSR_DATA_INFO)
|
||||
//ljhwan
|
||||
//rc = 0
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d]STT ASR_SVC_RECG_SET_LIST Fail Result rs:%d, LVCSR_SOCK_HEAD: %+v, stts.STTInfo.LVCSR_DATA_INFO: %+v", int(stts.sttID), rs, stts.STTInfo.LVCSR_SOCK_HEAD, stts.STTInfo.LVCSR_DATA_INFO)
|
||||
|
||||
// Channel Connection Close
|
||||
//svcReqTime = time.Now()
|
||||
l.Printf("[%d]STT ASR_SVC_RECG_CLOS Start", int(stts.sttID))
|
||||
rc = C.ASR_SVC_RECG_CLOS(&stts.STTInfo.LVCSR_SOCK_HEAD)
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d]STT ASR_SVC_RECG_CLOS Fail Result rs:%d, LVCSR_SOCK_HEAD: %+v", int(stts.sttID), rs, stts.STTInfo.LVCSR_SOCK_HEAD)
|
||||
derr = icserror.ICSERRTTSNotInit
|
||||
}
|
||||
|
||||
// Server Close
|
||||
l.Printf("[%d]STT ASR_SVC_CLOS Start", int(stts.sttID))
|
||||
//svcReqTime = time.Now()
|
||||
rc = C.ASR_SVC_CLOS(&stts.STTInfo.LVCSR_SOCK_HEAD)
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d]STT ASR_SVC_CLOS Fail Result rs:%d, LVCSR_SOCK_HEAD: %+v", int(stts.sttID), rs, stts.STTInfo.LVCSR_SOCK_HEAD)
|
||||
derr = icserror.ICSERRSTTFailInit
|
||||
return nil, derr
|
||||
}
|
||||
derr = icserror.ICSERRSTTFailInit
|
||||
return nil, derr
|
||||
}
|
||||
|
||||
l.Printf("[%d]Selvas STT New Connection > callID:'%s',trID:'%s'", int(stts.sttID), callID, trID)
|
||||
// fmt.Println("STT: Selvas STT New Connection")
|
||||
|
||||
return &stts, derr
|
||||
}
|
||||
|
||||
func (s *STTSelvas) Close(save bool) (string, string, *icserror.IcsError) {
|
||||
if s == nil {
|
||||
return "", "", icserror.ICSERRSTTNotInit
|
||||
}
|
||||
|
||||
l := icslog.InitializeLogger()
|
||||
// conf := icsconf.GetIcsConfig()
|
||||
var derr *icserror.IcsError = nil
|
||||
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
switch v := err.(type) {
|
||||
case error:
|
||||
icserror.ICSERRSTTFailInit.SetError(v)
|
||||
l.Printf("PANIC! %s\n%s", icserror.ICSERRSTTFailInit.GetError().Error(), string(debug.Stack()))
|
||||
default:
|
||||
l.Print(icserror.ICSERRSTTFailInit.GetError().Error())
|
||||
}
|
||||
derr = icserror.ICSERRSTTFailInit
|
||||
return
|
||||
}
|
||||
// derr = icserror.ICSERRSTTFailInit
|
||||
}()
|
||||
|
||||
//l.Printf(icslog.LOG_LEVEL_WARN, s.sessionID, "[%d]STT CLOSE : %s", int(s.sttID), string(debug.Stack()))
|
||||
l.Printf("Close STT[%d]. Send Audio Packet Num: %d", int(s.sttID), s.txNum)
|
||||
/*
|
||||
if s.handle < 0 || s.ch < 0 {
|
||||
fmt.Println("selvas stt", s.ch)
|
||||
return icserror.ICSERRSTTNotInit
|
||||
}
|
||||
*/
|
||||
|
||||
s.M.Lock()
|
||||
s.IsClose = true
|
||||
s.M.Unlock()
|
||||
|
||||
var localPath, URL string
|
||||
|
||||
if *s.RecordStart {
|
||||
if save {
|
||||
// aud := s.rrData.GetAudio()
|
||||
// audLen := len(aud)
|
||||
|
||||
// 여기 수정해야함
|
||||
|
||||
// path, ymd, serr := icsutil.Save(aud, s.RecordFilePath, conf.AppInfo.VoiceConfig.Path, true)
|
||||
// //path, ymd := Save(s.rrData.GetAudio(), s.RecordFilePath, conf.VoiceConfig.Path, true)
|
||||
// if serr == nil {
|
||||
// if len(path) == 0 {
|
||||
// l.Printf(icslog.LOG_LEVEL_WARN, s.sessionID, "[%d]Failed to save STT voice : %s", int(s.sttID), s.RecordFilePath)
|
||||
// } else {
|
||||
// localPath = path
|
||||
// URL = fmt.Sprintf("%s%s/%s.wav", conf.AppInfo.VoiceConfig.HTTPPath, ymd, s.RecordFilePath)
|
||||
// s.RecordFilePath = ""
|
||||
// l.Printf(icslog.LOG_LEVEL_INFO, s.sessionID, "[%d]Saved STT voice(%d). path: %s, URL: %s", int(s.sttID), audLen, localPath, URL)
|
||||
// }
|
||||
// } else {
|
||||
// l.Printf(icslog.LOG_LEVEL_WARN, s.sessionID, "[%d]Failed to save STT voice(%d) : %s, %s - %s", int(s.sttID), audLen, s.RecordFilePath, conf.AppInfo.VoiceConfig.Path, serr.GetMessage())
|
||||
// }
|
||||
}
|
||||
}
|
||||
*s.RecordStart = false
|
||||
|
||||
// l.Printf(icslog.LOG_LEVEL_DEBUG2, s.sessionID, "[%d]STT ASR_SVC_RECG_CLOS. sock header: %+v", int(s.sttID), s.STTInfo.LVCSR_SOCK_HEAD.uSock)
|
||||
|
||||
//l.Printf(icslog.LOG_LEVEL_INFO, s.sessionID, "[%d] s.STTInfo.LVCSR_RECOG_RESULT Start - s.STTInfo.LVCSR_RECOG_RESULT:%+v", int(s.sttID), s.STTInfo.LVCSR_RECOG_RESULT)
|
||||
rc := C.ASR_SVC_RECG_PROC_FREE(&s.STTInfo.LVCSR_RECOG_RESULT)
|
||||
if int(rc) < 0 {
|
||||
l.Printf("Failed to free STT result[%d]. rc: %d", int(s.sttID), rc)
|
||||
if strings.Compare(s.errCode, "54000013") != 0 {
|
||||
s.errCode, s.errMsg, s.errFunName = "54000010", "Fail", "ASR_SVC_RECG_PROC_FREE"
|
||||
}
|
||||
derr = icserror.ICSERRSTTFreeError
|
||||
// s.SendStasticInfo(s.callID, s.custID, s.trid, "STT", "ASR_SVC_RECG_PROC_FREE", "54000001", "Fail", "", "", s.reqTime, time.Now(), s.sreserved, svcReqTime, time.Now())
|
||||
}
|
||||
|
||||
// Channel Connection Close
|
||||
l.Printf("Close STT channel[%d]", int(s.sttID))
|
||||
rc = C.ASR_SVC_RECG_CLOS(&s.STTInfo.LVCSR_SOCK_HEAD)
|
||||
if int(rc) < 0 {
|
||||
l.Printf("Failed to close STT channel[%d], rc: %d", int(s.sttID), rc)
|
||||
if s.result == "$NO_RESULT$" {
|
||||
s.errCode, s.errMsg, s.errFunName = "20000003", "Success", ""
|
||||
} else if strings.Compare(s.errCode, "54000013") != 0 {
|
||||
s.errCode, s.errMsg, s.errFunName = "54000011", "Fail", "ASR_SVC_RECG_CLOS"
|
||||
}
|
||||
derr = icserror.ICSERRTTSNotInit
|
||||
// s.SendStasticInfo(s.callID, s.custID, s.trid, "STT", "ASR_SVC_RECG_CLOS", "54000001", "Fail", "", "", s.reqTime, time.Now(), s.sreserved, svcReqTime, time.Now())
|
||||
}
|
||||
|
||||
// Server Close
|
||||
l.Printf("Close STT SVC[%d]", int(s.sttID))
|
||||
rc = C.ASR_SVC_CLOS(&s.STTInfo.LVCSR_SOCK_HEAD)
|
||||
//ljhwan
|
||||
//rc = 0
|
||||
if int(rc) < 0 {
|
||||
l.Printf("Failed to close STT SVC[%d], rc: %d", int(s.sttID), rc)
|
||||
derr = icserror.ICSERRTTSNotInit
|
||||
if strings.Compare(s.errCode, "54000013") != 0 {
|
||||
s.errCode, s.errMsg, s.errFunName = "54000012", "Fail", "ASR_SVC_CLOS"
|
||||
}
|
||||
// s.SendStasticInfo(s.callID, s.custID, s.trid, "STT", "ASR_SVC_CLOS", "54000001", "Fail", "", "", s.reqTime, time.Now(), s.sreserved, s.svcReqTime, time.Now())
|
||||
// return derr
|
||||
}
|
||||
l.Printf("Closed STT[%d] sock header: %+v", int(s.sttID), s.STTInfo.LVCSR_SOCK_HEAD.uSock)
|
||||
|
||||
s.rrData.Clear()
|
||||
|
||||
l.Printf("Selvas STT Close - %d. %s", s.voiceBufCur, string(debug.Stack()))
|
||||
|
||||
return localPath, URL, derr
|
||||
}
|
||||
|
||||
func (s *STTSelvas) GetSTTStatus() bool {
|
||||
if s == nil {
|
||||
// fmt.Println("get status: stt handle nil")
|
||||
return false
|
||||
}
|
||||
s.M.Lock()
|
||||
b := s.IsClose
|
||||
s.M.Unlock()
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
type AsyncCBFunc func(sttResult string, epd int, inout bool)
|
||||
|
||||
func (s *STTSelvas) SendSTT(voicedata []byte, final bool, cbFunc AsyncCBFunc) (NewSTTResult, *icserror.IcsError) {
|
||||
l := icslog.InitializeLogger()
|
||||
var res NewSTTResult
|
||||
var derr *icserror.IcsError = nil
|
||||
var result string
|
||||
// var sendCount int
|
||||
|
||||
if s == nil {
|
||||
derr = icserror.ICSERRTTSNotInit
|
||||
l.Println("STTSelvas struct is not initialized")
|
||||
return res, derr
|
||||
}
|
||||
|
||||
// // setting the language
|
||||
// cLanguage := C.CString(language)
|
||||
// defer C.free(unsafe.Pointer(cLanguage))
|
||||
// rc := C.ASR_SVC_SET_PARAM(&s.sttInfo.LVCSR_SOCK_HEAD, C.LVCSR_PARAM_TYPE_LANGUAGE, cLanguage)
|
||||
// if rc != 0 {
|
||||
// return "", icserror.ICSERRSTTLanguageSetting
|
||||
// }
|
||||
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
switch v := err.(type) {
|
||||
case error:
|
||||
icserror.ICSERRSTTSendFail.SetError(v)
|
||||
l.Printf("PANIC! %s\n%s", icserror.ICSERRSTTSendFail.GetError().Error(), string(debug.Stack()))
|
||||
default:
|
||||
l.Print(icserror.ICSERRSTTSendFail.GetError().Error())
|
||||
}
|
||||
}
|
||||
derr = icserror.ICSERRSTTSendFail
|
||||
}()
|
||||
|
||||
s.uEndOfSpeech = 1
|
||||
|
||||
//recording audio
|
||||
if *s.RecordStart {
|
||||
s.rrData.AddAudio(voicedata)
|
||||
} else {
|
||||
s.rrData.AddTempAudio(voicedata)
|
||||
}
|
||||
|
||||
csUDataSize := C.long(s.uDataSize)
|
||||
csUEndSpeech := C.long(s.uEndOfSpeech)
|
||||
csBuff := (*C.char)(unsafe.Pointer(&voicedata))
|
||||
//csBuff := (*C.char)(unsafe.Pointer(&buff1[0]))
|
||||
rc := C.ASR_SVC_RECG_DATA(&s.STTInfo.LVCSR_SOCK_HEAD,
|
||||
csBuff,
|
||||
csUDataSize,
|
||||
csUEndSpeech,
|
||||
&s.STTInfo.LVCSR_EPD_INFO)
|
||||
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d] ASR_SVC_RECG_DATA ERROR %d", int(s.sttID), rc)
|
||||
////////////////테스트코드/////////////////////
|
||||
rc = C.ASR_SVC_GET_ERROR(&s.STTInfo.LVCSR_SOCK_HEAD, &s.STTInfo.LVCSR_ERROR_RESULT)
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d] ASR_SVC_GET_ERROR Fail.. %d", int(s.sttID), rc)
|
||||
// return "", derr
|
||||
} else {
|
||||
l.Printf("[%d] LVCSR_ERROR_RESULT - [%d]%s", int(s.sttID), s.STTInfo.LVCSR_ERROR_RESULT.nErrorCode, C.GoString(&s.STTInfo.LVCSR_ERROR_RESULT.pErrorMsg[0]))
|
||||
}
|
||||
///////////////////////////////////////////////
|
||||
|
||||
s.errCode, s.errMsg, s.errFunName = "54000013", "Fail", "ASR_SVC_RECG_DATA"
|
||||
if cbFunc != nil {
|
||||
cbFunc("", 99, true)
|
||||
}
|
||||
derr = icserror.ICSERRSTTSendFail
|
||||
return res, derr
|
||||
}
|
||||
|
||||
s.txNum++
|
||||
|
||||
rc = C.ASR_SVC_RECG_STR_PROC(&s.STTInfo.LVCSR_SOCK_HEAD, &s.STTInfo.LVCSR_RECOG_RESULT)
|
||||
s.svcRspTime = time.Now()
|
||||
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d]!!!! ASR_SVC_RECG_STR_PROC Fail - rc:%d, s.STTInfo.LVCSR_RECOG_RESULT:%+v", int(s.sttID), rc, s.STTInfo.LVCSR_RECOG_RESULT)
|
||||
// s.errCode, s.errMsg, s.errFunName = "54000009", "Fail", "ASR_SVC_RECG_STR_PROC"
|
||||
s.result = "$NO_RESULT$"
|
||||
derr = icserror.ICSERRSTTSendFail
|
||||
if cbFunc != nil {
|
||||
cbFunc("", 2, true)
|
||||
}
|
||||
return res, icserror.ICSERRSTTContinue // 묵음으로 처리
|
||||
}
|
||||
|
||||
result = C.GoString(s.STTInfo.LVCSR_RECOG_RESULT.pResult)
|
||||
l.Printf("STT ID[%d] result: %s, result: %p, pointer: %p", int(s.sttID), result, &result, s.STTInfo.LVCSR_RECOG_RESULT.pResult)
|
||||
results := ""
|
||||
if s.STTInfo.LVCSR_RECOG_RESULT.nResultLen == 0 { // 길이 0일때 값 nil로 나옴
|
||||
result = ""
|
||||
}
|
||||
//result = "TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST"
|
||||
s.result = result
|
||||
results = result
|
||||
if result == "$NO_RESULT$" {
|
||||
results = ""
|
||||
}
|
||||
if cbFunc != nil {
|
||||
cbFunc(results, int(s.STTInfo.LVCSR_EPD_INFO), true)
|
||||
}
|
||||
|
||||
// jiyounc
|
||||
// return "", icserror.ICSERRSTTContinue
|
||||
|
||||
res = NewSTTResult{
|
||||
Res: results,
|
||||
NStart: int(s.STTInfo.LVCSR_DATA_RESULT.nStart),
|
||||
NEnd: int(s.STTInfo.LVCSR_DATA_RESULT.nEnd),
|
||||
}
|
||||
|
||||
return res, nil
|
||||
}
|
||||
|
||||
// result return
|
||||
func NewSTTSResult(result string, err *icserror.IcsError) *STTSResult {
|
||||
return &STTSResult{result, err}
|
||||
}
|
||||
|
||||
// 말을 하지 않았을때 결과 조회
|
||||
func (s *STTSelvas) GetSTTResultToStopSTT() (string, *icserror.IcsError) {
|
||||
l := icslog.InitializeLogger()
|
||||
if s == nil {
|
||||
return "", icserror.ICSERRSTTNotInit
|
||||
}
|
||||
|
||||
l.Printf("[%d] LVCSR_RECOG_RESULT: %+v, LVCSR_RECOG_RESULT:%+v", int(s.sttID), &s.STTInfo.LVCSR_RECOG_RESULT, s.STTInfo.LVCSR_RECOG_RESULT)
|
||||
rc := C.ASR_SVC_RECG_STR_PROC(&s.STTInfo.LVCSR_SOCK_HEAD, &s.STTInfo.LVCSR_RECOG_RESULT)
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d] ASR_SVC_RECG_STR_PROC Fail - rc:%d, s.STTInfo.LVCSR_RECOG_RESULT:%+v", int(s.sttID), rc, s.STTInfo.LVCSR_RECOG_RESULT)
|
||||
s.errCode, s.errMsg, s.errFunName = "54000009", "Fail", "ASR_SVC_RECG_STR_PROC"
|
||||
// s.SendStasticInfo(s.callID, s.custID, s.trid, "STT", "ASR_SVC_RECG_STR_PROC", "54000001", "Fail", "", "", s.reqTime, time.Now(), s.sreserved, svcReqTime, time.Now())
|
||||
return "", icserror.ICSERRSTTSendFail
|
||||
}
|
||||
return "", icserror.ICSERRSTTContinue
|
||||
}
|
||||
|
||||
// epd 1 이후 end 전송 => 결과조회
|
||||
func (s *STTSelvas) SendSTTProcGetResult() (string, *icserror.IcsError) {
|
||||
l := icslog.InitializeLogger()
|
||||
var derr *icserror.IcsError = nil
|
||||
if s == nil {
|
||||
return "", icserror.ICSERRSTTNotInit
|
||||
}
|
||||
|
||||
// buff1 := make([]byte, 0)
|
||||
s.uEndOfSpeech = 1
|
||||
uDataSize := 0
|
||||
csUDataSize := C.long(uDataSize)
|
||||
csUEndSpeech := C.long(s.uEndOfSpeech)
|
||||
// csBuff := nil
|
||||
|
||||
l.Printf("[%d] LVCSR_RECOG_RESULT: %+v, LVCSR_RECOG_RESULT:%+v", int(s.sttID), &s.STTInfo.LVCSR_RECOG_RESULT, s.STTInfo.LVCSR_RECOG_RESULT)
|
||||
// svcReqTime := time.Now()
|
||||
rc := C.ASR_SVC_RECG_DATA(&s.STTInfo.LVCSR_SOCK_HEAD,
|
||||
nil,
|
||||
csUDataSize,
|
||||
csUEndSpeech,
|
||||
&s.STTInfo.LVCSR_EPD_INFO)
|
||||
if int(rc) < 0 {
|
||||
l.Printf("[%d] ASR_SVC_RECG_STR_PROC Fail - rc:%d, s.STTInfo.LVCSR_RECOG_RESULT:%+v", int(s.sttID), rc, s.STTInfo.LVCSR_RECOG_RESULT)
|
||||
derr = icserror.ICSERRSTTSendFail
|
||||
s.errCode, s.errMsg, s.errFunName = "54000009", "Fail", "ASR_SVC_RECG_STR_PROC"
|
||||
// s.SendStasticInfo(s.callID, s.custID, s.trid, "STT", "ASR_SVC_RECG_DATA", "54000001", "Fail", "", "", s.reqTime, time.Now(), s.sreserved, svcReqTime, time.Now())
|
||||
return "", derr
|
||||
}
|
||||
|
||||
s.GetSTTResultToStopSTT()
|
||||
// l.Print(icslog.LOG_LEVEL_INFO, s.sessionID, "Request Recg Result")
|
||||
// rc = C.ASR_SVC_RECG_PROC(&s.STTInfo.LVCSR_SOCK_HEAD, &s.STTInfo.LVCSR_RECOG_RESULT)
|
||||
// if int(rc) < 0 {
|
||||
// derr = icserror.ICSERRSTTFail
|
||||
// return "", derr
|
||||
// }
|
||||
return "", nil
|
||||
}
|
||||
|
||||
func (s STTSelvas) GetAudio() []byte {
|
||||
return s.rrData.GetAudio()
|
||||
}
|
||||
|
||||
func (s STTSelvas) GetReqTime() time.Time {
|
||||
return s.reqTime
|
||||
}
|
||||
|
||||
func (s *STTSelvas) CloseChanelAndServer() (bool, *icserror.IcsError) {
|
||||
// 서버 결과에 사용된 메모리 초기화
|
||||
rc := C.ASR_SVC_RECG_PROC_FREE(&s.STTInfo.LVCSR_RECOG_RESULT)
|
||||
if int(rc) < 0 {
|
||||
l.Println("Error occured while executing ASR_SVC_RECG_PROC_FREE()")
|
||||
return false, icserror.ICSERRSTTConnectCloseFail
|
||||
}
|
||||
// 채널 해제
|
||||
rc = C.ASR_SVC_RECG_CLOS(&s.STTInfo.LVCSR_SOCK_HEAD)
|
||||
if int(rc) < 0 {
|
||||
l.Println("Error occured while executing ASR_SVC_RECG_CLOS()")
|
||||
return false, icserror.ICSERRSTTConnectCloseFail
|
||||
}
|
||||
// stt 서버 종료
|
||||
rc = C.ASR_SVC_CLOS(&s.STTInfo.LVCSR_SOCK_HEAD)
|
||||
if int(rc) < 0 {
|
||||
l.Println("Error occured while executing ASR_SVC_CLOS()")
|
||||
return false, icserror.ICSERRSTTConnectCloseFail
|
||||
}
|
||||
s.rrData.Clear()
|
||||
return true, nil
|
||||
|
||||
}
|
Loading…
Reference in New Issue