|
|
@ -136,8 +136,6 @@ class AzureAsrHelper(private val context: Context) { |
|
|
audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager |
|
|
audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager |
|
|
originalAudioMode = audioManager?.mode ?: AudioManager.MODE_NORMAL |
|
|
originalAudioMode = audioManager?.mode ?: AudioManager.MODE_NORMAL |
|
|
|
|
|
|
|
|
// 5. 初始化麦克风数据 |
|
|
|
|
|
initAudioRecord() |
|
|
|
|
|
|
|
|
|
|
|
// 保存配置 |
|
|
// 保存配置 |
|
|
this.subscriptionKey = subscriptionKey |
|
|
this.subscriptionKey = subscriptionKey |
|
|
@ -381,6 +379,8 @@ class AzureAsrHelper(private val context: Context) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
try { |
|
|
try { |
|
|
|
|
|
// 5. 初始化麦克风 |
|
|
|
|
|
initAudioRecord() |
|
|
// 设置各种事件监听 |
|
|
// 设置各种事件监听 |
|
|
setupEventListeners(callback) |
|
|
setupEventListeners(callback) |
|
|
|
|
|
|
|
|
@ -508,7 +508,7 @@ class AzureAsrHelper(private val context: Context) { |
|
|
|
|
|
|
|
|
// 停止音频处理 |
|
|
// 停止音频处理 |
|
|
stopAudioProcessing() |
|
|
stopAudioProcessing() |
|
|
// 停止录音 |
|
|
// 停止录音 |
|
|
stopMicrophoneCapture() |
|
|
stopMicrophoneCapture() |
|
|
// 尝试强制关闭识别器 |
|
|
// 尝试强制关闭识别器 |
|
|
try { |
|
|
try { |
|
|
@ -734,18 +734,18 @@ class AzureAsrHelper(private val context: Context) { |
|
|
// 获取已确定的采样率 |
|
|
// 获取已确定的采样率 |
|
|
val format = getOptimalAudioFormat() |
|
|
val format = getOptimalAudioFormat() |
|
|
val supportedSampleRates = intArrayOf(16000, 8000, 11025, 22050, 44100) |
|
|
val supportedSampleRates = intArrayOf(16000, 8000, 11025, 22050, 44100) |
|
|
|
|
|
val channelConfig = AudioFormat.CHANNEL_IN_MONO // 单声道输入 |
|
|
|
|
|
val audioFormat = AudioFormat.ENCODING_PCM_16BIT // 16位PCM格式 |
|
|
// 查找设备支持的最佳采样率 |
|
|
// 查找设备支持的最佳采样率 |
|
|
val sampleRate = supportedSampleRates.firstOrNull { rate -> |
|
|
val sampleRate = supportedSampleRates.firstOrNull { rate -> |
|
|
val bufferSize = AudioRecord.getMinBufferSize( |
|
|
val bufferSize = AudioRecord.getMinBufferSize( |
|
|
rate, |
|
|
rate, |
|
|
AudioFormat.CHANNEL_IN_MONO, |
|
|
channelConfig, |
|
|
AudioFormat.ENCODING_PCM_16BIT |
|
|
audioFormat |
|
|
) |
|
|
) |
|
|
bufferSize > 0 // 返回正值表示支持 |
|
|
bufferSize > 0 // 返回正值表示支持 |
|
|
} ?: 16000 // 默认回退值 |
|
|
} ?: 16000 // 默认回退值 |
|
|
val channelConfig = AudioFormat.CHANNEL_IN_MONO // 单声道输入 |
|
|
|
|
|
val audioFormat = AudioFormat.ENCODING_PCM_16BIT // 16位PCM格式 |
|
|
|
|
|
|
|
|
|
|
|
// 计算最小缓冲区大小(避免出现音频欠载) |
|
|
// 计算最小缓冲区大小(避免出现音频欠载) |
|
|
val minBufferSize = AudioRecord.getMinBufferSize( |
|
|
val minBufferSize = AudioRecord.getMinBufferSize( |
|
|
@ -808,16 +808,17 @@ class AzureAsrHelper(private val context: Context) { |
|
|
|
|
|
|
|
|
while (!Thread.interrupted() && audioRecord?.recordingState == AudioRecord.RECORDSTATE_RECORDING) { |
|
|
while (!Thread.interrupted() && audioRecord?.recordingState == AudioRecord.RECORDSTATE_RECORDING) { |
|
|
|
|
|
|
|
|
// 读取音频 |
|
|
|
|
|
val bytesRead = audioRecord?.read(buffer, 0, buffer.size) ?: 0 |
|
|
|
|
|
|
|
|
|
|
|
if (!isPaused && bytesRead > 0) { |
|
|
|
|
|
|
|
|
|
|
|
// 写入Azure流 |
|
|
if (!isPaused) { |
|
|
audioStream?.write(buffer) |
|
|
// 读取音频 |
|
|
|
|
|
val bytesRead = audioRecord?.read(buffer, 0, buffer.size) ?: 0 |
|
|
|
|
|
if (bytesRead > 0) { |
|
|
|
|
|
// 写入Azure流 |
|
|
|
|
|
audioStream?.write(buffer) |
|
|
|
|
|
|
|
|
// 保存录音 |
|
|
// 保存录音 |
|
|
recordfile?.saveAudioDataToWav(buffer) |
|
|
recordfile?.saveAudioDataToWav(buffer) |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
}.apply { start() } |
|
|
}.apply { start() } |
|
|
|