|
|
|
@ -80,6 +80,7 @@ class AzureAsrHelper(private val context: Context) { |
|
|
|
/** 使用外部提供的音频数据 */ |
|
|
|
EXTERNAL |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获取设备支持的最佳音频格式 |
|
|
|
* 优先选择16000Hz,若不支持则降级到8000Hz |
|
|
|
@ -103,6 +104,7 @@ class AzureAsrHelper(private val context: Context) { |
|
|
|
// 创建对应的音频格式 |
|
|
|
return AudioStreamFormat.getWaveFormatPCM(sampleRate.toLong(), 16, 1) |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 初始化Azure语音服务 |
|
|
|
* |
|
|
|
@ -391,8 +393,7 @@ class AzureAsrHelper(private val context: Context) { |
|
|
|
audioRecord?.startRecording() |
|
|
|
startCaptureThread() // 再启动数据读取线程 |
|
|
|
isContinuousRecognitionActive = true |
|
|
|
Log.d(tag, "识别器创建成功: ${recognizer != null}") |
|
|
|
Log.d(tag, "开始识别任务: recognizeOnce 或 startContinuousRecognition 被调用") |
|
|
|
|
|
|
|
|
|
|
|
return true |
|
|
|
} catch (e: Exception) { |
|
|
|
@ -751,7 +752,21 @@ Log.d(tag, "开始识别任务: recognizeOnce 或 startContinuousRecognition 被 |
|
|
|
channelConfig, |
|
|
|
audioFormat |
|
|
|
) |
|
|
|
|
|
|
|
// 创建录音对象 |
|
|
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { |
|
|
|
Log.d("AzureASR", "android.os.Build.VERSION.SDK_INT") |
|
|
|
val format = AudioFormat.Builder() |
|
|
|
.setSampleRate(sampleRate) |
|
|
|
.setEncoding(audioFormat) |
|
|
|
.setChannelMask(channelConfig) |
|
|
|
.build() |
|
|
|
|
|
|
|
audioRecord = AudioRecord.Builder() |
|
|
|
.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION) |
|
|
|
.setAudioFormat(format) |
|
|
|
.setBufferSizeInBytes(minBufferSize * 2) |
|
|
|
.build() |
|
|
|
} else { |
|
|
|
// 创建 AudioRecord 对象 |
|
|
|
audioRecord = AudioRecord( |
|
|
|
MediaRecorder.AudioSource.VOICE_RECOGNITION, // 语音识别专用音源(自带降噪/回声消除) |
|
|
|
@ -761,9 +776,15 @@ Log.d(tag, "开始识别任务: recognizeOnce 或 startContinuousRecognition 被 |
|
|
|
minBufferSize * 2 // 使用两倍缓冲区防止溢出 |
|
|
|
) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 检查初始化状态 |
|
|
|
if (audioRecord?.state != AudioRecord.STATE_INITIALIZED) { |
|
|
|
throw IllegalStateException("AudioRecord初始化失败") |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 应用音频效果 |
|
|
|
applyAudioEffects() |
|
|
|
} |
|
|
|
|
|
|
|
// 3. 单独封装线程启动逻辑 |
|
|
|
@ -781,7 +802,6 @@ Log.d(tag, "开始识别任务: recognizeOnce 或 startContinuousRecognition 被 |
|
|
|
) |
|
|
|
bufferSize > 0 // 返回正值表示支持 |
|
|
|
} ?: 16000 // 默认回退值 |
|
|
|
// (sampleRate * 0.032).toInt() * 2 // 32ms数据量 |
|
|
|
|
|
|
|
val buffer = ByteArray(bufferSize) |
|
|
|
|
|
|
|
@ -789,8 +809,6 @@ Log.d(tag, "开始识别任务: recognizeOnce 或 startContinuousRecognition 被 |
|
|
|
|
|
|
|
// 读取音频 |
|
|
|
val bytesRead = audioRecord?.read(buffer, 0, buffer.size) ?: 0 |
|
|
|
Log.i("AzureASR", "AudioRecord state: ${audioRecord?.state}, recordingState: ${audioRecord?.recordingState}") |
|
|
|
Log.i("AzureASR", "BytesRead = $bytesRead, buffer.isSilent = ${buffer.all { it == 0.toByte() }}") |
|
|
|
|
|
|
|
if (!isPaused && bytesRead > 0) { |
|
|
|
|
|
|
|
|