let deviceId = "C0310000A57B"
let productKey = "ccvUoJOLbXn"
let secretKey = "nNRjkRpKTxvprGaW"
- let deviceSecret = "LQWKSJTOxUjqJgpxWTzLYDGPdTeFr2hO"
+ let deviceSecret = "UGCJcceIrrETjKCBsE2SijSxFu4cPfmL"
MixSdk.shared.auth.login(productKey: productKey, secretKey: secretKey, deviceId: deviceId, deviceSecrect: deviceSecret){[weak self] isSuccess,error in
self?.view.hideToastActivity()
if let err = error{
181188572C1BE24200C23FAB /* MSStt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 181188562C1BE24200C23FAB /* MSStt.swift */; };
18132AED2C1C1EA8002F6B52 /* MSTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18132AEC2C1C1EA8002F6B52 /* MSTool.swift */; };
18132AEF2C1C25CC002F6B52 /* MSAigc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18132AEE2C1C25CC002F6B52 /* MSAigc.swift */; };
- 18132AF22C1C4938002F6B52 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18132AF12C1C4938002F6B52 /* WebSocket.swift */; };
+ 18132AF22C1C4938002F6B52 /* SwiftWebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18132AF12C1C4938002F6B52 /* SwiftWebSocket.swift */; };
18132AF52C1C4C85002F6B52 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 18132AF42C1C4C85002F6B52 /* libz.tbd */; };
18204BBF2C193E3D00F94E69 /* MixSdk.h in Headers */ = {isa = PBXBuildFile; fileRef = 18204BBE2C193E3D00F94E69 /* MixSdk.h */; settings = {ATTRIBUTES = (Public, ); }; };
18204BC62C193E4B00F94E69 /* MSAuth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18204BC52C193E4B00F94E69 /* MSAuth.swift */; };
18C42C682C242203000D8860 /* libswscale.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 18C42BE62C242202000D8860 /* libswscale.a */; };
18C42C6F2C2422C2000D8860 /* AiAudioDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C42C6B2C2422C2000D8860 /* AiAudioDecoder.m */; };
18C42C702C2422C2000D8860 /* AiAudioDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 18C42C6C2C2422C2000D8860 /* AiAudioDecoder.h */; };
- 18C42C742C242361000D8860 /* TestManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18C42C722C242361000D8860 /* TestManager.h */; };
- 18C42C752C242361000D8860 /* TestManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C42C732C242361000D8860 /* TestManager.m */; };
18C42C782C24241A000D8860 /* MixSdk-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = 18C42C762C24241A000D8860 /* MixSdk-Bridging-Header.h */; };
18C42C7B2C24270D000D8860 /* MSAudioConvert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C42C7A2C24270D000D8860 /* MSAudioConvert.swift */; };
18C42C7D2C242A40000D8860 /* liblzma.5.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 18C42C7C2C242A40000D8860 /* liblzma.5.tbd */; };
181188562C1BE24200C23FAB /* MSStt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MSStt.swift; sourceTree = "<group>"; };
18132AEC2C1C1EA8002F6B52 /* MSTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MSTool.swift; sourceTree = "<group>"; };
18132AEE2C1C25CC002F6B52 /* MSAigc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MSAigc.swift; sourceTree = "<group>"; };
- 18132AF12C1C4938002F6B52 /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebSocket.swift; sourceTree = "<group>"; };
+ 18132AF12C1C4938002F6B52 /* SwiftWebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftWebSocket.swift; sourceTree = "<group>"; };
18132AF42C1C4C85002F6B52 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk/usr/lib/libz.tbd; sourceTree = DEVELOPER_DIR; };
18204BBB2C193E3D00F94E69 /* MixSdk.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MixSdk.framework; sourceTree = BUILT_PRODUCTS_DIR; };
18204BBE2C193E3D00F94E69 /* MixSdk.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MixSdk.h; sourceTree = "<group>"; };
18C42BE62C242202000D8860 /* libswscale.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libswscale.a; sourceTree = "<group>"; };
18C42C6B2C2422C2000D8860 /* AiAudioDecoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AiAudioDecoder.m; sourceTree = "<group>"; };
18C42C6C2C2422C2000D8860 /* AiAudioDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AiAudioDecoder.h; sourceTree = "<group>"; };
- 18C42C722C242361000D8860 /* TestManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestManager.h; sourceTree = "<group>"; };
- 18C42C732C242361000D8860 /* TestManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestManager.m; sourceTree = "<group>"; };
18C42C762C24241A000D8860 /* MixSdk-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MixSdk-Bridging-Header.h"; sourceTree = "<group>"; };
18C42C7A2C24270D000D8860 /* MSAudioConvert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MSAudioConvert.swift; sourceTree = "<group>"; };
18C42C7C2C242A40000D8860 /* liblzma.5.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = liblzma.5.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/usr/lib/liblzma.5.tbd; sourceTree = DEVELOPER_DIR; };
181188302C1A8B5200C23FAB /* Tools */ = {
isa = PBXGroup;
children = (
- 18132AF12C1C4938002F6B52 /* WebSocket.swift */,
+ 18132AF12C1C4938002F6B52 /* SwiftWebSocket.swift */,
181188312C1A8B5200C23FAB /* Date.swift */,
181188322C1A8B5200C23FAB /* Any.swift */,
181188332C1A8B5200C23FAB /* Logger.swift */,
1811884D2C1AEF0F00C23FAB /* MSTranslate.swift */,
18C42B3A2C22F284000D8860 /* MsTranslateModel.swift */,
18132AEE2C1C25CC002F6B52 /* MSAigc.swift */,
- 18C42C722C242361000D8860 /* TestManager.h */,
- 18C42C732C242361000D8860 /* TestManager.m */,
184FFC532C21B091006F664D /* MSAigcModel.swift */,
181188562C1BE24200C23FAB /* MSStt.swift */,
18C42B382C22F1FA000D8860 /* MSSttModel.swift */,
18C42C512C242202000D8860 /* xvmc.h in Headers */,
18C42BF92C242202000D8860 /* base64.h in Headers */,
18C42C302C242202000D8860 /* hwcontext_videotoolbox.h in Headers */,
- 18C42C742C242361000D8860 /* TestManager.h in Headers */,
18C42C342C242202000D8860 /* ripemd.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
18204BC62C193E4B00F94E69 /* MSAuth.swift in Sources */,
18132AED2C1C1EA8002F6B52 /* MSTool.swift in Sources */,
181188472C1ACA6100C23FAB /* String+MD5.swift in Sources */,
- 18132AF22C1C4938002F6B52 /* WebSocket.swift in Sources */,
+ 18132AF22C1C4938002F6B52 /* SwiftWebSocket.swift in Sources */,
1811883F2C1A8B5200C23FAB /* CRC16.swift in Sources */,
181188452C1AC35F00C23FAB /* MSError.swift in Sources */,
1811883B2C1A8B5200C23FAB /* Logger.swift in Sources */,
181188572C1BE24200C23FAB /* MSStt.swift in Sources */,
18204BFD2C19488900F94E69 /* Operation.swift in Sources */,
1811883C2C1A8B5200C23FAB /* JSON.swift in Sources */,
- 18C42C752C242361000D8860 /* TestManager.m in Sources */,
181188402C1A8B5200C23FAB /* LRC.swift in Sources */,
18204BFC2C19488900F94E69 /* HTTPSecurity.swift in Sources */,
18204BFB2C19488900F94E69 /* Upload.swift in Sources */,
/// aigc类
public class MSAigc{
func getUrl(_ api:String)->String{
- return "http://121.40.67.151:9099/" + api
+ return httpBaseURL + api
}
/// 获取算法类型
/// 鉴权管理类
public class MSAuth {
/// 是否已经鉴权
- public var authorized = false
+ public var authorized = true
func getUrl(_ api:String)->String{
return "https://app.api.thisiot.com/da/auth/" + api
import Foundation
+
+
/// 对话回调
public typealias MSChatCallBack = (_ model: MSChatModel) -> Void
/// 大模型对话类
public class MSChat {
- let socket:WebSocket
+ var socket:WebSocket!
/// 对话回调
public var callBack:MSChatCallBack?
init(){
- let url = "ws://121.40.67.151:9099/chat/ws/watches"
-// let url = "wss://ichat.raisound.com/chat-ws/chat/ws"
+ openWebSocket()
+ setupHeartBeat()
+ }
+
+ func openWebSocket(){
+ let url = wsBaseURL + "chat/ws/watches"
+ // let url = "wss://ichat.raisound.com/chat-ws/chat/ws"
socket = WebSocket(url)
socket.delegate = self
-// socket.allowSelfSignedSSL = true
-// let request = URLRequest(urlString: "wss://121.40.67.151:9099/chat-ws/chat/ws")
-// socket = WebSocket(request: request!)
-// socket.delegate = self
}
-
+ func setupHeartBeat(){
+ let timer = Timer.scheduledTimer(withTimeInterval: wsHeartBeatTime, repeats: true) { [weak self] _ in
+ guard let self = self else {return}
+ if socket.readyState == .open{
+ self.socket.ping()
+ }
+ else{
+ self.openWebSocket()
+ }
+ }
+ RunLoop.current.add(timer, forMode: .common)
+ }
/// 发送内容
/// - Parameter content: 内容
public func send(content:String){
+ if !MixSdk.shared.auth.authorized {
+ Logger.log("还未鉴权")
+ return
+ }
let params = [
"type":"chat",
"content":content,
extension MSChat:WebSocketDelegate{
- func webSocketOpen() {
-// Logger.log("MSChat webSocketOpen")
+ func webSocketOpen() {
+ // Logger.log("MSChat webSocketOpen")
}
- func webSocketClose(_ code: Int, reason: String, wasClean: Bool) {
- Logger.log("MSChat webSocketClose",code,reason,wasClean)
+ func webSocketClose(_ code: Int, reason: String, wasClean: Bool) {
+// Logger.log("MSChat webSocketClose",code,reason,wasClean)
}
- func webSocketError(_ error: NSError) {
- Logger.log("MSChat webSocketError",error)
+ func webSocketError(_ error: NSError) {
+// Logger.log("MSChat webSocketError",error)
}
- func webSocketMessageText(_ text: String) {
+ func webSocketMessageText(_ text: String) {
Logger.log("MSChat receive",text)
}
- func webSocketMessageData(_ data: Data){
+ func webSocketMessageData(_ data: Data){
Logger.log("MSChat receive",data.joined(""))
if let model = MSChatModel.decode(data){
}
}
- func webSocketPong(){
- Logger.log("MSChat Pong")
+ func webSocketPong(){
+// Logger.log("MSChat Pong")
}
- func webSocketEnd(_ code: Int, reason: String, wasClean: Bool, error: NSError?){
- Logger.log("MSChat webSocketEnd",code,reason,wasClean,error ?? "")
+ func webSocketEnd(_ code: Int, reason: String, wasClean: Bool, error: NSError?){
+// Logger.log("MSChat webSocketEnd",code,reason,wasClean,error ?? "")
}
}
/// 语音转文字类
public class MSStt {
- let socket:WebSocket
+ var socket:WebSocket!
var taskId:String?
/// 事件回调
public var eventCallBack:MSSttEventCallBack?
-
+
init(){
- socket = WebSocket("ws://121.40.67.151:9099/asr/ws")
- socket.delegate = self
+ openWebSocket()
+ setupHeartBeat()
}
- func getUrl()->String{
- return "http://121.40.67.151:9099/asr/sentence-recognize?"
+ func openWebSocket(){
+ socket = WebSocket(wsBaseURL + "asr/ws")
+ socket.delegate = self
+ }
+ func setupHeartBeat(){
+ let timer = Timer.scheduledTimer(withTimeInterval: wsHeartBeatTime, repeats: true) { [weak self] _ in
+ guard let self = self else {return}
+ if socket.readyState == .open{
+ self.socket.ping()
+ }
+ else{
+ self.openWebSocket()
+ }
+ }
+ RunLoop.current.add(timer, forMode: .common)
}
/// 一句话识别
return
}
- var url = getUrl()
+ var url = httpBaseURL + "asr/sentence-recognize?"
if let value = format{
url += "format=\(value)&"
}
public extension MSStt{
/// 开始转换
func startTranscription(){
+ if !MixSdk.shared.auth.authorized {
+ Logger.log("还未鉴权")
+ return
+ }
let taskId = "\(Int(Date().timeIntervalSince1970)*1000)".md5.lowercased();
self.taskId = taskId
let params = [
}
//结束转换
func stopTranscription(){
+ if !MixSdk.shared.auth.authorized {
+ Logger.log("还未鉴权")
+ return
+ }
let params = [
"header":[
"event":"StopTranscription",
let cmd = params.jsonString() ?? ""
Logger.log(cmd)
socket.send(text: cmd )
+
}
/// 发送语音数据,format pcm,采样率 16000
/// - Parameter data: 语音数据
func sendVoice(pcmData:Data){
+ if !MixSdk.shared.auth.authorized {
+ Logger.log("还未鉴权")
+ return
+ }
socket.send(data: pcmData)
}
/// 发送语音数据,format sbc,采样率 16000
/// - Parameter data: 语音数据
func sendVoice(sbcData:Data){
+ if !MixSdk.shared.auth.authorized {
+ Logger.log("还未鉴权")
+ return
+ }
MSAudioConvert.sbcTopcm(sbcData){[weak self] pcm in
self?.socket.send(data: pcm)
}
}
-
- // func openWebSocket(){
- // socket.open()
- // }
}
}
func webSocketClose(_ code: Int, reason: String, wasClean: Bool) {
- Logger.log("MSStt webSocketClose",code,reason,wasClean)
+// Logger.log("MSStt webSocketClose",code,reason,wasClean)
}
func webSocketError(_ error: NSError) {
- Logger.log("MSStt webSocketError",error)
+// Logger.log("MSStt webSocketError",error)
}
func webSocketMessageText(_ text: String) {
Logger.log("MSStt receive",text)
}
func webSocketPong(){
- Logger.log("MSStt Pong")
+// Logger.log("MSStt Pong")
}
func webSocketEnd(_ code: Int, reason: String, wasClean: Bool, error: NSError?){
- Logger.log("MSStt webSocketEnd",code,reason,wasClean,error ?? "")
+// Logger.log("MSStt webSocketEnd",code,reason,wasClean,error ?? "")
}
}
/// 翻译类
public class MSTranslate {
private func getUrl(_ api:String)->String{
- return "http://121.40.67.151:9099/translate/" + api
+ return httpBaseURL + api
}
}
completeHandler(nil,.unauthorised)
return
}
- let url = getUrl("general")
+ let url = getUrl("translate/general")
let params = [
"sl":"auto",
"tl":lang.code,
completeHandler(nil,.unauthorised)
return
}
- let url = getUrl("languages")
+ let url = getUrl("translate/languages")
HTTP.POST(url,requestSerializer: JSONParameterSerializer()){ response in
DispatchQueue.main.sync {
/// 文字转语音类
public class MSTts {
- let socket:WebSocket
+ var socket:WebSocket!
var taskId:String?
/// 事件回调
public var voiceCallBack:MSTtsVoiceCallBack?
init(){
- socket = WebSocket("ws://121.40.67.151:9099/tts/stream")
+ openWebSocket()
+ setupHeartBeat()
+ }
+
+ func openWebSocket(){
+ socket = WebSocket(wsBaseURL + "tts/stream")
socket.delegate = self
}
+ func setupHeartBeat(){
+ let timer = Timer.scheduledTimer(withTimeInterval: wsHeartBeatTime, repeats: true) { [weak self] _ in
+ guard let self = self else {return}
+ if socket.readyState == .open{
+ self.socket.ping()
+ }
+ else{
+ self.openWebSocket()
+ }
+ }
+ RunLoop.current.add(timer, forMode: .common)
+ }
}
public extension MSTts{
/// 开始实时语音合成
func startSynthesis(){
+ if !MixSdk.shared.auth.authorized {
+ Logger.log("还未鉴权")
+ return
+ }
let taskId = "\(Int(Date().timeIntervalSince1970)*1000)".md5.lowercased();
self.taskId = taskId
let params = [
/// 结束实时语音合成
func stopSynthesis(){
+ if !MixSdk.shared.auth.authorized {
+ Logger.log("还未鉴权")
+ return
+ }
let params = [
"header": [
"event": "StopSynthesis",
/// 实时发送。注意实时合成和一次性只能同时运行一个
/// - Parameter text: 合成的内容
func runSynthesis(text:String){
+ if !MixSdk.shared.auth.authorized {
+ Logger.log("还未鉴权")
+ return
+ }
let params = [
"header": [
"event": "RunSynthesis",
/// 发送一次性长内容。注意实时合成和一次性只能同时运行一个
/// - Parameter text: 合成的内容
func sendLongTextStream(text:String){
+ if !MixSdk.shared.auth.authorized {
+ Logger.log("还未鉴权")
+ return
+ }
let taskId = "\(Int(Date().timeIntervalSince1970)*1000)".md5.lowercased();
self.taskId = taskId
let params = [
extension MSTts:WebSocketDelegate{
- func webSocketOpen() {
-// Logger.log("MSTts webSocketOpen")
+ func webSocketOpen() {
+ // Logger.log("MSTts webSocketOpen")
}
- func webSocketClose(_ code: Int, reason: String, wasClean: Bool) {
- Logger.log("MSTts webSocketClose",code,reason,wasClean)
+ func webSocketClose(_ code: Int, reason: String, wasClean: Bool) {
+// Logger.log("MSTts webSocketClose",code,reason,wasClean)
}
- func webSocketError(_ error: NSError) {
- Logger.log("MSTts webSocketError",error)
+ func webSocketError(_ error: NSError) {
+// Logger.log("MSTts webSocketError",error)
}
- func webSocketMessageText(_ text: String) {
+ func webSocketMessageText(_ text: String) {
Logger.log("MSTts receive",text)
guard let data = text.data,let model = JSON.decode(MSTtsEventHead.self, from: data) else{
return
eventCallBack?(model.header)
}
- func webSocketMessageData(_ data: Data){
+ func webSocketMessageData(_ data: Data){
Logger.log("MSTts receive",data)
voiceCallBack?(data)
}
- func webSocketPong(){
- Logger.log("MSTts Pong")
+ func webSocketPong(){
+// Logger.log("MSTts Pong")
}
- func webSocketEnd(_ code: Int, reason: String, wasClean: Bool, error: NSError?){
- Logger.log("MSTts webSocketEnd",code,reason,wasClean,error ?? "")
+ func webSocketEnd(_ code: Int, reason: String, wasClean: Bool, error: NSError?){
+// Logger.log("MSTts webSocketEnd",code,reason,wasClean,error ?? "")
}
}
// Created by incar on 2024/6/20.
//
-#import "TestManager.h"
#import "AudioDecode/AiAudioDecoder.h"
import Foundation
+let wsBaseURL = "ws://121.40.67.151:9099/"
+let httpBaseURL = "http://121.40.67.151:9099/"
+let wsHeartBeatTime = 2.0
+//let wsBaseURL = "ws://118.145.158.207:80/"
+//let httpBaseURL = "http://118.145.158.207:80/"
+
/// SDK 管理类
public class MixSdk:NSObject {
public static let shared = MixSdk()
public var logs: [String] { Logger.logs }
/// SDK 版本号
- public let version: String = "1.0.1"
+ public let version: String = "1.0.3"
/// 默认为 false
public var isDebug: Bool = false {
didSet { Logger.isDebug = isDebug }
+++ /dev/null
-//
-// TestManager.h
-// MixSdk
-//
-// Created by incar on 2024/6/20.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface TestManager : NSObject
-
-- (void)add;
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// TestManager.m
-// MixSdk
-//
-// Created by incar on 2024/6/20.
-//
-
-#import "TestManager.h"
-
-@implementation TestManager
-- (void)add{
- NSLog(@"==================");
-}
-@end