voiceToTextMessage method
Future<void>
voiceToTextMessage(
- 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();
}
}
}