Browse Source

修改讯飞语音识别

weicu
tanlongsheng 10 months ago
parent
commit
9d1e35b951
  1. 90
      local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt

90
local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt

@ -17,12 +17,14 @@ class XunFeiAsrHelper(private val context: Context) {
private val tag = "XunFeiAsrHelper" private val tag = "XunFeiAsrHelper"
private val appId = "43d87d22" private val appId = "43d87d22"
private val accessKeyId = "83f063755e8d342670002f50a4471d42" private val accessKeyId = "2bd01ce06ac35957fc0c082f9b6284ec"
private val accessKeySecret = "ODU3OTUyYjhjMjY5NDhkMmMxYWY2Zjlm"
private var webSocket: WebSocket? = null private var webSocket: WebSocket? = null
private val client = OkHttpClient() private val client = OkHttpClient()
private var currentSessionId = "" private var currentSessionId = ""
private var sessionId = ""
fun start(callback: AzureAsrHelper.ContinuousRecognizeCallback) { fun start(callback: AzureAsrHelper.ContinuousRecognizeCallback) {
try { try {
@ -73,7 +75,7 @@ class XunFeiAsrHelper(private val context: Context) {
fun stop() { fun stop() {
try { try {
webSocket?.let { ws: WebSocket -> webSocket?.let { ws: WebSocket ->
ws.send("{\"end\": true}") ws.send("{\"end\": true, \"sessionId\": \"$sessionId\"}")
ws.close(1000, "User stopped") ws.close(1000, "User stopped")
} }
} catch (e: Exception) { } catch (e: Exception) {
@ -89,10 +91,15 @@ class XunFeiAsrHelper(private val context: Context) {
) { ) {
try { try {
val jsonData = JSONObject(resultData) val jsonData = JSONObject(resultData)
val action = jsonData.optString("action") Log.d(tag, "-------------------$jsonData")
val msgType = jsonData.optString("msg_type")
when (action) {
"started" -> { when (msgType) {
"action" -> {
val sid = jsonData.optString("sessionId")
if (!sid.isNullOrEmpty()) {
sessionId = sid
}
Log.d(tag, "Handshake success") Log.d(tag, "Handshake success")
} }
@ -127,8 +134,13 @@ class XunFeiAsrHelper(private val context: Context) {
} }
"error" -> { "error" -> {
Log.e(tag, "Error: $resultData")
callback.onError(currentSessionId, 1005, "Xunfei error: $resultData") callback.onError(currentSessionId, 1005, "Xunfei error: $resultData")
Log.e(tag, "Error: $resultData")
}
else -> {
callback.onError(currentSessionId, 1006, "Xunfei unknown msg_type: $msgType")
Log.w(tag, "Unknown msg_type: $msgType")
} }
} }
} catch (e: Exception) { } catch (e: Exception) {
@ -137,27 +149,57 @@ class XunFeiAsrHelper(private val context: Context) {
} }
private fun getWebSocketUrl(): String { private fun getWebSocketUrl(): String {
val url = "wss://rtasr.xfyun.cn/v1/ws" val baseWsUrl = "wss://office-api-ast-dx.iflyaisol.com/ast/communicate/v1"
val ts = (System.currentTimeMillis() / 1000).toString()
val baseString = appId + ts val params = java.util.TreeMap<String, String>()
val signa = md5(baseString) params["audio_encode"] = "pcm_s16le"
val signatureSha = hmacSha1(signa, accessKeyId) params["lang"] = "autodialect"
val signature = Base64.encodeToString(signatureSha, Base64.NO_WRAP) params["samplerate"] = "16000"
val encodedSignature = URLEncoder.encode(signature, "UTF-8") params["accessKeyId"] = accessKeyId
params["appId"] = appId
return "$url?appid=$appId&ts=$ts&signa=$encodedSignature" params["utc"] = getUtcTime()
val signature = calculateSignature(params)
params["signature"] = signature
val sb = StringBuilder()
var first = true
for ((key, value) in params) {
if (!first) {
sb.append("&")
}
sb.append(URLEncoder.encode(key, "UTF-8")).append("=").append(URLEncoder.encode(value, "UTF-8"))
first = false
}
return "$baseWsUrl?$sb"
} }
private fun md5(string: String): String { private fun getUtcTime(): String {
val md = MessageDigest.getInstance("MD5") val sdf = java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
val digest = md.digest(string.toByteArray(StandardCharsets.UTF_8)) sdf.timeZone = java.util.TimeZone.getTimeZone("GMT+8")
return digest.joinToString("") { "%02x".format(it) } return sdf.format(java.util.Date())
} }
private fun hmacSha1(data: String, key: String): ByteArray { private fun calculateSignature(params: Map<String, String>): String {
val secretKeySpec = SecretKeySpec(key.toByteArray(StandardCharsets.UTF_8), "HmacSHA1") val baseStr = StringBuilder()
var first = true
for ((key, value) in params) {
if ("signature" == key) continue
if (value.isEmpty()) continue
if (!first) {
baseStr.append("&")
}
baseStr.append(URLEncoder.encode(key, "UTF-8")).append("=").append(URLEncoder.encode(value, "UTF-8"))
first = false
}
val mac = Mac.getInstance("HmacSHA1") val mac = Mac.getInstance("HmacSHA1")
mac.init(secretKeySpec) val keySpec = SecretKeySpec(accessKeySecret.toByteArray(StandardCharsets.UTF_8), "HmacSHA1")
return mac.doFinal(data.toByteArray(StandardCharsets.UTF_8)) mac.init(keySpec)
val signBytes = mac.doFinal(baseStr.toString().toByteArray(StandardCharsets.UTF_8))
return Base64.encodeToString(signBytes, Base64.NO_WRAP)
} }
} }

Loading…
Cancel
Save