voiceToTextMessage method

Future<void> voiceToTextMessage(
  1. ChatMessage message
)

Implementation

Future<void> voiceToTextMessage(ChatMessage message) async {
  if (!IMKitClient.enableVoiceToText) {
    return;
  }
  final nimMessage = message.nimMessage;
  if (nimMessage.messageType != NIMMessageType.audio) {
    return;
  }
  final messageId = MessageVoiceToTextHelper.messageIdentity(nimMessage);
  if (messageId.isEmpty ||
      _voiceToTextConvertingMessageIds.contains(messageId)) {
    return;
  }
  final existingMemoryState = _voiceToTextStates[messageId];
  if (existingMemoryState?.voiceToText?.isValid == true) {
    return;
  }
  final attachment = nimMessage.attachment;
  if (attachment is! NIMMessageAudioAttachment) {
    ChatUIToast.show(S.of().chatMessageVoiceToTextFailed);
    return;
  }
  final voicePath = attachment.path?.trim();
  final voiceUrl = attachment.url?.trim();
  if (voicePath?.isNotEmpty != true && voiceUrl?.isNotEmpty != true) {
    ChatUIToast.show(S.of().chatMessageVoiceToTextFailed);
    return;
  }
  if (!await haveConnectivity()) {
    return;
  }
  _voiceToTextConvertingMessageIds.add(messageId);
  _voiceToTextStates.remove(messageId);
  notifyListeners();
  try {
    final result = await NimCore.instance.messageService.voiceToText(
      params: NIMVoiceToTextParams(
        voicePath: voicePath?.isNotEmpty == true ? voicePath : null,
        voiceUrl: voiceUrl,
        duration: attachment.duration,
      ),
    );
    if (_isDisposed) {
      return;
    }
    final text = result.data?.trim();
    if (!result.isSuccess || text?.isNotEmpty != true) {
      ChatUIToast.show(S.of().chatMessageVoiceToTextFailed);
      return;
    }
    final info = MessageVoiceToTextInfo(
      text: text!,
      convertedAt: DateTime.now().millisecondsSinceEpoch,
      source: 'manual',
    );
    _saveVoiceToText(info, messageId);
  } catch (e) {
    Alog.e(
      tag: logTag,
      moduleName: 'voice to text',
      content: 'voice to text failed: $e',
    );
    if (!_isDisposed) {
      ChatUIToast.show(S.of().chatMessageVoiceToTextFailed);
    }
  } finally {
    if (!_isDisposed) {
      _voiceToTextConvertingMessageIds.remove(messageId);
      notifyListeners();
    }
  }
}