diff --git a/src/main/java/org/jitsi/jigasi/JvbConference.java b/src/main/java/org/jitsi/jigasi/JvbConference.java index 97788451..6a823149 100644 --- a/src/main/java/org/jitsi/jigasi/JvbConference.java +++ b/src/main/java/org/jitsi/jigasi/JvbConference.java @@ -1358,7 +1358,8 @@ else if (ChatRoomMemberPresenceChangeEvent.MEMBER_UPDATED + " " + member.getContactAddress()); CallPeer peer; - if (jvbCall != null && (peer = jvbCall.getCallPeers().next()) instanceof MediaAwareCallPeer) + if (jvbCall != null && jvbCall.getCallPeerCount() > 0 + && (peer = jvbCall.getCallPeers().next()) instanceof MediaAwareCallPeer) { MediaAwareCallPeer peerMedia = (MediaAwareCallPeer) peer; peerMedia.getConferenceMembers().forEach(confMember -> @@ -2212,10 +2213,21 @@ private void processRoomMetadataJson(String json) if (data.get("type").equals("room_metadata")) { + TranscriptionGatewaySession transcriptionSession = (TranscriptionGatewaySession)this.gatewaySession; + JSONObject metadataObj = (JSONObject)data.getOrDefault("metadata", new JSONObject()); JSONObject recordingObj = (JSONObject)metadataObj.getOrDefault("recording", new JSONObject()); - ((TranscriptionGatewaySession)this.gatewaySession).setBackendTranscribingEnabled( + transcriptionSession.setBackendTranscribingEnabled( (boolean)recordingObj.getOrDefault("isTranscribingEnabled", false)); + + JSONObject visitorsObj = (JSONObject)metadataObj.getOrDefault("visitors", new JSONObject()); + String languages = (String)visitorsObj.get("transcribingLanguages"); + if (StringUtils.isNotEmpty(languages)) + { + transcriptionSession.updateTranslateLanguages(languages.split(",")); + } + transcriptionSession.setVisitorsCountRequestingTranscription( + Integer.parseInt((String)visitorsObj.get("transcribingCount"))); } } } diff --git a/src/main/java/org/jitsi/jigasi/Main.java b/src/main/java/org/jitsi/jigasi/Main.java index ae7f31d8..1c172665 100644 --- a/src/main/java/org/jitsi/jigasi/Main.java +++ b/src/main/java/org/jitsi/jigasi/Main.java @@ -152,7 +152,6 @@ public class Main "org.jivesoftware.smackx.si", "org.jivesoftware.smackx.vcardtemp", "org.jivesoftware.smackx.xhtmlim", - "org.jivesoftware.smackx.xdata", "org.jivesoftware.smackx.eme", "org.jivesoftware.smackx.iqprivate", "org.jivesoftware.smackx.bookmarks", diff --git a/src/main/java/org/jitsi/jigasi/TranscriptionGatewaySession.java b/src/main/java/org/jitsi/jigasi/TranscriptionGatewaySession.java index 06ee2909..015d02de 100644 --- a/src/main/java/org/jitsi/jigasi/TranscriptionGatewaySession.java +++ b/src/main/java/org/jitsi/jigasi/TranscriptionGatewaySession.java @@ -126,6 +126,17 @@ public class TranscriptionGatewaySession */ private int numberOfScheduledParticipantsLeaving = 0; + /** + * The currently used additional languages for translation. + * Used for visitors to announce the languages used by visitors. + */ + private List additionalLanguages = new ArrayList<>(); + + /** + * The number of visitors that are requesting transcriptions. + */ + private int numberOfVisitorsRequestingTranscription = 0; + /** * Create a TranscriptionGatewaySession which can handle the transcription * of a JVB conference @@ -359,7 +370,9 @@ void notifyChatRoomMemberUpdated(ChatRoomMember chatMember, Presence presence) private boolean isTranscriptionRequested() { - return transcriber.isAnyParticipantRequestingTranscription() || isBackendTranscribingEnabled; + return transcriber.isAnyParticipantRequestingTranscription() + || isBackendTranscribingEnabled + || this.numberOfVisitorsRequestingTranscription > 0; } private void maybeStopTranscription() @@ -753,4 +766,32 @@ public void setBackendTranscribingEnabled(boolean backendTranscribingEnabled) this.maybeStopTranscription(); } + + /** + * @param count The count of visitors that are requesting transcriptions. + */ + public void setVisitorsCountRequestingTranscription(int count) + { + this.numberOfVisitorsRequestingTranscription = count; + + this.maybeStopTranscription(); + } + + /** + * To update all participant languages with the additional that are provided. + * @param additionalLanguages languages to add to those from the participants. + */ + void updateTranslateLanguages(String[] additionalLanguages) + { + List oldLangs = this.additionalLanguages; + this.additionalLanguages = Arrays.asList(additionalLanguages); + + // remove unused streams + oldLangs.stream().filter(s -> !this.additionalLanguages.contains(s)) + .forEach(lang -> this.transcriber.getTranslationManager().removeLanguage(lang)); + + // add new languages + this.additionalLanguages.stream().filter(s -> !oldLangs.contains(s)) + .forEach(lang -> this.transcriber.getTranslationManager().addLanguage(lang)); + } } diff --git a/src/main/java/org/jitsi/jigasi/transcription/Transcriber.java b/src/main/java/org/jitsi/jigasi/transcription/Transcriber.java index 27bc578f..6588c373 100644 --- a/src/main/java/org/jitsi/jigasi/transcription/Transcriber.java +++ b/src/main/java/org/jitsi/jigasi/transcription/Transcriber.java @@ -834,6 +834,14 @@ public TranscriptionService getTranscriptionService() return transcriptionService; } + /** + * @return the {@link TranslationManager}. + */ + public TranslationManager getTranslationManager() + { + return this.translationManager; + } + /** * Notifies all of the listeners of this {@link Transcriber} of a new * {@link TranscriptionResult} which was received. diff --git a/src/main/java/org/jitsi/jigasi/transcription/TranslationManager.java b/src/main/java/org/jitsi/jigasi/transcription/TranslationManager.java index cc8a8f4b..31ad6597 100644 --- a/src/main/java/org/jitsi/jigasi/transcription/TranslationManager.java +++ b/src/main/java/org/jitsi/jigasi/transcription/TranslationManager.java @@ -140,9 +140,15 @@ private List getTranslations( { for (String targetLanguage : translationLanguages) { + String sourceLang = result.getParticipant().getSourceLanguage(); + if (sourceLang != null && sourceLang.equals(targetLanguage)) + { + continue; + } + String translatedText = translationService.translate( alternatives.iterator().next().getTranscription(), - result.getParticipant().getSourceLanguage(), + sourceLang, targetLanguage); translatedResults.add(new TranslationResult(