24:4 Uncaught TypeError: Cannot read properties of undefined (reading 'lang')
at 24:4:132
Which seems to be this line: m.lang = e[(Math.random() * e.length) | 0]["lang"];
Another observation: You write: m = new SpeechSynthesisUtterance;
m.text = "Hello";
speechSynthesis.speak(m);
Run that JS and your computer will speak to you!
But when I paste those 3 lines into the console, that also does not produce any sound here. I tried in Chromium and Firefox, both on Linux.Question/answers from 2016, so might be misleading...
however even when it is working, it's not really like a numbers station. For a start, it needs varying static and clicks. Secondly, numbers stations don't generally say "seven hundred and thirty four", they generally say "seven. three. four." the random words repeated sometimes are a nice touch, though. And i like the idea of grabbing words from an internal list in the way the author did it. I wouldn't have thought of that, probably.
some numbers stations that i personally archived:
https://soundcloud.com/djoutcold/31-may-2014-170948-19008500-mhz
https://soundcloud.com/djoutcold/uvb-76-aug-23-2010-9-32ampst
https://nextcloud.projectftm.com/index.php/s/unid-pizza-numbers [0]
here's one that sounds like a numbers station but can be argued is not, as the meaning is rather clear (if my memory serves): https://soundcloud.com/djoutcold/sdrsharp-20150825-020508z-4368khz-af
[0] i think this one is a joke; this one is the most representative of what numbers stations used to be like, though. Whoever made it really knew what they were doing, even though they used their knowledge to be a bit cheeky. I edited it because the music would blow out your speakers originally.additionally, i know the 19008500-mhz is mislabeled, it should be 19.008500-mhz or instead of "mhz" just "hz"
<!DOCTYPE html><html><body><button onclick="f()">Start</button><script>
function f(){with(window){
a=new AudioContext;b=a.createBuffer(1,c=2*a.sampleRate,a.sampleRate);d=b.getChannelData(0);
for(i=0;i<c;i++)d[i]=(Math.random()*2-1)*.4;
e=a.createBufferSource();e.buffer=b;e.loop=1;g=a.createGain();g.gain.value=.05;
e.connect(g).connect(a.destination);e.start();
const l=n=>((n.match(/[A-Z]/g)||[]).length==1&&(n[0].match(/[A-Z]/g)||[]).length==1);
setInterval(()=>{s=Object.getOwnPropertyNames(globalThis).filter(l).sort(()=>.5-Math.random())[0];
if(Math.random()>.3){
n=String(Math.ceil(Math.random()*1e4).toString().padStart(4,'0'));
s=n[0]+'. '+n[1]+'. point. '+n[2]+'. '+n[3]+'.';
}
m=new SpeechSynthesisUtterance;m.text=s;
v=speechSynthesis.getVoices();m.lang=v[(Math.random()*v.length)|0].lang;
m.rate=Math.random();m.pitch=Math.random()*2;speechSynthesis.speak(m);},866);
//m.rate=1.7;m.pitch=2;speechSynthesis.speak(m);},866);
}}</script></body></html>
the comment at the end can be switched with the preceeding line so it sounds like he wanted it to (high pitched and fast, please) <1kband i got something stuck in my craw about noise so here's one with more accurate noise:
<!DOCTYPE html><html><body><button onclick="f()">Start</button><script>
function f(){with(window){
a=new AudioContext;
g=a.createGain();g.gain.value=.05;
h=a.createScriptProcessor(256,1,1);p=0;
h.onaudioprocess=e=>{
b=e.outputBuffer.getChannelData(0);
for(i=0;i<b.length;i++)b[i]=p+=(Math.random()*2-1)/10;
};
h.connect(g).connect(a.destination);
const l=n=>((n.match(/[A-Z]/g)||[]).length==1&&(n[0].match(/[A-Z]/g)||[]).length==1);
setInterval(()=>{
s=Object.getOwnPropertyNames(globalThis).filter(l).sort(()=>.5-Math.random())[0];
if(Math.random()>.3){
n=String(Math.ceil(Math.random()*1e4).toString().padStart(4,'0'));
s=n[0]+'. '+n[1]+'. point. '+n[2]+'. '+n[3]+'.';
}
m=new SpeechSynthesisUtterance;m.text=s;
v=speechSynthesis.getVoices();m.lang=v[(Math.random()*v.length)|0].lang;
m.rate=Math.random();m.pitch=Math.random()*2;speechSynthesis.speak(m);
},866);
}}</script></body></html>
apologies to the HN servers for using 2kb to display thesei don't know javascript so apologies if i messed anything up (because it will eventually pop and click which is extremely accurate to numbers station reception but also crashes the page - audio stops.)
doesn't mean 94 . 73 (or 94,73)? i considered using "dot". I'd have to listen to a german numbers station that uses a splitter like "point" or "dot"
what i'm asking is if you have an ip address like 4.2.2.2 how would you read that over the phone, in german?
also i made a lot of edits to fix issues during the edit window to the two versions i posted
and i used copilot because i am not a programmer, i just wanted to see if it was, in fact, possible to add noise and fix the way the numbers were read in 1kb. and i kept your code essentially the same, only adding stuff to split the numbers up closer to how they sound on RF.
so, sorry!
Commits / prompts: https://github.com/simonw/tools/commits/main/speech-synthesi...
Desktop ChromeOS works fine.
MobiusHorizons•7h ago
leeoniya•7h ago
if i had a nickel...
thenthenthen•6h ago
edent•7h ago
gkbrk•6h ago
edent•6h ago
tromp•6h ago