Bei mir funktioniert leider die "SIREN_URL" nicht. Habe einen Link angegeben, allerdings erfolgt nur die Sprachansage. Sirene ist nicht zu hören.
[Script] Chatter To Speech
-
-
Immer ich (weiß, ich bin ein Ex-(Idi-)ot )
-
Bei mir funktioniert leider die "SIREN_URL" nicht. Habe einen Link angegeben, allerdings erfolgt nur die Sprachansage. Sirene ist nicht zu hören.
Nie? Sollte ne ca. 50% Chance geben, das der Sound bei STATUS 3 Meldungen spielt
-
Nie? Sollte ne ca. 50% Chance geben, das der Sound bei STATUS 3 Meldungen spielt
Also bei mir läuft die Erweiterung dauerhaft und es kam noch nicht einmal der Sound Es ist aber doch richtig, dass ein Link zu einer Website (z.B. Youtube) eingetragen werden muss, oder?
-
googelt am besten nach einer mp3 datei für den "piepser/sirene" sound und die website sollte am besten noch https haben. Youtube etc dürfte nicht gehen
-
-
Kurze Frage: Hat jemand bei der männlichen Stimme noch das Problem, dass diese das "TLF" - angepasst im Script auf ["TLF", " T L F"] - als "Teelöffel" ausspricht?
-
Kurze Frage: Hat jemand bei der männlichen Stimme noch das Problem, dass diese das "TLF" - angepasst im Script auf ["TLF", " T L F"] - als "Teelöffel" ausspricht?
Da ist Fingerspizengefühl gefragt
Einfach mal alles mögliche probieren. Buchstabentrennungen durch "," oder "." z.B. oder einfach noch ein Leerzeichen mehr dazwischen
-
Hier Biete Ich meine Veränderte Version an
// ==UserScript==
// @name Chatter to Speech
// @namespace https://www.leitstellenspiel.de/
// @version 1.22
// @description Einsatzfunk zu Sprache
// @author LennardTFD
// @match https://www.leitstellenspiel.de/
// @match https://www.missionchief.com/
// @match https://www.meldkamerspel.com/
// @updateURL https://github.com/LennardTFD/…r/chatterToSpeech.user.js
// @downloadURL https://github.com/LennardTFD/…r/chatterToSpeech.user.js
// @require https://code.responsivevoice.org/responsivevoice.js
// @grant none
// ==/UserScript==
var SIREN_URL = "MYAUDIOURL";
var apiKeys = ["H9aKeucp", "rGxkrbXx", "Nf6P23Fg", "C24n6rzz", "KEUuZq9F", "Bm2hpREZ"];
function randomApiSelect()
{
return apiKeys[Math.floor(Math.random()*apiKeys.length)];
}
//Import "ResponsiveVoice" API
$("body").append("<script src='https://code.responsivevoice.org/responsivevoice.js?key=" + randomApiSelect() + "></script>");
//Import background siren
$("body").append('<audio loop="false" width="0" height="0" id="sound" src="' + SIREN_URL + '" type="audio/mp3" ></audio>');
//Words which need corrected pronunciation
var wordsToPronounce = [
["RTW", "R T W"], ["NEF", "N E F"], ["BNAW", "Baby N A W"], ["NAW", "N A W "], ["KTW", "K T W "], ["OrgL", "Org L "], ["GRTW", "G R T W"],
["ELW", "E L W "], ["DLK", "D L K "], ["HLF", "H L F "], ["LF", "L F "], ["TLF", " T L F "], ["KatS", " Kat Schutz "],
["AnH", " Anhänger "], ["DekonP", "Dekon P "], ["GW", "G W "], ["WLF", "W L F "], ["AB", "A B"], ["MTF", "M T F"], ["MTW", "M T W"],
["RTB", "R T B"], ["MZB", "M Z B"],
["FuStW", "Funkstreife "], ["GruKw", "Gru K W "],
["Brandmeldeanlage", "B M A "], ["KH", ""]
];
//Phrases to randomly use for diffrent Status
var phrases = {
"0": ["Blitz, Blitz, Blitz. Notruf von %UNIT%", "Notruf von %UNIT%", "%UNIT% Notruf", "Unterstützung zu %UNIT%", "Unterstützung zu %ADDRESS%!"],
"1": ["%UNIT% wieder frei, Wechsel auf Status 1"],
"2": ["%UNIT% meldet frei auf Wache"],
"3": ["Hier %UNIT%, wir rücken aus %MISSION% an %ADDRESS% wir fahren"],
"4": ["%UNIT% an Einsatzstelle %MISSION% eingetroffen"],
"5": ["Leitstelle für %UNIT%. Kommen Hier Sprechwunsch für %UNIT%"],
"6": ["%UNIT% geht außer Dienst", "%UNIT% nicht einsatzbereit", "%UNIT% nicht besetzt", "%UNIT% kann nicht ausrücken", "%UNIT% unbesetzt", "Wir machen Feierabend. %UNIT%"],
"7": ["Hier %UNIT% mit Sonderrechten Zum Krankenhaus %BUILDING%",],
"8": ["Hier %UNIT%. Laden aus", "%UNIT% lädt aus", "%UNIT% Status 8", "Status 8 für %UNIT%"],
"9": ["%UNIT% wartet auf Abholung", "%UNIT% steht bereit", "%UNIT% kann abgeholt werden", "%UNIT% auf Status 9"]
}
//Voices used. Duplicate voice sets increase their frequency
var voices = ["Deutsch Male", "Deutsch Male", "Deutsch Male"];
var audio = document.getElementById('sound');
audio.volume = 0.04;
var isSpeaking = false;
//Queue of last Status changes
var chatterQueue = [];
function chatParser(missionInfo)
{
var unit = missionInfo[0];
var status = missionInfo[1];
var address = missionInfo[2];
var mission = missionInfo[3];
var building = missionInfo[4];
if(String(parseInt(address)).length == 5)
{
//address = address.split(" ");
//TODO turn 41642 in 41 6 4 2
}
//Replace unit names with correct pronunciation
for(var i = 0; i < wordsToPronounce.length; i++)
{
unit = unit.replace(wordsToPronounce[i][0], wordsToPronounce[i][1]);
}
//removes "/" and "-" from call signs
unit = unit.replace(/\//gi, " ");
unit = unit.replace(/-/gi, " ");
//Select a random phrase from phrases list
var pharse = phrases[status][Math.floor(Math.random()*phrases[status].length)];
//Replace Unit Wildcard with calling unit
pharse = pharse.replace("%UNIT%", unit);
//If Status 3 or 4
if(status == "3" status == "4")
{
//Diese Parameter treffen nur auf Status 3 und 4 Einsätze zu
//Replace Address wildcard with mission address
pharse = pharse.replace("%ADDRESS%", address);
}
//If Status 7
else if(status == "7")
{
//If no building name is available replace with default value
if(building == undefined)
{
building = "Krankenhaus"
}
//Replace Building wildcard with building unit is driving to
pharse = pharse.replace("%BUILDING%", building);
}
//Replace mission wildcard with mission name
pharse = pharse.replace("%MISSION%", mission);
if(status == "3")
{
//Play background sound when en route
if(Math.floor((Math.random() * 2) + 1) == 1)
{
startBackground();
}
}
return pharse;
}
function workOffQueue()
{
//If there are unfinished chatter messages AND there is currently no other speech
if(chatterQueue.length > 0 && !responsiveVoice.isPlaying() && !isSpeaking)
{
//Make queue smaller if there is to much old chatter
if(chatterQueue.length > 10)
{
chatterQueue = chatterQueue.splice(0,4);
}
isSpeaking = true;
var curr = chatterQueue[0];
chatter(chatParser(curr));
chatterQueue.shift();
}
//If there is currently chatter
else if(chatterQueue != 0)
{
//retry 1 second later
setTimeout(workOffQueue, 1000);
}
}
function addToQueue(unit, status, address, missionName, buildingName)
{
//Add new chatter message to working queue
chatterQueue.push([unit, status, address, missionName, buildingName]);
}
function startBackground()
{
//Play background Sound
audio.play();
}
function stopBackground()
{
//Stop background sound
audio.pause();
isSpeaking = false;
}
function chatter(msg)
{
//select random speed
var speed = parseFloat((Math.random() * (0.0 - 0.1500) + 0.0200).toFixed(4));
//Select random speeker
var talker = voices[Math.floor(Math.random()*voices.length)];
//Play chatter Audio
responsiveVoice.speak(msg, talker, {rate: (1.2 + speed), onStart: function(){isSpeaking = true}, onend: stopBackground});
}
var mutationObserver = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
var node = mutation.addedNodes[0];
if(node == undefined)
{
return;
}
//Dont play sound if chatter comes from alliance
var aliance = $(node).attr("class");
if(aliance.includes("radio_message_alliance"))
{
return;
}
//Select Status from new chatter message
var status = $(node).find("span").html();
//select calling unit
var unit = $(node).find("[href^='/vehicles/']").html();
var missionName = undefined;
var missionAddress = undefined;
var buildingName = undefined;
switch(status)
{
//If status 3 or 4
case "3":
case "4":
//Get Mission reference
var missionId = ($(node).find("[href^='/missions/']")[0].href).split("/missions/")[1];
var missionInList = $("#missions-panel-body").find("[href*='" + missionId + "']");
var missionData = missionInList.parent().find(".map_position_mover");
//Grab Mission Name
missionName = (missionData.html()).split(",")[0];
//Grab Mission Address
missionAddress = (missionData.find("small").html()).split(",")[0];
//console.log(unit + ": " + missionName + " | " + missionAddress);
break;
//If Status 7
case "7":
//Grab building name
buildingName = $(node).find("[href^='/buildings/']").html();
//console.log("!!!!!!STATUS 7!!!!! BUILDING: " + buildingName);
break;
}
//console.log(status + " | " + unit);
//If is real chatter
if(unit != undefined && status != undefined)
{
//Add new chatter to queue
addToQueue(unit, status, missionAddress, missionName, buildingName);
//Start working on queue
workOffQueue();
}
});
});
//Listen for new Incomming Status updates
mutationObserver.observe($("#radio_messages")[0], {
childList: true
});
//Listen for new FMS5 and similars
mutationObserver.observe($("#radio_messages_important")[0], {
childList: true
});
-
Es gibt die Möglichkeit eine Hintergrund Audio für Status 3 Meldungen zu hinterlegen die ich, aus Unwissenheit über die Urheberrechtslage,
nicht mit liefern werde. Einfach in Zeile 17 "MYAUDIOURL" durch eine Link-Adresse einer von euch gewünschte MP3/OGG/WAV Datei ersetzen.
Wie soll das gehen wenn man eine Datei auf dem Pc hat und sie gerne einfügen will,
kann man sie einfach Hinnein Kopieren oder nicht?
Ich bitte um eine Schnelle Antwort
da ich es noch Heute machen muss
Danke
-
Wie soll das gehen wenn man eine Datei auf dem Pc hat und sie gerne einfügen will,
kann man sie einfach Hinnein Kopieren oder nicht?
Ich bitte um eine Schnelle Antwort
da ich es noch Heute machen muss
Danke
Eine Datei vom PC kann meines Wissens nach nicht eingebaut werden, du brauchst einen Hyperlink zu einer Inet-Seite.
-
Schau mal, ob "file:///<Pfad/zur/datei" funktioniert.
Wenn es nicht funktioniert, dann wird es nur mit einer Onlineressource funktionieren. Gibt da diverse kostenlose Anbieter. -
Schau mal, ob "file:///<Pfad/zur/datei" funktioniert.
Wenn es nicht funktioniert, dann wird es nur mit einer Onlineressource funktionieren. Gibt da diverse kostenlose Anbieter.Habe ich schon anderweitig vorgeschlagen gehabt. Ist (leider) nicht möglich. Andererseits eine große Sicherheitslücke wenn es gehen würde.
Wie soll das gehen wenn man eine Datei auf dem Pc hat und sie gerne einfügen will,
kann man sie einfach Hinnein Kopieren oder nicht?
Ich bitte um eine Schnelle Antwort
da ich es noch Heute machen muss
Danke
am besten einen Online Uploader finden der direkte Links zur Datei anbietet
-
Nach über zwei Wochen Offline-Leben endlich wieder Internet! Jetzt muss ich doch auch noch was loswerden, nachdem es ja ursprünglich meine Idee war (Eigenlob aus)
Ich finde die Umsetzung echt megaaaaaa genial, und damit ein riesiges Lob an LennardTFD
Bei mir läuft es alles flüssig und ohne Probleme, genau wie ich es mir vorgestellt habe. Und ich habe auch weit mehr als 10 Wachen Und finde es trotzdem einfach einen Schritt näher zur Realität. Wen es stört, dass es bei 800 Fahrzeugen unübersichtlich wird, muss es ja nicht nutzen
Vielen, vielen Dank für die tolle Umsetzung
-
Hallo
Also bei mir funktionieren die Ansagen ohne Probleme. Einziger Wermutstropfen, ich muss den LSSM deaktivieren, sonst geht es nicht.
Gruß jens
-
so gebe mal meinen senf dazu. nach anfänglichen problemen läuft es gut.
Jedoch kommt eine meldung = größer kleiner als.... kann mir das nicht alles merken. hört das Script auf zu arbeiten. weitere Einsätze werden nicht mehr genannt bei hlf auf anfahrt usw.
-
so gebe mal meinen senf dazu. nach anfänglichen problemen läuft es gut.
Jedoch kommt eine meldung = größer kleiner als.... kann mir das nicht alles merken. hört das Script auf zu arbeiten. weitere Einsätze werden nicht mehr genannt bei hlf auf anfahrt usw.
Fehler ist bekannt. Tritt im Fall von Einsatzausbreitung auf. Aber danke für die Erinnerung Fix ist in aArbeit
-
LennardTFD wollte nur meinen Senf abgeben
-
Update ist jetzt draußen. Hoffe es funktioniert jetzt mit Einsatzausbreitungen
-
Hallo
Bei mir funktioniert es jetzt auch.
Gruß Jens