Browse Source

添加是否移除第一个标点符号

weicu
tanlongsheng 10 months ago
parent
commit
1b07e3c3ed
  1. 5
      lib/data/services/asr_service.dart
  2. 6
      lib/data/services/speech_impl/azure_asr_service.dart
  3. 5
      lib/data/services/speech_impl/volcano_asr_api_service.dart
  4. 5
      lib/data/services/speech_impl/volcano_asr_service.dart
  5. 5
      lib/data/services/speech_impl/xunfei_asr_service.dart
  6. 5
      lib/modules/translation/controllers/translation_controller.dart
  7. 2
      local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt
  8. 6
      local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt
  9. 3
      local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureSpeechPlugin.kt
  10. 55
      local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/XunFeiAsrHelper.kt

5
lib/data/services/asr_service.dart

@ -20,8 +20,9 @@ abstract class AsrService {
/// ///
/// 返回一个包含识别事件的流 /// 返回一个包含识别事件的流
Future<bool> startContinuousRecognition( Future<bool> startContinuousRecognition(
bool audioSourceType, bool audioSourceType, {
); bool isRemoveFirstPunctuation = true,
});
/// 停止连续语音识别 /// 停止连续语音识别
Future<bool> stopContinuousRecognition(); Future<bool> stopContinuousRecognition();

6
lib/data/services/speech_impl/azure_asr_service.dart

@ -191,7 +191,10 @@ class AzureAsrService extends GetxService implements AsrService {
/// - 在 600ms 的冷却时间内再次调用会被防抖拦截并返回 false; /// - 在 600ms 的冷却时间内再次调用会被防抖拦截并返回 false;
/// - 首次或冷却期外调用会继续启动连续识别; /// - 首次或冷却期外调用会继续启动连续识别;
/// - 若当前已处于连续识别中,会先调用停止后再启动。 /// - 若当前已处于连续识别中,会先调用停止后再启动。
Future<bool> startContinuousRecognition(bool audioSourceType) async { Future<bool> startContinuousRecognition(
bool audioSourceType, {
bool isRemoveFirstPunctuation = true,
}) async {
// 防抖判断:短时间内重复调用直接拦截 // 防抖判断:短时间内重复调用直接拦截
final now = DateTime.now(); final now = DateTime.now();
if (_lastStartAt != null && now.difference(_lastStartAt!) < _debounce) { if (_lastStartAt != null && now.difference(_lastStartAt!) < _debounce) {
@ -212,6 +215,7 @@ class AzureAsrService extends GetxService implements AsrService {
final bool result = final bool result =
await _channel.invokeMethod('startContinuousRecognition', { await _channel.invokeMethod('startContinuousRecognition', {
'audioSourceType': audioSourceType, 'audioSourceType': audioSourceType,
'isRemoveFirstPunctuation': isRemoveFirstPunctuation,
}); });
if (!result) { if (!result) {

5
lib/data/services/speech_impl/volcano_asr_api_service.dart

@ -862,7 +862,10 @@ class VolcanoAsrApiService implements AsrService {
} }
@override @override
Future<bool> startContinuousRecognition(bool audioSourceType) { Future<bool> startContinuousRecognition(
bool audioSourceType, {
bool isRemoveFirstPunctuation = true,
}) {
// TODO: implement startContinuousRecognition // TODO: implement startContinuousRecognition
throw UnimplementedError(); throw UnimplementedError();
} }

5
lib/data/services/speech_impl/volcano_asr_service.dart

@ -397,7 +397,10 @@ class VolcanoAsrService extends GetxService implements AsrService {
} }
@override @override
Future<bool> startContinuousRecognition(bool audioSourceType) { Future<bool> startContinuousRecognition(
bool audioSourceType, {
bool isRemoveFirstPunctuation = true,
}) {
// TODO: implement startContinuousRecognition // TODO: implement startContinuousRecognition
throw UnimplementedError(); throw UnimplementedError();
} }

5
lib/data/services/speech_impl/xunfei_asr_service.dart

@ -321,7 +321,10 @@ class XunfeiAsrService extends GetxService implements AsrService {
} }
@override @override
Future<bool> startContinuousRecognition(bool audioSourceType) { Future<bool> startContinuousRecognition(
bool audioSourceType, {
bool isRemoveFirstPunctuation = true,
}) {
// TODO: implement startContinuousRecognition // TODO: implement startContinuousRecognition
throw UnimplementedError(); throw UnimplementedError();
} }

5
lib/modules/translation/controllers/translation_controller.dart

@ -403,7 +403,10 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
if (_asrSessionStartTime == null) { if (_asrSessionStartTime == null) {
await _initializeSession(); await _initializeSession();
} }
await _asrService.startContinuousRecognition(_audioSourceType); //开启识别 await _asrService.startContinuousRecognition(
_audioSourceType,
isRemoveFirstPunctuation: false,
); //开启识别
_startAsrActiveTracking(); //开启识别活动跟踪 _startAsrActiveTracking(); //开启识别活动跟踪
if (isRecording.value) { if (isRecording.value) {
if (isCreateRecord.value) { if (isCreateRecord.value) {

2
local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt

@ -642,7 +642,7 @@ object AgentService : CoroutineScope {
if(isExternalActive){ if(isExternalActive){
isKeepResult = true isKeepResult = true
} }
azureAsrHelper?.startContinuousRecognition(audioSourceType) azureAsrHelper?.startContinuousRecognition(audioSourceType, isRemoveFirstPunctuation = false)
// 根据模式启动相应的空闲检测 // 根据模式启动相应的空闲检测
startIdleCheckForMode(mode) startIdleCheckForMode(mode)

6
local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt

@ -238,11 +238,13 @@ class AzureAsrHelper(private val context: Context) {
* 开始连续语音识别 * 开始连续语音识别
* @param audioSourceType 音频源类型 * @param audioSourceType 音频源类型
* @param audioDataCallback 音频数据回调 * @param audioDataCallback 音频数据回调
* @param isRemoveFirstPunctuation 是否移除第一个标点符号
* @return 是否成功开始识别 * @return 是否成功开始识别
*/ */
fun startContinuousRecognition( fun startContinuousRecognition(
audioSourceType: AudioSourceType = AudioSourceType.MICROPHONE, audioSourceType: AudioSourceType = AudioSourceType.MICROPHONE,
audioDataCallback: SimpleAudioReceiver.AudioDataCallback? = null audioDataCallback: SimpleAudioReceiver.AudioDataCallback? = null,
isRemoveFirstPunctuation: Boolean = true
): Boolean { ): Boolean {
Log.d(tag, "startContinuousRecognition:${audioStream.isContinuousRecognitionActive} ") Log.d(tag, "startContinuousRecognition:${audioStream.isContinuousRecognitionActive} ")
@ -285,7 +287,7 @@ class AzureAsrHelper(private val context: Context) {
} }
try { try {
xunFeiAsrHelper?.start(callback, currentLanguage, isAutoDetectLanguage) xunFeiAsrHelper?.start(callback, currentLanguage, isAutoDetectLanguage, isRemoveFirstPunctuation)
this.audioSourceType = audioSourceType this.audioSourceType = audioSourceType
if (!audioStream.isContinuousRecognitionActive) { if (!audioStream.isContinuousRecognitionActive) {

3
local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureSpeechPlugin.kt

@ -449,6 +449,7 @@ class AzureSpeechPlugin : BleService.Callback, FlutterPlugin {
"startContinuousRecognition" -> { "startContinuousRecognition" -> {
val useExternalAudio = call.argument<Boolean>("audioSourceType") ?: false val useExternalAudio = call.argument<Boolean>("audioSourceType") ?: false
val removeFirstPunctuation = call.argument<Boolean>("isRemoveFirstPunctuation") ?: true
// 确保事件通道已准备好 // 确保事件通道已准备好
if (asrEventSink == null) { if (asrEventSink == null) {
result.error( result.error(
@ -468,7 +469,7 @@ class AzureSpeechPlugin : BleService.Callback, FlutterPlugin {
AzureAsrHelper.AudioSourceType.MICROPHONE AzureAsrHelper.AudioSourceType.MICROPHONE
} }
val success = azureAsrHelper.startContinuousRecognition(audioSourceType) val success = azureAsrHelper.startContinuousRecognition(audioSourceType, isRemoveFirstPunctuation = removeFirstPunctuation)
result.success(true) result.success(true)
} catch (e: Exception) { } catch (e: Exception) {
result.error("START_RECOGNITION_ERROR", e.message, null) result.error("START_RECOGNITION_ERROR", e.message, null)

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

@ -30,7 +30,10 @@ class XunFeiAsrHelper(private val context: Context) {
private var currentLanguage = "zh-CN" private var currentLanguage = "zh-CN"
private var isAutoDetectLanguage = false private var isAutoDetectLanguage = false
fun start(callback: AzureAsrHelper.ContinuousRecognizeCallback, language: String, isAutoDetect: Boolean) { // 是否第去除一个文字的标点符号
private var removeFirstPunctuation = true
fun start(callback: AzureAsrHelper.ContinuousRecognizeCallback, language: String, isAutoDetect: Boolean, isRemoveFirstPunctuation: Boolean) {
try { try {
webSocket?.cancel() webSocket?.cancel()
webSocket = null webSocket = null
@ -43,6 +46,7 @@ class XunFeiAsrHelper(private val context: Context) {
currentLanguage = language currentLanguage = language
isAutoDetectLanguage = isAutoDetect isAutoDetectLanguage = isAutoDetect
removeFirstPunctuation = isRemoveFirstPunctuation
val url = getWebSocketUrl() val url = getWebSocketUrl()
val request = Request.Builder().url(url).build() val request = Request.Builder().url(url).build()
@ -142,32 +146,35 @@ class XunFeiAsrHelper(private val context: Context) {
for (k in 0 until ws.length()) { for (k in 0 until ws.length()) {
val kObj = ws.getJSONObject(k) val kObj = ws.getJSONObject(k)
val cw = kObj.optJSONArray("cw") ?: continue val cw = kObj.optJSONArray("cw") ?: continue
// 如果resultTextTemp中第一个文字是标点符号,则去除第一个文字的标点符号 if(removeFirstPunctuation) {
for (l in 0 until cw.length()) { // 如果resultTextTemp中第一个文字是标点符号,则去除第一个文字的标点符号
val lObj = cw.getJSONObject(l) for (l in 0 until cw.length()) {
val w = lObj.optString("w") val lObj = cw.getJSONObject(l)
val wp = lObj.optString("wp") val w = lObj.optString("w")
val wp = lObj.optString("wp")
if (wp == "p") {
punctuationCount++ if (wp == "p") {
if (resultTextTemp.isEmpty()) { punctuationCount++
continue if (resultTextTemp.isEmpty()) {
continue
}
} else {
wordCount++
}
resultTextTemp += w
}
} else {
// 不去除resultTextTemp第一个文字的标点符号
for (l in 0 until cw.length()) {
val lObj = cw.getJSONObject(l)
resultTextTemp += lObj.optString("w")
if (lObj.optString("wp") == "p") {
punctuationCount++
} else {
wordCount++
} }
} else {
wordCount++
} }
resultTextTemp += w
} }
// 不去除resultTextTemp第一个文字的标点符号
// for (l in 0 until cw.length()) {
// val lObj = cw.getJSONObject(l)
// resultTextTemp += lObj.optString("w")
// if (lObj.optString("wp") == "p") {
// punctuationCount++
// } else {
// wordCount++
// }
// }
} }
} }

Loading…
Cancel
Save