{"id":69177,"date":"2025-07-27T03:01:00","date_gmt":"2025-07-26T17:01:00","guid":{"rendered":"https:\/\/www.rjmprogramming.com.au\/ITblog\/?p=69177"},"modified":"2025-07-27T19:00:53","modified_gmt":"2025-07-27T09:00:53","slug":"text-to-speech-youtube-subrip-subtitles-google-translate-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/text-to-speech-youtube-subrip-subtitles-google-translate-tutorial\/","title":{"rendered":"Text to Speech YouTube SubRip Subtitles Google Translate Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/video_commentary.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Text to Speech YouTube SubRip Subtitles Google Translate Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/video_commentary_gtaswell.png\" title=\"Text to Speech YouTube SubRip Subtitles Google Translate Tutorial\" style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Text to Speech YouTube SubRip Subtitles Google Translate Tutorial<\/p><\/div>\n<p>It&#8217;s fairly obvious that yesterday&#8217;s <a title='Text to Speech YouTube SubRip Subtitles Tutorial' href='#tsytsrst'>Text to Speech YouTube SubRip Subtitles Tutorial<\/a> conditions for Text to Speech functionality are pretty limiting.<\/p>\n<p>But regarding Text to Speech we can turn to another free resource out there, and thereby allow for language translations in the process, by accessing the great <a target=\"_blank\" title='Google Translate' href='http:\/\/translate.google.com' rel=\"noopener\">Google Translate<\/a>.  To &#8220;hear&#8221; the result on Google Translate, though, requires an extra &#8220;microphone&#8221; icon click to make happen, and that is why the macOS &#8220;<a target=\"_blank\" title='say command information from Apple' href='https:\/\/ss64.com\/osx\/say.html' rel=\"noopener\"><i>say<\/i><\/a>&#8221; option is still the default when the user is able.<\/p>\n<p>Also, we&#8217;ve added, as far as <a target=\"_blank\" title=\"YouTube\" href='https:\/\/youtube.com' rel=\"noopener\">YouTube<\/a> SubRip Subtitle web application logics are concerned &#8230;<\/p>\n<ul>\n<li>Speech to Text &#8230; extra button name logic should the user say one of these button content words<\/li>\n<li>Text to Speech &#8230; start including under the banner &#8220;Commentary&#8221; the wording of the orange div <a target=\"_blank\" title='SubRip information from Wikipedia ... thanks' href='https:\/\/en.wikipedia.org\/wiki\/SubRip' rel=\"noopener\">SubRip<\/a> subtitles and captions content wording<\/li>\n<\/ul>\n<p>That latter work can make your work act a bit like an audiobook.  Some of the &#8220;say&#8221; voices would add an accent, perhaps?!<\/p>\n<p>Codewise, these changes involved &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/macos_say_record.php----------------------------------GETME' rel=\"noopener\">a changed<\/a> <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/macos_say_record.php----------------------------------GETME' rel=\"noopener\">macos_say_record.php<\/a> PHP <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/macos_say_record.php' rel=\"noopener\">Voiceover<\/a> inhouse web application now places a &#8220;say&#8221; voice name in the popup window title<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/subrip_helper.js----GETME\" title=\"subrip_helper.js\" rel=\"noopener\">changed external Javascript helper<\/a> of <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/video_commentary.html\" rel=\"noopener\">&#8220;the peerage&#8221;<\/a> code called <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/subrip_helper.js----GETME\" title=\"subrip_helper.js\" rel=\"noopener\">subrip_helper.js<\/a><\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/stop_start_youtube.html------------------------------------------------GETME\" rel=\"noopener\">the reworked<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/stop_start_youtube.html------------------------------------------------GETME\" rel=\"noopener\">stop_start_youtube.html<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/stop_start_youtube.html\" rel=\"noopener\">inhouse YouTube API interfacer<\/a><\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/speech_supervisor.php-------------------------GETME\" title=\"speech_supervisor.php\" rel=\"noopener\">changed PHP code<\/a> of <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/speech_supervisor.php-------------------------GETME\" title=\"speech_supervisor.php\" rel=\"noopener\">speech_supervisor.php<\/a> with its <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/speech_supervisor.php\" rel=\"noopener\">live run<\/a><\/li>\n<\/ul>\n<p><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Text to Speech YouTube SubRip Subtitles Google Translate Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/video_commentary_gt_aswell.png\" title=\"Text to Speech YouTube SubRip Subtitles Google Translate Tutorial\" style=\"float:left;\"  \/><\/p>\n<p><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Text to Speech YouTube SubRip Subtitles Google Translate Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/video_commentary_gtas_well.png\" title=\"Text to Speech YouTube SubRip Subtitles Google Translate Tutorial\" style=\"float:left;\"  \/><\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/text-to-speech-youtube-subrip-subtitles-google-translate-tutorial\/' rel=\"noopener\">Text to Speech YouTube SubRip Subtitles Google Translate Tutorial<\/a>.<\/p-->\n<hr>\n<p id='tsytsrst'>Previous relevant <a target=\"_blank\" title='Text to Speech YouTube SubRip Subtitles Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/text-to-speech-youtube-subrip-subtitles-tutorial\/' rel=\"noopener\">Text to Speech YouTube SubRip Subtitles Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/video_commentary.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Text to Speech YouTube SubRip Subtitles Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/song_lyric_faux_pas_text_to_speech.gif\" title=\"Text to Speech YouTube SubRip Subtitles Tutorial\" style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Text to Speech YouTube SubRip Subtitles Tutorial<\/p><\/div>\n<p>Yesterday&#8217;s <a title='Speech to Text YouTube SubRip Subtitles External Javascript Tutorial' href='#stytsrsejt'>Speech to Text YouTube SubRip Subtitles External Javascript Tutorial<\/a> &#8230;<\/p>\n<ol>\n<li>staked out, for &#8230;\n<ul>\n<li>non-mobile<\/li>\n<li>Google Chrome<\/li>\n<li>https: protocol<\/li>\n<li>top window<\/li>\n<\/ul>\n<p> &#8230; users the chance to involve Speech to Text within the YouTube SubRip Subtitles &#8220;peerage&#8221; &#8230; getting to the point where the external Javascript was the &#8220;change agent&#8221; &#8230; and so, today we &#8230;<\/li>\n<li>staked out, for &#8230;\n<ul>\n<li>non-mobile<\/li>\n<li>macos local operating system (with it&#8217;s brilliant <a target=\"_blank\" title='say command information from Apple' href='https:\/\/ss64.com\/osx\/say.html' rel=\"noopener\"><i>say<\/i><\/a> command)<\/li>\n<li>MAMP local web server installed to port 8888<\/li>\n<li>inhouse <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/macos_say_record.php---------------------------------GETME' rel=\"noopener\">changed<\/a> <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/macos_say_record.php---------------------------------GETME' rel=\"noopener\">macos_say_record.php<\/a> PHP <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/macos_say_record.php' rel=\"noopener\">Voiceover<\/a> inhouse web application placed in said local macOS Apache\/PHP\/MySql web server such as <a target=\"_blank\" title='MAMP' href='http:\/\/www.mamp.info' rel=\"noopener\">MAMP<\/a>&#8216;s Document Root<\/li>\n<\/ul>\n<p> &#8230; users the chance to involve Text to Speech via macOS say command called by PHP exec within the YouTube SubRip Subtitles &#8220;peerage&#8221; in what we like to think of as an &#8220;Intranet Feeling&#8221; approach &#8230; picking webpage &#8220;real estate&#8221; that we hope does not clash regarding the use of <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/subrip_helper.js---GETME\" title=\"subrip_helper.js\" rel=\"noopener\">changed external Javascript helper code<\/a> of <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/subrip_helper.js---GETME\" title=\"subrip_helper.js\" rel=\"noopener\">subrip_helper.js<\/a><\/li>\n<\/ol>\n<p>Can the Speech to Text hear what the Text to Speech can say<sup><font size=1> in, say, the <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/video_commentary.html\" rel=\"noopener\">Video Commentary<\/a> peerage member<\/font><\/sup>? <img src='http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/subrip_helper_say.png'><\/img> Well, we&#8217;ll leave that little joy of discovery to those users who have the facilities to make all above functional!<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/text-to-speech-youtube-subrip-subtitles-tutorial\/' rel=\"noopener\">Text to Speech YouTube SubRip Subtitles Tutorial<\/a>.<\/p-->\n<hr>\n<p id='stytsrsejt'>Previous relevant <a target=\"_blank\" title='Speech to Text YouTube SubRip Subtitles External Javascript Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/speech-to-text-youtube-subrip-subtitles-external-javascript-tutorial\/' rel=\"noopener\">Speech to Text YouTube SubRip Subtitles External Javascript Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/video_commentary.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Speech to Text YouTube SubRip Subtitles External Javascript Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/video_commentary_speech_to_text.gif\" title=\"Speech to Text YouTube SubRip Subtitles External Javascript Tutorial\" style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Speech to Text YouTube SubRip Subtitles External Javascript Tutorial<\/p><\/div>\n<p>One of &#8220;the YouTube SubRip Subtitles peerage&#8221; went beyond it&#8217;s station yesterday, and we&#8217;ve had a little &#8220;team talk&#8221;&#8221;, of the ilk of &#8230;<\/p>\n<p><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/w6xNAShEq6w?si=rckLAXbyGYzU26g2\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<p> &#8230; where we&#8217;ve been promised it won&#8217;t happen again &#8230;<\/p>\n<blockquote><p>\nFor, at least, <span><a class=\"audioytplay\" target=\"_blank\" title=\"?\" href='https:\/\/www.youtube.com\/watch?v=FzQBOBoPg04' rel=\"noopener\">a week<\/a><\/span>\n<\/p><\/blockquote>\n<p>And so, further to yesterday&#8217;s <a title='Speech to Text YouTube SubRip Subtitles Tutorial' href='#stytsrst'>Speech to Text YouTube SubRip Subtitles Tutorial<\/a> &#8220;break out&#8221; &#8220;the YouTube SubRip Subtitles peerage&#8221; has been brought back into line, not even bothering <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/video_commentary.html\" rel=\"noopener\">the Video Commentary peerage member<\/a> in it&#8217;s work, via &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/song_lyric_faux_pas.html------------GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/song_lyric_faux_pas.html------------GETME\" rel=\"noopener\">song_lyric_faux_pas.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/song_lyric_faux_pas.html\" rel=\"noopener\">web application<\/a> (in it&#8217;s reduced code size guise) &#8230; now more helped out by &#8230;<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/subrip_helper.js--GETME\" title=\"subrip_helper.js\" rel=\"noopener\">changed external Javascript helper code<\/a> of <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/subrip_helper.js--GETME\" title=\"subrip_helper.js\" rel=\"noopener\">subrip_helper.js<\/a><\/li>\n<\/ul>\n<p> &#8230; genericizing (and better modularizing) Speech to Text for this work from here on <font size=1>&#8230; or at least <\/font><span><a class=\"audioytplay\" target=\"_blank\" title=\"?\" href='https:\/\/www.youtube.com\/watch?v=FzQBOBoPg04' rel=\"noopener\">a day, maybe<\/a><\/span>!.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/speech-to-text-youtube-subrip-subtitles-external-javascript-tutorial\/' rel=\"noopener\">Speech to Text YouTube SubRip Subtitles External Javascript Tutorial<\/a>.<\/p-->\n<hr>\n<p id='stytsrst'>Previous relevant <a target=\"_blank\" title='Speech to Text YouTube SubRip Subtitles Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/speech-to-text-youtube-subrip-subtitles-tutorial\/' rel=\"noopener\">Speech to Text YouTube SubRip Subtitles Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/song_lyric_faux_pas.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Speech to Text YouTube SubRip Subtitles Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/song_lyric_faux_pas_speech_to_text.png\" title=\"Speech to Text YouTube SubRip Subtitles Tutorial\" style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Speech to Text YouTube SubRip Subtitles Tutorial<\/p><\/div>\n<p>Do you remember some way back with <a title='Text to Speech macOS Say Large Data Tutorial' href='#tsossldt' rel=\"noopener\">Text to Speech macOS Say Large Data Tutorial<\/a> &#8230;<\/p>\n<blockquote>\n<p>So far, it seems, until today, and we were surprised, we&#8217;d only been thinking &#8230;.<\/p>\n<p><\/p>\n<ul>\n<li>Text to Speech macOS <a target=\"_blank\" title='say command information from Apple' href='https:\/\/ss64.com\/osx\/say.html' rel=\"noopener\"><i>say<\/i><\/a>  &#8230; usage, and expecting success with &#8230; Small <sup>Amounts of<\/sup> Data &#8230; but today, with a future plan in mind we announce &#8230;<\/li>\n<li>Text to Speech macOS say Large Data <sup><font size=1>Mark I<\/font><\/sup><\/li>\n<\/ul>\n<\/blockquote>\n<p> &#8230; an idea we had was the motivation for the recent Text to Speech work?  Part of that &#8220;set of ideas&#8221; was work to do with Speech to Text we only allow functionality interfacing with &#8230;<\/p>\n<ul>\n<li>non-mobile<\/li>\n<li>Google Chrome<\/li>\n<li>https: protocol<\/li>\n<li>top window<\/li>\n<\/ul>\n<p> &#8230; environments.  Today, as a sidestep to the work of yesterday&#8217;s <a title='Text to Speech macOS Say Large Data Local Web Server Tutorial' href='#tsossldlwst'>Text to Speech macOS Say Large Data Local Web Server Tutorial<\/a>, but all part of that same set of ideas, we&#8217;re not there, but starting down that &#8220;integration road&#8221; inspired by the great <a target=\"_blank\" title='Google Web Speech Demonstration' href='https:\/\/www.google.com\/intl\/en\/chrome\/demos\/speech.html' rel=\"noopener\">Google Web Speech Demonstration<\/a>.<\/p>\n<p>Codewise that involved &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/song_lyric_faux_pas.html-----------GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/song_lyric_faux_pas.html-----------GETME\" rel=\"noopener\">song_lyric_faux_pas.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/song_lyric_faux_pas.html\" rel=\"noopener\">web application<\/a><\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/speech_supervisor.php------------------------GETME\" title=\"speech_supervisor.php\" rel=\"noopener\">changed PHP code<\/a> of <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/speech_supervisor.php------------------------GETME\" title=\"speech_supervisor.php\" rel=\"noopener\">speech_supervisor.php<\/a> with its <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/speech_supervisor.php\" rel=\"noopener\">live run<\/a><\/li>\n<li><a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/signature_signature.phpp--------------------GETME' title='signature_signature.js' rel=\"noopener\">signature_signature.php<\/a> PHP <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/signature_signature.php--------------------GETME' title='signature_signature.js' rel=\"noopener\">changed this way<\/a><\/li>\n<\/ul>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/speech-to-text-youtube-subrip-subtitles-tutorial\/' rel=\"noopener\">Speech to Text YouTube SubRip Subtitles Tutorial<\/a>.<\/p-->\n<hr>\n<p id='tsossldlwst'>Previous relevant <a target=\"_blank\" title='Text to Speech macOS Say Large Data Local Web Server Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/text-to-speech-macos-say-large-data-local-web-server-tutorial\/' rel=\"noopener\">Text to Speech macOS Say Large Data Local Web Server Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/macos_say_record.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Text to Speech macOS Say Large Data Local Web Server Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record_button_localhost.png\" title=\"Text to Speech macOS Say Large Data Local Web Server Tutorial\" style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Text to Speech macOS Say Large Data Local Web Server Tutorial<\/p><\/div>\n<p>Are all kludges coming from the &#8220;optimistic side of the mind <i>equation<\/i>&#8220;?  Today, we did one regarding integrating <a target=\"_blank\" title='say command information from Apple' href='https:\/\/ss64.com\/osx\/say.html' rel=\"noopener\">&#8220;say&#8221;<\/a> (which is macOS based only) in <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/macos_say_record.php------------------------------GETME' rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/macos_say_record.php------------------------------GETME' rel=\"noopener\">macos_say_record.php<\/a> PHP <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/macos_say_record.php' rel=\"noopener\">Voiceover<\/a> inhouse web application to a local macOS Apache\/PHP\/MySql web server such as <a target=\"_blank\" title='MAMP' href='http:\/\/www.mamp.info' rel=\"noopener\">MAMP<\/a> to see where we are going with all this, when choosing one of the <a target=\"_blank\" title='say command information from Apple' href='https:\/\/ss64.com\/osx\/say.html' rel=\"noopener\">&#8220;say&#8221;<\/a> dropdown options, public website &#8220;button integration&#8221; via Safari web browser &#8230;<\/p>\n<blockquote><p>\nWhere we ran out of options on server and client sides, and just optimistically presented a button in hope, with the understanding we had insufficient proof that clicking on that button would result in navigation to a legitimate local web server URL such as is on a macOS MAMP local web server environment\n<\/p><\/blockquote>\n<p> &#8230; and wonder whether this is the case?!<\/p>\n<p>Today&#8217;s &#8220;work remit&#8221; was really simple.  On any of the (non argument<sup>ative<\/sup>) simplest public website incarnation calls of our <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/macos_say_record.php' rel=\"noopener\">Voiceover<\/a> inhouse web application we wanted to &#8230;<\/p>\n<ul>\n<li>not present any popup windows (improving on very kludgy efforts of the past) presenting &#8230;<\/li>\n<li>an evidence based logic offering of a (newly presented) &#8220;say&#8221; button, the click of which navigates the user to a (so far just macOS local Apache\/PHP\/MySql web server MAMP port 8888 based) URL able to reach that user&#8217;s local operating system &#8220;say&#8221; command via PHP exec or passthru calls because they&#8217;ve got MAMP installed locally along with having macos_say_record.php local system positioning equate to<br \/>\n<code><br \/>\nHT<font color=black>TP:\/\/localhost:8888\/macos_say_record.php<br \/>\n<\/code>\n<\/li>\n<\/ul>\n<p><font color=blue>Ajax ideas<\/font>, at document.body onload &#8230;<\/p>\n<p>&lt;?php echo &#8221;<br \/>\n<code><br \/>\n var errct=-1, saythere=0;<br \/>\n <br \/>\n function lhchk() {<br \/>\n   if (navigator.userAgent.match(\/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile\/i)) {<br \/>\n     document.getElementById('saysub').style.backgroundColor='lightblue';<br \/>\n   } else {<br \/>\n     document.getElementById('saymode').size='3';<br \/>\n   }<br \/>\n   if (('' + document.URL + '#' + decodeURIComponent(('' + location.hash))).indexOf('media=') != -1) {<br \/>\n     var duisb=(\" . strlen($knownow) . \" &gt; 0 ? '\" . $knownow . \"' : decodeURIComponent(('' + document.URL + '#' + decodeURIComponent(('' + location.hash))).split('media=')[1].split('&JUNKET&')[0].split('#JUNKET#')[0]).replace(\/\\ \/g,'+'));<br \/>\n     if (duisb.indexOf('audio\/') != -1) {<br \/>\n     \/\/alert(duisb);<br \/>\n       \/\/var woa=window.open('', '_blank', 'top=50,left=50,height=400,width=800');<br \/>\n       \/\/woa.document.write('&lt;html&gt;&lt;body&gt;' + '&lt;br&gt;&lt;audio controls&gt;&lt;source type=audio\/' + duisb.split('audio\/')[1].split(';')[0] + ' src=\\\"' + duisb + '\\\"&gt;&lt;\/source&gt;&lt;\/audio&gt;&lt;br&gt;');<br \/>\n       document.getElementById('daudiolater').innerHTML+='&lt;br&gt;&lt;audio controls data-preload=none&gt;&lt;source type=audio\/' + duisb.split('audio\/')[1].split(';')[0] + ' src=\\\"' + duisb + '\\\" data-onerror=\\\"playerError();\\\"&gt;&lt;\/source&gt;&lt;\/audio&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;';<br \/>\n     } else if (duisb.indexOf('video\/') != -1) {<br \/>\n       document.getElementById('daudiolater').innerHTML+='&lt;br&gt;&lt;video controls data-preload=none&gt;&lt;source type=video\/' + duisb.split('video\/')[1].split(';')[0] + ' src=\\\"' + duisb + '\\\" data-onerror=\\\"playerError();\\\"&gt;&lt;\/source&gt;&lt;\/video&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;';<br \/>\n     } else if (duisb.indexOf('image\/') != -1) {<br \/>\n       document.getElementById('daudiolater').innerHTML+='&lt;br&gt;&lt;img src=\\\"' + duisb + '\\\"&gt;&lt;\/img&gt;&lt;br&gt;';<br \/>\n     } else if (duisb.indexOf('_macoshelp_') != -1) {<br \/>\n       document.getElementById('daudiolater').innerHTML+='&lt;br&gt;&lt;audio controls data-preload=none&gt;&lt;source type=audio\/\" . $nowknow . \" src=\\\"' + duisb + '\\\" data-onerror=\\\"playerError();\\\"&gt;&lt;\/source&gt;&lt;\/audio&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;';<br \/>\n     }<br \/>\n   } else if (('' + document.URL + '#' + decodeURIComponent(('' + location.hash))).indexOf('residue=') != -1) {<br \/>\n     document.getElementById('tempidue').value=decodeURIComponent(document.URL.split('tempidue=')[1].split('&')[0].split('#')[0]);<br \/>\n     document.getElementById('residue').value=decodeURIComponent(('' + location.hash)).split('residue=')[1].replace(\/\\ \/g,'+');<br \/>\n     document.getElementById('trsbut').click();<br \/>\n   }<br \/>\n   <br \/>\n   if (document.URL.indexOf('\/\/localhost') == -1 && document.URL.indexOf('?') == -1 && document.URL.indexOf('&') == -1 && document.URL.indexOf('#') == -1) {<br \/>\n     if (!navigator.userAgent.match(\/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile\/i)) {<br \/>\n     if ('notpost' == '\" . $notpost . \"') {<br \/>\n     \/\/opi=window.open('HTTP:\/\/localhost:8888\/macos_say_record.php?areyou=there', 'theproofif');<br \/>\n     <font color=blue>zhr = new XMLHttpRequest();<br \/>\n     zform=new FormData();<br \/>\n     zform.append('areyou', 'there');<br \/>\n     zhr.open('get', 'HTTP:\/\/localhost:8888\/macos_say_record.php', true);<br \/>\n     \/\/zhr.setRequestHeader('Access-Control-Allow-Headers', '*');<br \/>\n     \/\/zhr.setRequestHeader('Access-Control-Allow-Origin', '*');<br \/>\n     \/\/zhr.setRequestHeader('Access-Control-Allow-Methods', 'GET');<br \/>\n     zhr.addEventListener('error', errmampshowStuff);<br \/>\n     zhr.onreadystatechange = mampshowStuff;<br \/>\n     \/\/document.title=' ';<br \/>\n     errct=0;<br \/>\n     zhr.send(zform);<\/font><br \/>\n     setTimeout(maybehthree, 5000);<br \/>\n     }<br \/>\n     }<br \/>\n   } else if (document.URL.indexOf('rjmprogramming.com.au\/macos_say_record.php') != -1 && document.URL.indexOf('?areyou=there') != -1) {<br \/>\n     saythere=saythere; \/\/opi=window.open('\/\/www.rjmprogramming.com.au\/macos_say_record.php?there=youare', 'theproofif');<br \/>\n   } else if (document.URL.indexOf('\/\/localhost') != -1 && document.URL.indexOf('?') == -1 && document.URL.indexOf('#') == -1) {<br \/>\n     saythere=7; \/\/opi=window.open('HTTP:\/\/localhost:8888\/macos_say_record.php?areyou=there', 'theproofif');<br \/>\n   }<br \/>\n }<br \/>\n<br \/> <br \/>\n  function errmampshowStuff(evt) {<br \/>\n  \/\/document.title+=' ' + zhr.readyState + '|' + zhr.status + '|' + zhr.statusText;<br \/>\n  \/\/alert(('response error:', evt.currentTarget.response));<br \/>\n  \/\/console.warn(evt);<br \/>\n  errct++;<br \/>\n  }<br \/>\n <br \/>\n  function mampshowStuff(evt) {<br \/>\n  \/\/document.title+=' ' + zhr.readyState + '\/' + zhr.status + '\/' + zhr.statusText;<br \/>\n  if (zhr.readyState == 4) {<br \/>\n    if (zhr.status == 200) {<br \/>\n     if (1 == 2) { alert(zhr.responseText); }<br \/>\n    }<br \/>\n  }<br \/>\n  }<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<\/p>\n<p> &#8230; supply the tenuous &#8220;evidence based logic&#8221; to then try directly calling the macOS MAMP port 8888 based URL into an iframe &#8230;<\/p>\n<p><code><br \/>\n&lt;iframe data-onerror=alert(564); onload=resproof(this); name=theproofif id=theproofif style=display:none; src='\/About_Us.html'&gt;&lt;\/iframe&gt;<br \/>\n<\/code><\/p>\n<p> &#8230; <font color=blue>via<\/font> &#8230;<\/p>\n<p><code><br \/>\n  function tosay() {<br \/>\n    saythere=6;<br \/>\n    location.href='HTTP:\/\/localhost:8888\/macos_say_record.php';<br \/>\n  }<br \/>\n <br \/>\n  function tosayw() {<br \/>\n    saythere=5;<br \/>\n    opi=window.open('HTTP:\/\/localhost:8888\/macos_say_record.php', '_blank');<br \/>\n  }<br \/>\n <br \/>\n  function tosayp() {<br \/>\n    saythere=4;<br \/>\n    opi=window.open('HTTP:\/\/localhost:8888\/macos_say_record.php', '_blank', 'top=100,left=' + eval(-800 + screen.width) + ',width=800,height=800');<br \/>\n  }<br \/>\n <br \/>\n  function maybehthree() {<br \/>\n     if (errct >= 0 && errct < 3) {\n       console.warn('Errct=' + errct + ' ' + navigator.userAgent);\n       if (navigator.userAgent.indexOf('Safari') != -1) {\n       document.getElementById('myh3').innerHTML+=' <button style=display:inline-block; id=locbutone title=Clobber onclick=tosay();> ... say<\/button><sup id=locbuttwo style=text-decoration:underline;cursor:pointer;display:inline-block; title=Window onclick=tosayw();>+<\/sup><sup id=locbutthree title=Popup style=text-decoration:underline;cursor:pointer;display:inline-block; onclick=tosayp();>+<\/sup>';<br \/>\n       } else {<br \/>\n       document.getElementById('myh3').innerHTML+=' <button style=display:none; id=locbutone title=Clobber onclick=tosay();> ... say<\/button><sup id=locbuttwo style=text-decoration:underline;cursor:pointer;display:none; title=Window onclick=tosayw();>+<\/sup><sup id=locbutthree title=Popup style=text-decoration:underline;cursor:pointer;display:none; onclick=tosayp();>+<\/sup>';<br \/>\n       }<br \/>\n       <font color=blue>try {<br \/>\n       if (navigator.userAgent.indexOf('Safari') != -1) {<br \/>\n       window.open('HTTP:\/\/localhost:8888\/macos_say_record.php?areyou=there', 'theproofif');<br \/>\n       } else {<br \/>\n       document.getElementById('theproofif').src='HTTP:\/\/localhost:8888\/macos_say_record.php?areyou=there';<br \/>\n       }<br \/>\n       } catch(rteqwe) {<br \/>\n       if (1 == 4) { alert('iferr'); }<br \/>\n       }<\/font><br \/>\n       saythere=1;<br \/>\n     } else {<br \/>\n       console.warn('errct=' + errct + ' ' + navigator.userAgent);<br \/>\n     }<br \/>\n  }<br \/>\n <br \/>\n function resproof(iois) {<br \/>\n   if (iois != null) {<br \/>\n       console.warn('erRct=' + errct + ' ' + navigator.userAgent);<br \/>\n   \/\/alert(1);<br \/>\n   var aconto = (iois.contentWindow || iois.contentDocument);<br \/>\n   \/\/alert(2);<br \/>\n       console.warn('erRCt=' + errct + ' ' + navigator.userAgent);<br \/>\n   if (aconto != null) {<br \/>\n   \/\/alert(3);<br \/>\n      \/\/document.getElementById('myh3').innerHTML+='=';<br \/>\n       console.warn('ErRct=' + errct + ' ' + navigator.userAgent);<br \/>\n   if (document.getElementById('locbutone') && ('' + iois.src).replace('_proof','_record.php').indexOf('\/macos_say_record.php') != -1 && ('' + iois.src).indexOf('\/\/localhost') != -1) {<br \/>\n      \/\/document.getElementById('myh3').innerHTML+='+';<br \/>\n       console.warn('ErRcT=' + errct + ' ' + navigator.userAgent);<br \/>\n      if (document.URL.indexOf('\/\/localhost') == -1 && iois.src.indexOf('\/\/localhost') != -1 && iois.src.indexOf('?areyou=there') != -1) {<br \/>\n        \/\/alert('here ' + iois.src);<br \/>\n       console.warn('ERRCT = ' + errct + ' ' + navigator.userAgent);<br \/>\n        document.getElementById('locbutone').style.display='inline-block';<br \/>\n        document.getElementById('locbuttwo').style.display='inline-block';<br \/>\n        document.getElementById('locbutthree').style.display='inline-block';<br \/>\n        saythere=2;<br \/>\n      }<br \/>\n   }<br \/>\n   if (aconto.document) { aconto = aconto.document; }<br \/>\n   \/\/alert(4);<br \/>\n      \/\/document.getElementById('myh3').innerHTML+='-';<br \/>\n       console.warn('ErRCt=' + errct + ' ' + navigator.userAgent);<br \/>\n   if (aconto.body != null) {<br \/>\n      \/\/document.getElementById('myh3').innerHTML+='@';<br \/>\n       console.warn('ERRct=' + errct + ' ' + navigator.userAgent);<br \/>\n   \/\/alert(5);<br \/>\n   if (('' + iois.src).replace('_proof','_record.php').indexOf('\/macos_say_record.php') != -1 && ('' + iois.src).indexOf('\/\/localhost') != -1) {<br \/>\n      \/\/document.getElementById('myh3').innerHTML+='+';<br \/>\n       console.warn('ERRCt=' + errct + ' ' + navigator.userAgent);<br \/>\n      if (document.getElementById('locbutone') && document.URL.indexOf('\/\/localhost') == -1 && ('' + iois.src).replace('_proof','_record.php').indexOf('\/macos_say_record.php') != -1 && iois.src.indexOf('?areyou=there') != -1) {<br \/>\n       console.warn('ERRCT=' + errct + ' ' + navigator.userAgent);<br \/>\n        \/\/alert('here ' + iois.src);<br \/>\n        document.getElementById('locbutone').style.display='inline-block';<br \/>\n        document.getElementById('locbuttwo').style.display='inline-block';<br \/>\n        document.getElementById('locbutthree').style.display='inline-block';<br \/>\n        saythere=3;<br \/>\n      }<br \/>\n   }<br \/>\n   }<br \/>\n   }<br \/>\n   }<br \/>\n }<br \/>\n<\/code><\/p>\n<p> &#8230; adding this idea onto the progress of yesterday&#8217;s <a title='Text to Speech macOS Say Large Data Sharing Tutorial' href='#tsossldst'>Text to Speech macOS Say Large Data Sharing Tutorial<\/a>.<\/p>\n<p>Satisfying not resorting to kludgy popup window involvement, but only sidestepping <a target=\"_blank\" title='CORS information from Wikipedia ... thanks' href='https:\/\/en.wikipedia.org\/wiki\/Cross-origin_resource_sharing' rel=\"noopener\">CORS<\/a> issues working with a cross-domain scenario, rather than a scientific and rigorous solution.  Sometimes needs must?!<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/new-text-to-speech-macos-say-large-data-sharing-tutorial\/' rel=\"noopener\">Text to Speech macOS Say Large Data Sharing Tutorial<\/a>.<\/p-->\n<hr>\n<p id='tsossldst'>Previous relevant <a target=\"_blank\" title='Text to Speech macOS Say Large Data Sharing Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/text-to-speech-macos-say-large-data-sharing-tutorial\/' rel=\"noopener\">Text to Speech macOS Say Large Data Sharing Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/macos_say_record.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Text to Speech macOS Say Large Data Sharing Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/macos_say_record_localhost_up.png\" title=\"Text to Speech macOS Say Large Data Sharing Tutorial\" style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Text to Speech macOS Say Large Data Sharing Tutorial<\/p><\/div>\n<p>Part of improving a web application regarding &#8220;large data&#8221; is offering some sharing functionality for &#8220;large data&#8221; scenarios, but this project we have learnt, it being unique regarding the &#8220;macOS only <a target=\"_blank\" title='say command information from Apple' href='https:\/\/ss64.com\/osx\/say.html' rel=\"noopener\"><i>say<\/i><\/a>&#8221; aspects to it, have taught us not to go overboard trying to cater for everything here.  Yesterday&#8217;s <a title='Text to Speech macOS Say Large Data Tutorial' href='#tsossldt'>Text to Speech macOS Say Large Data Tutorial<\/a> got us started regarding &#8220;large data&#8221; scenarios where it was just designed for the single user usage.  This does not require the transfer of data from that macOS local web browser environment up to a pubic website (Linux) web server environment, involving audio files that can become too large for comfort, often, here.<\/p>\n<p>Our biggest dilemma in this work was, so far in testing we found, only the Firefox web browser would accept either of &#8230;<\/p>\n<ul>\n<li>&#8220;a&#8221; &#8220;mailto:&#8221; link of too big a length involving the audio data URI contained in a hashtag, initiated from localhost MAMP environment<\/li>\n<li>call of public website version of macos_say_record.php involving the audio data URI contained in a hashtag, initiated from localhost MAMP environment<\/li>\n<\/ul>\n<p> &#8230; else the all too common &#8230;<\/p>\n<p><code><br \/>\nabout:blank#blocked<br \/>\n<\/code><\/p>\n<p> &#8230; would stymie our efforts in &#8220;large data&#8221; scenarios, where audio data URIs appear within the email link URL hashtag part.  Guess we just lost 80% of the audience <font size=1>(except if we tell you now we rely less on audio data URIs appearing within the email link URL hashtag part)<\/font>.  But we really wish users would not get spooked by seeing &#8220;about:blank#blocked&#8221; and think there is anything sinister necessarily, but rather try new web browsers, and try new ways of using free tools.  What we are trying to show here, in a free way, is a bit of a way in to some aspects of what people refer to as &#8220;artificial intelligence&#8221; coming &#8220;out of the box&#8221; from an operating system.  No service fee &#8230; just what should be happening from big players down to users on the Internet.  It should be applauded, rather than suspected regarding &#8220;kludginess&#8221;, because the software basis is free, in contrast to the squillions of services popping up that are far from free.<\/p>\n<p>Anyway, you can try downloading <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/macos_say_record.php-----------------------------GETME' rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/macos_say_record.php-----------------------------GETME' rel=\"noopener\">macos_say_record.php<\/a> PHP <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/macos_say_record.php' rel=\"noopener\">Voiceover<\/a> inhouse web application to a local macOS Apache\/PHP\/MySql web server such as <a target=\"_blank\" title='MAMP' href='http:\/\/www.mamp.info' rel=\"noopener\">MAMP<\/a> to see where we are going with all this, when choosing one of the &#8220;say&#8221; dropdown options, via &#8230;<\/p>\n<p><code><br \/>\nHT<font color=black>TP:\/\/localhost:8888\/macos_say_record.php<br \/>\n<\/code><\/p>\n<p> &#8230; say?!<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/text-to-speech-macos-say-large-data-sharing-tutorial\/' rel=\"noopener\">Text to Speech macOS Say Large Data Sharing Tutorial<\/a>.<\/p-->\n<hr>\n<p id='tsossldt'>Previous relevant <a target=\"_blank\" title='Text to Speech macOS Say Large Data Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/text-to-speech-macos-say-large-data-tutorial\/' rel=\"noopener\">Text to Speech macOS Say Large Data Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/macos_say_record.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Text to Speech macOS Say Large Data Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/text_to_speech_multiple_lines.gif\" title=\"Text to Speech macOS Say Large Data Tutorial\" style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Text to Speech macOS Say Large Data Tutorial<\/p><\/div>\n<p>So far, it seems, until today, and we were surprised, we&#8217;d only been thinking &#8230;.<\/p>\n<ul>\n<li>Text to Speech macOS <a target=\"_blank\" title='say command information from Apple' href='https:\/\/ss64.com\/osx\/say.html' rel=\"noopener\"><i>say<\/i><\/a>  &#8230; usage, and expecting success with &#8230; Small <sup>Amounts of<\/sup> Data &#8230; but today, with a future plan in mind we announce &#8230;<\/li>\n<li>Text to Speech macOS say Large Data <sup><font size=1>Mark I<\/font><\/sup><\/li>\n<\/ul>\n<p> &#8230; where you feed the wonderful macOS say command a whole block of code, say?!  We did this in all innocence earlier today and &#8230; gasp &#8230; it failed.<\/p>\n<p>Since then though, we&#8217;ve chipped away at some of the issues and discovered two ideas &#8230;<\/p>\n<ol>\n<li>for huge amounts of data the macOS say command has a useful &#8230;<br \/>\n<code><br \/>\n -f [inputFileName]<br \/>\n<\/code><br \/>\n &#8230; switch idea and for &#8230;<\/li>\n<li>command lines avoiding the use of &#8221; or &#8216; initial delimitation we can use backslash character escaping for those ascii characters less than (32 for) space<\/li>\n<\/ol>\n<p>There&#8217;s more to &#8220;large data&#8221; issues in this <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/macos_say_record.php----------------------------GETME' rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/macos_say_record.php----------------------------GETME' rel=\"noopener\">macos_say_record.php<\/a> PHP <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/macos_say_record.php' rel=\"noopener\">Voiceover<\/a> inhouse web application (that we last talked about with <a title='Haiku Image Tutorial' href='#hit'>Haiku Image Tutorial<\/a>) than this start today, but it is an encouraging start for our idea&#8217;s progression.<\/p>\n<p>Why do we mention macOS when our public web server is Linux, in terms of operating systems?  Yes, this work presupposes you have a macOS operating system in your life, because that is where you see the &#8230;<\/p>\n<p><code><br \/>\nsay<br \/>\n<\/code><\/p>\n<p> &#8230; command in its natural environment.  Not a pretty sight at times &#8230;<\/p>\n<blockquote><p>\nDown, I say.  &#8220;Say&#8221;, I down.\n<\/p><\/blockquote>\n<p> &#8230; but if you stick to the correct feeding times, well &#8230; you may just reap the benefits on a local Apache\/PHP\/MySql web server environment such as <a target=\"_blank\" title='MAMP' href='http:\/\/www.mamp.info' rel=\"noopener\">MAMP<\/a> where we have our macos_say_record.php accessing passthru or exec accessing say via URL &#8230;<\/p>\n<p><code><br \/>\nHT<font color=black>TP:\/\/localhost:8888\/macos_say_record.php<br \/>\n<\/code><\/p>\n<p> &#8230; where the macOS &#8220;out of the box&#8221; say command, among other Voiceover ideas, is in play as the great Text to Speech tool that it is.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/text-to-speech-macos-say-large-data-tutorial\/' rel=\"noopener\">Text to Speech macOS Say Large Data Tutorial<\/a>.<\/p-->\n<hr>\n<p id='hit'>Previous relevant <a target=\"_blank\" title='Haiku Image Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/haiku-image-tutorial\/' rel=\"noopener\">Haiku Image Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Haiku Image Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif_cowsay.gif\" title=\"Haiku Image Tutorial\" style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Haiku Image Tutorial<\/p><\/div>\n<p>Were you around when <a title='Python Cowsay API Cartoon Speech Media Tutorial' href='#pcapicsmt'>Python Cowsay API Cartoon Speech Media Tutorial<\/a>&#8216;s &#8220;genesis tutorial&#8221; called <a title='Python Cowsay API Primer Tutorial' href='#pcapipt' rel=\"noopener\">Python Cowsay API Primer Tutorial<\/a> intimated &#8230;<\/p>\n<blockquote><p>\n &#8230; with an integration purpose in mind\n<\/p><\/blockquote>\n<p>?  And then, sometime between then and now were you a &#8220;Doubting Thomas&#8221; thinking we&#8217;d forgotten about that statement?  And while we&#8217;re at it, where were you on  February 6, 2025 03:01 AEST?<\/p>\n<p>I&#8217;m conflicted if your answers are &#8220;No&#8221; and &#8220;Robbing a bank&#8221; but, be that as it may, &#8220;we did have an integration purpose in mind&#8221; and we&#8217;ve come back to it via Haiku poetry, and a web application we wrote some time ago regarding them, and it interfaced to the theme of &#8220;the integration purpose in mind&#8221; <font size=1>&#8230; well you had to be there, said <a style='cursor:pointer;text-decoration:underline;' onmouseover=\"document.getElementById('ifputricia').style.display='block';\" ontouchstart=\"document.getElementById('ifputricia').style.display='block';\">Putricia<\/a>?!<\/font><\/p>\n<p><iframe loading=\"lazy\" id=ifputricia style=\"display:none;\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/1UKMzLBW7to?si=mu75SAGuezW2iQSo\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<p>Yes, it&#8217;s the case that hoping for the umpteenth re-researching whether <i>anything manageable Linux wise<\/i> can match what <i>the great macOS say command<\/i> has done for Speech to Text relations since Audrey Hepburn&#8217;s <a target=\"_blank\" title='?' href='https:\/\/www.youtube.com\/watch?v=yKiE9MZs_Gw' rel=\"noopener\">speech<\/a> &#8230; and coming back with a &#8220;No&#8221; <a target=\"_blank\" title=\"?\" href='https:\/\/www.youtube.com\/watch?v=e9_7GcQeiqw&#038;t=2m37s' rel=\"noopener\">yet again<\/a> &#8230; we started looking at it a bit more laterally and thought &#128540;&#x1F61C; &#8230;<\/p>\n<blockquote><p>\nBut what would the Cow say?\n<\/p><\/blockquote>\n<p>But seriously, no, we just stumbled onto the wonderful <a target=\"_blank\" title='Python cowsay' href='https:\/\/pypi.org\/project\/cowsay\/' rel=\"noopener\"><i>cowsay<\/i><\/a> Python API \/ Command-line tool and wanted to &#8230; thinking laterally &#8230; have &#8220;cowsay&#8221; smarts be included into <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/macos_say_record.php---------------------------GETME' rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/macos_say_record.php---------------------------GETME' rel=\"noopener\">macos_say_record.php<\/a> PHP <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/macos_say_record.php' rel=\"noopener\">Voiceover<\/a> inhouse web application, itself interfaced to by <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html----------GETME' rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html----------GETME' rel=\"noopener\">haiku_animated_gif.html<\/a> <a targety=_blank href='https:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html'>Haiku creating inhouse web application<\/a> you can also try below &#8230;<\/p>\n<p><iframe style='width:100%;height:800px;' src='\/\/www.rjmprogramming.com.au\/PHP\/animegif\/haiku_animated_gif.html'><\/iframe><\/p>\n<p> &#8230; so that <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/cowsay.php---------GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/cowsay.php---------GETME\" rel=\"noopener\">latest draft<\/a> can interface in a popup window scenario.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/haiku-image-tutorial\/' rel=\"noopener\">Haiku Image Tutorial<\/a>.<\/p-->\n<hr>\n<p id='pcapicsmt'>Previous relevant <a target=\"_blank\" title='Python Cowsay API Cartoon Speech Media Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/python-cowsay-api-cartoon-speech-media-tutorial\/' rel=\"noopener\">Python Cowsay API Cartoon Speech Media Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Python Cowsay API Cartoon Speech Media Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/cowsay_media.gif\" title=\"Python Cowsay API Cartoon Speech Media Tutorial\" style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Python Cowsay API Cartoon Speech Media Tutorial<\/p><\/div>\n<p>As soon as a web application talks about image slides, as we have been dealing with allowing for the creation of cartoons with our recent <a target=\"_blank\" title='Python cowsay' href='https:\/\/pypi.org\/project\/cowsay\/' rel=\"noopener\"><i>cowsay<\/i><\/a> Python API \/ Command-line tool interfacing PHP <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\">web application<\/a>, maybe as <a target=\"blank\" title='Louis Lumi\u00e8re information from Wikipedia ... thanks' href='https:\/\/en.wikipedia.org\/wiki\/Louis_Lumi%C3%A8re' rel=\"noopener\">Louis Lumi\u00e8re<\/a> did many years ago, it brings out media thoughts regarding &#8220;moving pictures&#8221;.  We use, here, at our RJM Programming AlmaLinux web server, the great Open Source <a target=\"_blank\" title='ffmpeg' href='https:\/\/www.ffmpeg.org\/' rel=\"noopener\">ffmpeg<\/a> to help create such media, in today&#8217;s case &#8230;<\/p>\n<ul>\n<li><font color=blue>video<\/font><\/li>\n<li><font color=purple>animated GIF<\/font><\/li>\n<\/ul>\n<p> &#8230; productions using those image slides created via the <font size=1>(again, Open Source)<\/font>  <a target=\"_blank\" title='Python cowsay' href='https:\/\/pypi.org\/project\/cowsay\/' rel=\"noopener\"><i>cowsay<\/i><\/a> Python API \/ Command-line tool &#8230;<\/p>\n<p>&lt;?php<br \/>\n<code><br \/>\n   if (isset($_GET['getvideo'])) {<br \/>\n     $lenv='1';<br \/>\n     if (isset($_GET['len'])) {<br \/>\n       $lenv=$_GET['len'];<br \/>\n     }<br \/>\n     if ($_GET['getvideo'] == '1' && $lenv == '0') {<br \/>\n     echo \"&lt;html&gt;&lt;body onload=\\\" if (parent.document.getElementById('divvideo')) {  parent.document.getElementById('divvideo').innerHTML='&lt;video id=myvideo controls&gt;&lt;source id=mysource type=video\/mp4 src=' + String.fromCharCode(39) + 'data:video\/mp4;base64,\" . base64_encode(file_get_contents('\/tmp\/video' . server_remote_addr() . '.mp4')) . \"' + String.fromCharCode(39) + '&gt;&lt;\/source&gt;&lt;\/video&gt;'; } else if (parent.document.getElementById('mysource')) { parent.document.getElementById('mysource').src='data:video\/mp4;base64,\" . base64_encode(file_get_contents('\/tmp\/video' . server_remote_addr() . '.mp4')) . \"';  } else { parent.document.getElementById('divmedia').innerHTML+='&lt;br&gt;&lt;br&gt;&lt;p id=pvd&gt;Video version below ... &lt;a style=display:inline-block; href=#myh1&gt;Back to top ...&lt;\/a&gt;&lt;\/p&gt;&lt;br&gt;&lt;div id=divvideo&gt;&lt;video id=myvideo controls&gt;&lt;source id=mysource type=video\/mp4 src=' + String.fromCharCode(39) + 'data:video\/mp4;base64,\" . base64_encode(file_get_contents('\/tmp\/video' . server_remote_addr() . '.mp4')) . \"' + String.fromCharCode(39) + '&gt;&lt;\/source&gt;&lt;\/video&gt;&lt;\/div&gt;'; } setTimeout(function(){ parent.document.getElementById('pvd').scrollIntoView(); }, 2000); \\\"&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n     } else {<br \/>\n     if (file_exists('\/tmp\/video' . server_remote_addr() . '.mp4')) {<br \/>\n       unlink('\/tmp\/video' . server_remote_addr() . '.mp4');<br \/>\n     }<br \/>\n     exec('<font color=blue>ffmpeg -framerate 2 -i \/tmp\/slide_' . server_remote_addr() . '-%03d.png -vcodec libx264 -crf 22 \/tmp\/video' . server_remote_addr() . '.mp4<\/font>');<br \/>\n     echo \"&lt;html&gt;&lt;body onload=\\\" if (parent.document.getElementById('divvideo')) {  parent.document.getElementById('divvideo').innerHTML='&lt;video id=myvideo controls&gt;&lt;source id=mysource type=video\/mp4 src=' + String.fromCharCode(39) + 'data:video\/mp4;base64,\" . base64_encode(file_get_contents('\/tmp\/video' . server_remote_addr() . '.mp4')) . \"' + String.fromCharCode(39) + '&gt;&lt;\/source&gt;&lt;\/video&gt;'; } else if (parent.document.getElementById('mysource')) { parent.document.getElementById('mysource').src='data:video\/mp4;base64,\" . base64_encode(file_get_contents('\/tmp\/video' . server_remote_addr() . '.mp4')) . \"';  } else { parent.document.getElementById('divmedia').innerHTML+='&lt;br&gt;&lt;br&gt;&lt;p id=pvd&gt;Video version below ... &lt;a style=display:inline-block; href=#myh1&gt;Back to top ...&lt;\/a&gt;&lt;\/p&gt;&lt;br&gt;&lt;div id=divvideo&gt;&lt;video id=myvideo controls&gt;&lt;source id=mysource type=video\/mp4 src=' + String.fromCharCode(39) + 'data:video\/mp4;base64,\" . base64_encode(file_get_contents('\/tmp\/video' . server_remote_addr() . '.mp4')) . \"' + String.fromCharCode(39) + '&gt;&lt;\/source&gt;&lt;\/video&gt;&lt;\/div&gt;'; } setTimeout(function(){ parent.document.getElementById('pvd').scrollIntoView(); }, 2000); \\\"&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n     }<br \/>\n     exit;<br \/>\n   } else if (isset($_GET['getagif'])) {<br \/>\n     $lenv='1';<br \/>\n     if (isset($_GET['len'])) {<br \/>\n       $lenv=$_GET['len'];<br \/>\n     }<br \/>\n     if ($_GET['getvideo'] == '1' && $lenv == '0') {<br \/>\n     echo \"&lt;html&gt;&lt;body onload=\\\" if (parent.document.getElementById('mygif')) { parent.document.getElementById('mygif').src='data:image\/gif;base64,\" . base64_encode(file_get_contents('\/tmp\/agif' . server_remote_addr() . '.gif')) . \"';  } else { parent.document.getElementById('divmedia').innerHTML+='&lt;br&gt;&lt;br&gt;&lt;p id=pag&gt;Animated GIF version below ... &lt;a style=display:inline-block; href=#myh1&gt;Back to top ...&lt;\/a&gt;&lt;\/p&gt;&lt;br&gt;&lt;img id=mygif src=data:image\/gif;base64,\" . base64_encode(file_get_contents('\/tmp\/agif' . server_remote_addr() . '.gif')) . \"&gt;&lt;\/img&gt;'; }   setTimeout(function(){ parent.document.getElementById('pag').scrollIntoView(); }, 2000);   \\\"&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n     } else {<br \/>\n     if (file_exists('\/tmp\/agif' . server_remote_addr() . '.gif')) {<br \/>\n       unlink('\/tmp\/agif' . server_remote_addr() . '.gif');<br \/>\n     }<br \/>\n     exec('<font color=purple>ffmpeg -framerate 2 -i \/tmp\/slide_' . server_remote_addr() . '-%03d.png \/tmp\/agif' . server_remote_addr() . '.gif<\/font>');<br \/>\n     echo \"&lt;html&gt;&lt;body onload=\\\" if (parent.document.getElementById('mygif')) { parent.document.getElementById('mygif').src='data:image\/gif;base64,\" . base64_encode(file_get_contents('\/tmp\/agif' . server_remote_addr() . '.gif')) . \"';  } else { parent.document.getElementById('divmedia').innerHTML+='&lt;br&gt;&lt;br&gt;&lt;p id=pag&gt;Animated GIF version below ... &lt;a style=display:inline-block; href=#myh1&gt;Back to top ...&lt;\/a&gt;&lt;\/p&gt;&lt;br&gt;&lt;img id=mygif src=data:image\/gif;base64,\" . base64_encode(file_get_contents('\/tmp\/agif' . server_remote_addr() . '.gif')) . \"&gt;&lt;\/img&gt;'; }   setTimeout(function(){ parent.document.getElementById('pag').scrollIntoView(); }, 2000);   \\\"&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n     }<br \/>\n     exit;<br \/>\n   }<br \/>\n<\/code><br \/>\n?&gt;<\/p>\n<p> &#8230; as a new optional piece of additional functionality offered in <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/cowsay.php----GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/cowsay.php----GETME\" rel=\"noopener\">&#8220;fifth draft&#8221;<\/a> <font size=1>(picking up from <a title='Python Cowsay API Cartoon Speech Content Tutorial' href='#pcapicsct'>Python Cowsay API Cartoon Speech Content Tutorial<\/a>&#8216;s fourth draft, and further to yesterday&#8217;s <a title='Text to Image via ImageMagick Primer Tutorial' href='#tiimpt' rel=\"noopener\">Text to Image via ImageMagick Primer Tutorial<\/a>)<\/font> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\">Cartoon creation and email sharing capable<\/a> PHP web application you can also <a href='#ifcart'>try below<\/a>. <\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/python-cowsay-api-cartoon-speech-media-tutorial\/' rel=\"noopener\">Python Cowsay API Cartoon Speech Media Tutorial<\/a>.<\/p-->\n<hr>\n<p id='tiimpt'>Previous relevant <a target=\"_blank\" title='Text to Image via ImageMagick Primer Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/text-to-image-via-imagemagick-primer-tutorial\/' rel=\"noopener\">Text to Image via ImageMagick Primer Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/text_to_image.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Text to Image via ImageMagick Primer Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/\/text_to_image.gif\" title=\"Text to Image via ImageMagick Primer Tutorial\" style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Text to Image via ImageMagick Primer Tutorial<\/p><\/div>\n<p>Why would a &#8220;Primer&#8221; tutorial point at a &#8220;well along the way&#8221; one?  Well, a few reasons really &#8230;<\/p>\n<ul>\n<li>the &#8220;Primer&#8221; concept of Text to Images (as an <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/text_to_image.html-GETME\" rel=\"noopener\">early days<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/text_to_image.html\" rel=\"noopener\">web application<\/a> possibility) only happened because of yesterday&#8217;s <a title='Python Cowsay API Cartoon Speech Content Tutorial' href='#pcapicsct'>Python Cowsay API Cartoon Speech Content Tutorial<\/a>&#8216;s work &#8230;<\/li>\n<li>the inhouse Text to Images web application calls on the <a target=\"_blank\" title='Python cowsay' href='https:\/\/pypi.org\/project\/cowsay\/' rel=\"noopener\"><i>cowsay<\/i><\/a> Python API \/ Command-line tool interfacing PHP web application of yesterday (via <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/cowsay.php-----GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/cowsay.php-----GETME\" rel=\"noopener\">latest draft<\/a> cowsay.php code) &#8230; and that &#8230;<\/li>\n<li>called PHP now not only involves Python but a part of today&#8217;s Text to Images logic calls on Perl (when trying to display emoji characters <font size=1>(and is imperfect, by the way, but <a target=\"_blank\" title='Useful link' href='https:\/\/usage.imagemagick.org\/text\/#unicode' rel=\"noopener\">thanks for the heads up<\/a>)<\/font>) &#8230; which can only mean <strike>36.3<\/strike> <font size=1>&#8230; sorry &#8230;<\/font> <strong>1<\/strong> thing &#8230;<br \/>\n<blockquote><p>\nThe Three P&#8217;s &#8230; <a target=\"_blank\" title='?' href='https:\/\/www.youtube.com\/watch?v=fw7p7tAdVuE' rel=\"noopener\">ride again!<\/a>\n<\/p><\/blockquote>\n<\/li>\n<\/ul>\n<p>Yes, the great <a target=\"_blank\" href='https:\/\/imagemagick.org' title='ImageMagick' rel=\"noopener\">ImageMagick<\/a> <font size=1>(and we&#8217;re using it&#8217;s command line &#8220;convert&#8221; command here to make this happen)<\/font> can convert text to images (ie. HTML img elements).  Now, we&#8217;re not saying you always get perfect matches here, but it is akin to mere mortal dreamers think of as &#8220;intelligent scanning&#8221;.  So, we wanted to have this sidetrack, and we will be resuming &#8220;normal transmission&#8221; <a style=text-decoration:underline;cursor:pointer; onmouseover=\"document.getElementById('npb').style.display='block'; document.getElementById('ifnpb').style.display='block';\" onclick=\"document.getElementById('npb').style.display='block'; document.getElementById('ifnpb').style.display='block';\">shortly?!<\/a><\/p>\n<p><img style=display:none; id=npb src='\/nala_praise_be.jpg'><\/img><\/p>\n<p><iframe style=display:none;width:100%;height:900px; id=ifnpb src='\/\/www.rjmprogramming.com.au\/text_to_image.html'><\/iframe><\/p>\n<p>We&#8217;ll leave you with some <i>cowsay.php<\/i> new relevant PHP code to ponder &#8230;<\/p>\n<p>&lt;?php<br \/>\n<code><br \/>\n   if (isset($_GET['fontlist'])) {<br \/>\n     $selpop='';<br \/>\n     if (!file_exists('\/tmp\/imfl.txt')) {<br \/>\n         exec('convert -list font &gt; \/tmp\/imfl.txt');<br \/>\n     }<br \/>\n     $fcont=file_get_contents('\/tmp\/imfl.txt');<br \/>\n     if (strpos($fcont, 'family: ') !== false) {<br \/>\n       $fcs=explode('family: ', $fcont);<br \/>\n       for ($iuy=1; $iuy&lt;sizeof($fcs); $iuy++) {<br \/>\n        if (strpos($selpop, '&gt;' . explode(\"\\n\", $fcs[$iuy])[0] . '&lt;') === false) {<br \/>\n         $selpop.=\"\\n selo.innerHTML+='&lt;option value=' + String.fromCharCode(39) + '\" . explode(\"\\n\", $fcs[$iuy])[0] . \"' + String.fromCharCode(39) + '&gt;\" . explode(\"\\n\", $fcs[$iuy])[0] . \"&lt;\/option&gt;'; \\n\";<br \/>\n        }<br \/>\n       }<br \/>\n       if ($selpop != '') {<br \/>\n         echo \"&lt;html&gt;&lt;body onload=\\\" var selos=parent.document.getElementsByTagName('select'); if (eval('' + selos.length) &gt; 0) { var selo=selos[eval(-1 + selos.length)];  \" . $selpop . \" selo.style.display='inline-block';  selo.style.backgroundColor='#f0f0f0';   } \\\"&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n       }<br \/>\n     }<br \/>\n     exit;<br \/>\n   } else if (isset($_POST['text'])) {<br \/>\n     $perlemoji='';<br \/>\n     $emojilabbit=\"@- \";  \/\/ vs perl<br \/>\n     $iex='png';<br \/>\n     $fnt='Courier';<br \/>\n     $wdt='800';<br \/>\n     $hgt='800';<br \/>\n     $psiz='36';<br \/>\n     $fcol='black';<br \/>\n     $bcol='white';<br \/>\n     if (isset($_POST['ext'])) {  $iex=str_replace('+',' ',urldecode($_POST['ext']));  }<br \/>\n     if (isset($_POST['ffam'])) {  $fnt=str_replace('+',' ',urldecode($_POST['ffam']));  }<br \/>\n     if (isset($_POST['width'])) {  $pwdt=str_replace('+',' ',urldecode($_POST['width']));  }<br \/>\n     if (isset($_POST['height'])) {  $hgt=str_replace('+',' ',urldecode($_POST['height']));  }<br \/>\n     if (isset($_POST['ptsize'])) {  $psiz=str_replace('+',' ',urldecode($_POST['ptsize']));  }<br \/>\n     if (isset($_POST['fcol'])) {  $fcol=str_replace('+',' ',urldecode($_POST['fcol']));  }<br \/>\n     if (isset($_POST['bcol'])) {  $bcol=str_replace('+',' ',urldecode($_POST['bcol']));  }<br \/>\n     $slidename='\/tmp\/imagerequest_' . server_remote_addr() . '-0.' . $iex;<br \/>\n     file_put_contents('\/tmp\/imagerequest_' . server_remote_addr() . '-0.txt', str_replace('+',' ',urldecode($_POST['text'])));<br \/>\n     file_put_contents('\/tmp\/maybeemojisP.txt', htmlspecialchars(str_replace('+',' ',urldecode($_POST['text'])), ENT_COMPAT,'UTF-8', true));<br \/>\n     \/\/ yes no &amp;#129684;<br \/>\n     if (strpos(str_replace('+',' ',urldecode($_POST['text'])), '&amp;#') !== false || strpos(str_replace('+',' ',urldecode($_POST['text'])), '&amp;#') !== false) {  \/\/ thanks to https:\/\/usage.imagemagick.org\/text\/#unicode<br \/>\n         $outsofar=''; \/\/ '\\x{201C}Unicode \\x{2018}\\x{263A}\\x{2019} Please\\x{201D}'<br \/>\n         if (strpos(str_replace('+',' ',urldecode($_POST['text'])), '&amp;#') !== false) {<br \/>\n           $outs=explode('&amp;#', str_replace('+',' ',urldecode($_POST['text'])));<br \/>\n           $outsofar=$outs[0];<br \/>\n           for ($ivx=1; $ivx&lt;sizeof($outs); $ivx++) {<br \/>\n             $decis=explode(';', $outs[$ivx])[0];<br \/>\n             if (str_replace('0','',str_replace('1','',str_replace('2','',str_replace('3','',str_replace('4','',str_replace('5','',str_replace('6','',str_replace('7','',str_replace('8','',str_replace('9','',$decis)))))))))) != '') {<br \/>\n             if (substr(strtolower($decis),0,1) == 'x') {<br \/>\n             $outsofar.=\"\\\\x{\" . substr($decis,1) . \"}\";<br \/>\n             } else {<br \/>\n             $outsofar.=\"\\\\x{\" . $decis . \"}\";<br \/>\n             }<br \/>\n             } else {<br \/>\n             $outsofar.=\"\\\\x{\" . dechex($decis) . \"}\";<br \/>\n             }<br \/>\n             $outsofar.=substr($outs[$ivx],strlen($decis . ';'));<br \/>\n           }<br \/>\n         } else if (strpos(str_replace('+',' ',urldecode($_POST['text'])), '&amp;#') !== false) {<br \/>\n           $outs=explode('&amp;#', str_replace('+',' ',urldecode($_POST['text'])));<br \/>\n           $outsofar=$outs[0];<br \/>\n           for ($ivx=1; $ivx&lt;sizeof($outs); $ivx++) {<br \/>\n             $decis=explode(';', $outs[$ivx])[0];<br \/>\n             if (str_replace('0','',str_replace('1','',str_replace('2','',str_replace('3','',str_replace('4','',str_replace('5','',str_replace('6','',str_replace('7','',str_replace('8','',str_replace('9','',$decis)))))))))) != '') {<br \/>\n             if (substr(strtolower($decis),0,1) == 'x') {<br \/>\n             $outsofar.=\"\\\\x{\" . substr($decis,1) . \"}\";<br \/>\n             } else {<br \/>\n             $outsofar.=\"\\\\x{\" . $decis . \"}\";<br \/>\n             }<br \/>\n             } else {<br \/>\n             $outsofar.=\"\\\\x{\" . dechex($decis) . \"}\";<br \/>\n             }<br \/>\n             $outsofar.=substr($outs[$ivx],strlen($decis . ';'));<br \/>\n           }<br \/>\n         }<br \/>\n         $labbit=$emojilabbit;<br \/>\n         $perlemoji=\"perl -e 'binmode(STDOUT, \\\":utf8\\\"); print \\\"\" . str_replace(\"\\n\", \"\\x{000A}\", $outsofar) . '\";' . \"' | \";<br \/>\n     }<br \/>\n     if (strpos(str_replace('+',' ',urldecode($_POST['text'])), \"\\\\\") !== false) {<br \/>\n     if ($perlemoji == '') { $labbit='\"$(cat \/tmp\/imagerequest_' . server_remote_addr() . '-0.txt | ' . \" sed '\/\\\\\\\\\/s\/\/\\\\\\\\\\\\\\\\\/g')\" . '\" '; }<br \/>\n     file_put_contents('\/tmp\/imag.cmd', $perlemoji . 'convert -background \"' . $bcol . '\" -fill \"' . $fcol . '\" -size ' . $wdt . 'x' . $hgt . ' -font ' . $fnt . ' -pointsize ' . $psiz . ' label:' . $labbit . ' ' . $slidename);<br \/>\n     exec($perlemoji . 'convert -background \"' . $bcol . '\" -fill \"' . $fcol . '\" -size ' . $wdt . 'x' . $hgt . ' -font ' . $fnt . ' -pointsize ' . $psiz . ' label:' . $labbit . ' ' . $slidename);<br \/>\n     exec('chmod 777 ' . $slidename);<br \/>\n     } else {<br \/>\n     if ($perlemoji == '') { $labbit='\"$(cat \/tmp\/imagerequest_' . server_remote_addr() . '-0.txt)' . '\" '; }<br \/>\n     file_put_contents('\/tmp\/imaG.cmd', $perlemoji . 'convert -background \"' . $bcol . '\" -fill \"' . $fcol . '\" -size ' . $wdt . 'x' . $hgt . ' -font ' . $fnt . ' -pointsize ' . $psiz . ' label:' . $labbit . ' ' . $slidename . ' ; chmod 777 ' . $slidename);<br \/>\n     exec($perlemoji . 'convert -background \"' . $bcol . '\" -fill \"' . $fcol . '\" -size ' . $wdt . 'x' . $hgt . ' -font ' . $fnt . ' -pointsize ' . $psiz . ' label:' . $labbit . ' ' . $slidename);<br \/>\n     exec('chmod 777 ' . $slidename);<br \/>\n     }<br \/>\n     if (isset($_POST['raw'])) {<br \/>\n     header('Content-Type: image\/' . $iex);<br \/>\n     echo file_get_contents($slidename);<br \/>\n     unlink($slidename);<br \/>\n     unlink('\/tmp\/imagerequest_' . server_remote_addr() . '-0.txt');<br \/>\n     exit;<br \/>\n     } else {<br \/>\n     echo \"&lt;html&gt;<br \/>\n     &lt;body onload=\\\"<br \/>\n       if (window.parent != window.self) {<br \/>\n       var cnvs=parent.document.getElementsByTagName('canvas');<br \/>\n       if (eval('' + cnvs.length) &gt; 0) {<br \/>\n         var imgsis=new Image();<br \/>\n         imgsis.onload=function(event){<br \/>\n           var canvasis=cnvs[0];<br \/>\n           var cntxis=canvasis.getContext('2d');<br \/>\n           cntxis.drawImage(event.target, 0, 0);<br \/>\n         };<br \/>\n         imgsis.src='data:image\/\" . $iex . \";base64,\" . base64_encode(file_get_contents($slidename)) . \"';<br \/>\n       } else {<br \/>\n       var imgs=parent.document.getElementsByTagName('img');<br \/>\n       if (eval('' + imgs.length) &gt; 0) {<br \/>\n         imgs[0].src='data:image\/\" . $iex . \";base64,\" . base64_encode(file_get_contents($slidename)) . \"';<br \/>\n       } else if (document.body.innerHTML == '') {<br \/>\n         document.body.innerHTML='&lt;img src=data:image\/\" . $iex . \";base64,\" . base64_encode(file_get_contents($slidename)) . \"&gt;&lt;\/img&gt;&lt;style&gt; * { margin:0 0 0 0; padding:0 0 0 0; } img {  border-top: 8px solid \" . $bcol . \"; }&lt;\/style&gt;';<br \/>\n       } else {<br \/>\n         document.body.innerHTML+='&lt;br&gt;&lt;img src=data:image\/\" . $iex . \";base64,\" . base64_encode(file_get_contents($slidename)) . \"&gt;&lt;\/img&gt;';<br \/>\n       }<br \/>\n       }<br \/>\n       } else if (document.body.innerHTML == '') {<br \/>\n         document.body.innerHTML='&lt;img src=data:image\/\" . $iex . \";base64,\" . base64_encode(file_get_contents($slidename)) . \"&gt;&lt;\/img&gt;&lt;style&gt; * { margin:0 0 0 0; padding:0 0 0 0; } img {  border-top: 8px solid \" . $bcol . \"; }&lt;\/style&gt;';<br \/>\n       } else {<br \/>\n         document.body.innerHTML+='&lt;br&gt;&lt;img src=data:image\/\" . $iex . \";base64,\" . base64_encode(file_get_contents($slidename)) . \"&gt;&lt;\/img&gt;';<br \/>\n       }<br \/>\n     \\\"&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n     unlink('\/tmp\/imagerequest_' . server_remote_addr() . '-0.txt');<br \/>\n     try {<br \/>\n     unlink($slidename);<br \/>\n     } catch(Exception $esdw) {   }<br \/>\n     }<br \/>\n     exit;<br \/>\n   } else if (isset($_GET['text'])) {<br \/>\n     $perlemoji='';<br \/>\n     $emojilabbit=\"@- \";  \/\/ vs perl<br \/>\n     $iex='png';<br \/>\n     $fnt='Courier';<br \/>\n     $wdt='800';<br \/>\n     $hgt='800';<br \/>\n     $psiz='36';<br \/>\n     $fcol='black';<br \/>\n     $bcol='white';<br \/>\n     if (isset($_GET['ext'])) {  $iex=str_replace('+',' ',urldecode($_GET['ext']));  }<br \/>\n     if (isset($_GET['ffam'])) {  $fnt=str_replace('+',' ',urldecode($_GET['ffam']));  }<br \/>\n     if (isset($_GET['width'])) {  $pwdt=str_replace('+',' ',urldecode($_GET['width']));  }<br \/>\n     if (isset($_GET['height'])) {  $hgt=str_replace('+',' ',urldecode($_GET['height']));  }<br \/>\n     if (isset($_GET['ptsize'])) {  $psiz=str_replace('+',' ',urldecode($_GET['ptsize']));  }<br \/>\n     if (isset($_GET['fcol'])) {  $fcol=str_replace('+',' ',urldecode($_GET['fcol']));  }<br \/>\n     if (isset($_GET['bcol'])) {  $bcol=str_replace('+',' ',urldecode($_GET['bcol']));  }<br \/>\n     $slidename='\/tmp\/imagerequest_' . server_remote_addr() . '-0.' . $iex;<br \/>\n     file_put_contents('\/tmp\/imagerequest_' . server_remote_addr() . '-0.txt', str_replace('+',' ',urldecode($_GET['text'])));<br \/>\n     file_put_contents('\/tmp\/maybeemojisG.txt', htmlspecialchars(str_replace('+',' ',urldecode($_GET['text'])), ENT_COMPAT,'UTF-8', true));<br \/>\n     \/\/ yes no &amp;#129684;<br \/>\n     if (strpos(str_replace('+',' ',urldecode($_GET['text'])), '&amp;#') !== false || strpos(str_replace('+',' ',urldecode($_GET['text'])), '&amp;#') !== false) { \/\/ thanks to https:\/\/usage.imagemagick.org\/text\/#unicode<br \/>\n         $outsofar=''; \/\/ '\\x{201C}Unicode \\x{2018}\\x{263A}\\x{2019} Please\\x{201D}'<br \/>\n         if (strpos(str_replace('+',' ',urldecode($_GET['text'])), '&amp;#') !== false) {<br \/>\n           $outs=explode('&amp;#', str_replace('+',' ',urldecode($_GET['text'])));<br \/>\n           $outsofar=$outs[0];<br \/>\n           for ($ivx=1; $ivx&lt;sizeof($outs); $ivx++) {<br \/>\n             $decis=explode(';', $outs[$ivx])[0];<br \/>\n             if (str_replace('0','',str_replace('1','',str_replace('2','',str_replace('3','',str_replace('4','',str_replace('5','',str_replace('6','',str_replace('7','',str_replace('8','',str_replace('9','',$decis)))))))))) != '') {<br \/>\n             if (substr(strtolower($decis),0,1) == 'x') {<br \/>\n             $outsofar.=\"\\\\x{\" . substr($decis,1) . \"}\";<br \/>\n             } else {<br \/>\n             $outsofar.=\"\\\\x{\" . $decis . \"}\";<br \/>\n             }<br \/>\n             } else {<br \/>\n             $outsofar.=\"\\\\x{\" . dechex($decis) . \"}\";<br \/>\n             }<br \/>\n             $outsofar.=substr($outs[$ivx],strlen($decis . ';'));<br \/>\n           }<br \/>\n         } else if (strpos(str_replace('+',' ',urldecode($_GET['text'])), '&amp;#') !== false) {<br \/>\n           $outs=explode('&amp;#', str_replace('+',' ',urldecode($_GET['text'])));<br \/>\n           $outsofar=$outs[0];<br \/>\n           for ($ivx=1; $ivx&lt;sizeof($outs); $ivx++) {<br \/>\n             $decis=explode(';', $outs[$ivx])[0];<br \/>\n             if (str_replace('0','',str_replace('1','',str_replace('2','',str_replace('3','',str_replace('4','',str_replace('5','',str_replace('6','',str_replace('7','',str_replace('8','',str_replace('9','',$decis)))))))))) != '') {<br \/>\n             if (substr(strtolower($decis),0,1) == 'x') {<br \/>\n             $outsofar.=\"\\\\x{\" . substr($decis,1) . \"}\";<br \/>\n             } else {<br \/>\n             $outsofar.=\"\\\\x{\" . $decis . \"}\";<br \/>\n             }<br \/>\n             } else {<br \/>\n             $outsofar.=\"\\\\x{\" . dechex($decis) . \"}\";<br \/>\n             }<br \/>\n             $outsofar.=substr($outs[$ivx],strlen($decis . ';'));<br \/>\n           }<br \/>\n         }<br \/>\n         $labbit=$emojilabbit;<br \/>\n         $perlemoji=\"perl -e 'binmode(STDOUT, \\\":utf8\\\"); print \\\"\" . str_replace(\"\\n\", \"\\x{000A}\", $outsofar) . '\";' . \"' | \";<br \/>\n     }<br \/>\n     if (strpos(str_replace('+',' ',urldecode($_GET['text'])), \"\\\\\") !== false) {<br \/>\n     if ($perlemoji == '') { $labbit='\"$(cat \/tmp\/imagerequest_' . server_remote_addr() . '-0.txt | ' . \" sed '\/\\\\\\\\\/s\/\/\\\\\\\\\\\\\\\\\/g')\" . '\" '; }<br \/>\n     \/\/file_put_contents('\/tmp\/imag.cmd', 'convert -background \"' . $bcol . '\" -fill \"' . $fcol . '\" -size ' . $wdt . 'x' . $hgt . ' -font ' . $fnt . ' -pointsize ' . $psiz . ' label:\"$(cat \/tmp\/imagerequest_' . server_remote_addr() . '-0.txt | ' . \" sed '\/\\\\\\\\\/s\/\/\\\\\\\\\\\\\\\\\/g')\" . '\" ' . $slidename . ' ; chmod 777 ' . $slidename);<br \/>\n     exec($perlemoji . 'convert -background \"' . $bcol . '\" -fill \"' . $fcol . '\" -size ' . $wdt . 'x' . $hgt . ' -font ' . $fnt . ' -pointsize ' . $psiz . ' label:' . $labbit . ' ' . $slidename);<br \/>\n     exec('chmod 777 ' . $slidename);<br \/>\n     } else {<br \/>\n     if ($perlemoji == '') { $labbit='\"$(cat \/tmp\/imagerequest_' . server_remote_addr() . '-0.txt)' . '\" '; }<br \/>\n     exec($perlemoji . 'convert -background \"' . $bcol . '\" -fill \"' . $fcol . '\" -size ' . $wdt . 'x' . $hgt . ' -font ' . $fnt . ' -pointsize ' . $psiz . ' label:' . $labbit . ' ' . $slidename);<br \/>\n     exec('chmod 777 ' . $slidename);<br \/>\n     }<br \/>\n     if (isset($_GET['raw'])) {<br \/>\n     header('Content-Type: image\/' . $iex);<br \/>\n     echo file_get_contents($slidename);<br \/>\n     unlink($slidename);<br \/>\n     unlink('\/tmp\/imagerequest_' . server_remote_addr() . '-0.txt');<br \/>\n     exit;<br \/>\n     } else {<br \/>\n     echo \"&lt;html&gt;<br \/>\n     &lt;body onload=\\\"<br \/>\n       if (window.parent != window.self) {<br \/>\n       var cnvs=parent.document.getElementsByTagName('canvas');<br \/>\n       if (eval('' + cnvs.length) &gt; 0) {<br \/>\n         var imgsis=new Image();<br \/>\n         imgsis.onload=function(event){<br \/>\n           var canvasis=cnvs[0];<br \/>\n           var cntxis=canvasis.getContext('2d');<br \/>\n           cntxis.drawImage(event.target, 0, 0);<br \/>\n         };<br \/>\n         imgsis.src='data:image\/\" . $iex . \";base64,\" . base64_encode(file_get_contents($slidename)) . \"';<br \/>\n       } else {<br \/>\n       var imgs=parent.document.getElementsByTagName('img');<br \/>\n       if (eval('' + imgs.length) &gt; 0) {<br \/>\n         imgs[0].src='data:image\/\" . $iex . \";base64,\" . base64_encode(file_get_contents($slidename)) . \"';<br \/>\n       } else if (document.body.innerHTML == '') {<br \/>\n         document.body.innerHTML='&lt;img src=data:image\/\" . $iex . \";base64,\" . base64_encode(file_get_contents($slidename)) . \"&gt;&lt;\/img&gt;&lt;style&gt; * { margin:0 0 0 0; padding:0 0 0 0; } img {  border-top: 8px solid \" . $bcol . \"; }&lt;\/style&gt;';<br \/>\n       } else {<br \/>\n         document.body.innerHTML+='&lt;br&gt;&lt;img src=data:image\/\" . $iex . \";base64,\" . base64_encode(file_get_contents($slidename)) . \"&gt;&lt;\/img&gt;';<br \/>\n       }<br \/>\n       }<br \/>\n       } else if (document.body.innerHTML == '') {<br \/>\n         document.body.innerHTML='&lt;img src=data:image\/\" . $iex . \";base64,\" . base64_encode(file_get_contents($slidename)) . \"&gt;&lt;\/img&gt;&lt;style&gt; * { margin:0 0 0 0; padding:0 0 0 0; } img {  border-top: 8px solid \" . $bcol . \"; }&lt;\/style&gt;';<br \/>\n       } else {<br \/>\n         document.body.innerHTML+='&lt;br&gt;&lt;img src=data:image\/\" . $iex . \";base64,\" . base64_encode(file_get_contents($slidename)) . \"&gt;&lt;\/img&gt;';<br \/>\n       }<br \/>\n     \\\"&gt;&lt;\/body&gt;&lt;\/html&gt;\";<br \/>\n     unlink('\/tmp\/imagerequest_' . server_remote_addr() . '-0.txt');<br \/>\n     try {<br \/>\n     unlink($slidename);<br \/>\n     } catch(Exception $esdw) {   }<br \/>\n     }<br \/>\n     exit;<br \/>\n   }<br \/>\n<\/code><br \/>\n?&gt;<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/text-to-image-via-imagemagick-primer-tutorial\/' rel=\"noopener\">Text to Image via ImageMagick Primer Tutorial<\/a>.<\/p-->\n<hr>\n<p id='pcapicsct'>Previous relevant <a target=\"_blank\" title='Python Cowsay API Cartoon Speech Content Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/python-cowsay-api-cartoon-speech-content-tutorial\/' rel=\"noopener\">Python Cowsay API Cartoon Speech Content Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Python Cowsay API Cartoon Speech Content Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/cowsay_cartoon_content.gif\" title=\"Python Cowsay API Cartoon Speech Content Tutorial\"  style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Python Cowsay API Cartoon Speech Content Tutorial<\/p><\/div>\n<p>If you were to ask most people what is more onerous filling in online web forms on the way to making something happen &#8230;<\/p>\n<ul>\n<li><font size=1>we&#8217;re guessing, rather than saying<\/font> button presses<\/font> &#8230;<\/li>\n<li><font size=1>we&#8217;re guessing, they&#8217;re more likely to say<\/font> typing out text &#8230;<\/li>\n<\/ul>\n<p> &#8230; with it&#8217;s associated tabbing out to negotiate as well.  But, supposing we could offer you a &#8220;speech to text&#8221; approach to performing &#8220;typing out text&#8221; in our latest <a target=\"_blank\" title='Python cowsay' href='https:\/\/pypi.org\/project\/cowsay\/' rel=\"noopener\"><i>cowsay<\/i><\/a> Python API \/ Command-line tool interfacing PHP web application?<\/p>\n<p>For some years now, we&#8217;ve interfaced to a &#8230;<\/p>\n<ul>\n<li>non-mobile<\/li>\n<li>Google Chrome<\/li>\n<li>secure URL via https: protocol<\/li>\n<li>allowing access to microphone<\/li>\n<\/ul>\n<p> &#8230; means by which we normally access via a &#8220;top&#8221; hierarchy level call to <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/speech_supervisor.php\" rel=\"noopener\">our inhouse Google Speech to Text API interfacing web application<\/a> helper.<\/p>\n<p>Isn&#8217;t a popup window awkward here?  Well, you might think so, but today, we discovered with the Google Chrome browser we used on macOS &#8230;<\/p>\n<ul>\n<li>we initially call <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/speech_supervisor.php\" rel=\"noopener\">our inhouse Google Speech to Text API interfacing web application<\/a> helper <font color=blue>as a popup<\/font> sitting in front of the <i>cowsay<\/i> interfacing parent window &#8230;<br \/>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\nfunction anop() {<br \/>\n  if (navigator.userAgent.match(\/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile\/i)) {<br \/>\n    <font color=blue>topwo=window_open('https:\/\/www.google.com\/intl\/en\/chrome\/demos\/speech.html','_blank','top=120,left=' + eval(eval('' + screen.width) - 690) + ',width=690,height=550');<\/font><br \/>\n    setTimeout(function(){  topwo.scrollTo(0,0);  topwo.document.getElementById('tdm').style.opacity='0.0';   }, 6000);<br \/>\n    <font color=purple>setInterval(function(){  if (!topwo.closed) { topwo.focus(); }  topwo.location.href='https:\/\/www.rjmprogramming.com.au\/PHP\/speech_supervisor.php?rand=' + Math.floor(Math.random() * 1987967) + '&mode=4';  setTimeout(function(){ topwo.scrollTo(0,0);   topwo.document.getElementById('tdm').style.opacity='0.0'; }, 6000);  }, 30000);<\/font><br \/>\n  } else {<br \/>\n    <font color=blue>topwo=window.open('https:\/\/www.rjmprogramming.com.au\/PHP\/speech_supervisor.php?rand=' + Math.floor(Math.random() * 1987967) + '&mode=4','_blank','top=120,left=' + eval(eval('' + screen.width) - 690) + ',width=690,height=550');<\/font><br \/>\n    setTimeout(function(){  topwo.scrollTo(0,0);  topwo.document.getElementById('tdm').style.opacity='0.0';   }, 6000);<br \/>\n    <font color=purple>setInterval(function(){ if (!topwo.closed) { topwo.focus(); } topwo.location.href='https:\/\/www.rjmprogramming.com.au\/PHP\/speech_supervisor.php?rand=' + Math.floor(Math.random() * 1987967) + '&mode=4';  setTimeout(function(){ topwo.scrollTo(0,0);   topwo.document.getElementById('tdm').style.opacity='0.0'; }, 6000);  }, 30000);<\/font><br \/>\n  }<br \/>\n}<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;\n<\/li>\n<li>and found that it was visible until any click or focus back to the <i>cowsay<\/i> interfacing parent window &#8230; normally an annoyance &#8230;<\/li>\n<li>but not if &#8230;\n<ol>\n<li>we semi regularly reload the <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/speech_supervisor.php\" rel=\"noopener\">our inhouse Google Speech to Text API interfacing web application<\/a> helper &#8230; <font color=purple>to refresh it&#8217;s red &#8220;recording&#8221; button<\/font> instigation &#8230; and then &#8230;<\/li>\n<li>even if it remains hidden, it is still apparent to the focussed <i>cowsay<\/i> interfacing parent window on account of an orange &#8220;microphone on recording&#8221; icon appearing for the Google Chrome web browser user up at it&#8217;s Menu Bar &#8230; and &#8230;<\/li>\n<li>audio being &#8220;sight independent&#8221; the user does not have to refocus <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/PHP\/speech_supervisor.php\" rel=\"noopener\">our inhouse Google Speech to Text API interfacing web application<\/a> helper, just talk into the microphone just after that new icon appears &#8230; so that &#8230;<\/li>\n<li>the Google Speech to Text smarts help transfer that resultant text over to the textarea of the <i>cowsay<\/i> interfacing parent window, even avoiding any need to tab out of that textarea element &#8230; ahead of &#8230;<\/li>\n<li>the rest of the dropdown selections and button presses needed to achieve the user aim of establishing a new slide, perhaps for a Cartoon being created<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<p> &#8230; you can see happening with <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay_cartoon_content.gif\" rel=\"noopener\">today&#8217;s animated GIF presentation<\/a> on top of the work of yesterday&#8217;s <a title='Python Cowsay API Cartoon Tutorial' href='#pcapict'>Python Cowsay API Cartoon Tutorial<\/a> in <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/cowsay.php---GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/cowsay.php---GETME\" rel=\"noopener\">&#8220;fourth draft&#8221;<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\">Cartoon creation and email sharing capable<\/a> PHP web application you can also <a href='#ifcart'>try below<\/a>.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/python-cowsay-api-cartoon-speech-content-tutorial\/' rel=\"noopener\">Python Cowsay API Cartoon Speech Content Tutorial<\/a>.<\/p-->\n<hr>\n<p id='pcapict'>Previous relevant <a target=\"_blank\" title='Python Cowsay API Cartoon Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/python-cowsay-api-cartoon-tutorial\/' rel=\"noopener\">Python Cowsay API Cartoon Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Python Cowsay API Cartoon Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/cowsay_cartoon.gif\" title=\"Python Cowsay API Cartoon Tutorial\"  style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Python Cowsay API Cartoon Tutorial<\/p><\/div>\n<p>We&#8217;ve long been interested in online web application ideas that end up with a half decent cartoon the user can create, and share, themselves.  &#8220;Half decent&#8221; becomes &#8220;fully decent&#8221; with a user who has a great imagination.  And so, onto yesterday&#8217;s <a title='Python Cowsay API Primer Tutorial' href='#pcapipt'>Python Cowsay API Primer Tutorial<\/a>&#8216;s start with interfacing to the great <a target=\"_blank\" title='Python cowsay' href='https:\/\/pypi.org\/project\/cowsay\/' rel=\"noopener\"><i>cowsay<\/i><\/a> Python API \/ Command-line tool we access via the PHP <a target=\"_blank\" title='PHP exec() method information' href='http:\/\/php.net\/manual\/en\/function.exec.php' rel=\"noopener\">exec<\/a> method conduit to our AlmaLinux Apache\/PHP\/MySql Linux web server, today we&#8217;ve extended that &#8230;<\/p>\n<ul>\n<li>&#8220;proof of concept&#8221; thinking &#8230; onto &#8230;<\/li>\n<li>cartoon creation &#8220;smarts&#8221; &#8230; starting with <font size=1>(also egged on here by mobile platform problems with monospaced fonts, it seems like)<\/font> &#8230;<\/li>\n<li>allowing a tabular display of our <i>cowsay<\/i> components &#8230; into &#8230;<\/li>\n<li>table cells horizontally aligned (and so, less vulnerable to monospacing inaccuracies) &#8230; also allowing &#8230;<\/li>\n<li>within any table cell there is a topmost th table cell wording part above a <i>cowsay<\/i> character td cell lower part &#8230;<\/li>\n<li>&#8220;half decent&#8221; looking via <font color=blue>static CSS<\/font> &#8230;<br \/>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\n&lt;style&gt;<br \/>\n margin: 0 0 0 0;<br \/>\n padding: 0 0 0 0;<br \/>\n <font color=blue>tr { vertical-align: top; }<br \/>\n td { vertical-align: top; }<br \/>\n th { vertical-align: top; }<\/font><br \/>\n * { font-family:'Courier New',Courier,monospace; }<br \/>\n .img-hor { \/\/ thanks to https:\/\/stackoverflow.com\/questions\/32875695\/flip-mirror-an-image-horizontally-vertically-with-css<br \/>\n        -moz-transform: scaleX(-1);<br \/>\n        -o-transform: scaleX(-1);<br \/>\n        -webkit-transform: scaleX(-1);<br \/>\n        transform: scaleX(-1);<br \/>\n        filter: FlipH;<br \/>\n        -ms-filter: 'FlipH';<br \/>\n }<br \/>\n .img-ver { \/\/ thanks to https:\/\/stackoverflow.com\/questions\/32875695\/flip-mirror-an-image-horizontally-vertically-with-css<br \/>\n        -moz-transform: scaleY(-1);<br \/>\n        -o-transform: scaleY(-1);<br \/>\n        -webkit-transform: scaleY(-1);<br \/>\n        transform: scaleY(-1);<br \/>\n        filter: FlipV;<br \/>\n        -ms-filter: 'FlipV';<br \/>\n }<br \/>\n<br \/>\n .glow {<br \/>\n  -webkit-animation: glow 1s linear infinite alternate;<br \/>\n  -moz-animation: glow 1s linear infinite alternate;<br \/>\n  animation: glow 1s linear infinite alternate;<br \/>\n }<br \/>\n<br \/>\n \/* Thanks to https:\/\/www.w3schools.com\/howto\/tryit.asp?filename=tryhow_css_glowing_text *\/<br \/>\n<br \/>\n @-webkit-keyframes glow {<br \/>\n  from {<br \/>\n    box-shadow: 0 0 3px #fff, 0 0 5px #fff, 0 0 37px #e60073, 0 0 9px #e60073, 0 0 11px #e60073, 0 0 13px #e60073, 0 0 15px #e60073;<br \/>\n  }<br \/>\n<br \/>\n  to {<br \/>\n    box-shadow: 0 0 24px #fff, 0 0 6px #ff4da6, 0 0 8px #ff4da6, 0 0 10px #ff4da6, 0 0 12px #ff4da6, 0 0 14px #ff4da6, 0 0 16px #ff4da6;<br \/>\n  }<br \/>\n }<br \/>\n<br \/>\nth[id$='0'] {<br \/>\n    background: rgba(224,240,240,0.6); \/\/#e0f0f0;<br \/>\n}<br \/>\n<br \/>\nth[id$='1'] {<br \/>\n    background: rgba(225,241,241,0.6); \/\/#e1f1f1;<br \/>\n}<br \/>\n<br \/>\nth[id$='2'] {<br \/>\n    background: rgba(226,242,242,0.6); \/\/#e2f2f2;<br \/>\n}<br \/>\n<br \/>\nth[id$='3'] {<br \/>\n    background: rgba(227,243,243,0.6); \/\/#e3f3f3;<br \/>\n}<br \/>\n<br \/>\nth[id$='4'] {<br \/>\n    background: rgba(228,244,244,0.6); \/\/#e4f4f4;<br \/>\n}<br \/>\n<br \/>\nth[id$='5'] {<br \/>\n    background: rgba(229,245,245,0.6); \/\/#e5f5f5;<br \/>\n}<br \/>\n<br \/>\nth[id$='6'] {<br \/>\n    background: rgba(230,246,246,0.6); \/\/#e6f6f6;<br \/>\n}<br \/>\n<br \/>\nth[id$='7'] {<br \/>\n    background: rgba(231,247,247,0.6); \/\/#e7f7f7;<br \/>\n}<br \/>\n<br \/>\nth[id$='8'] {<br \/>\n    background: rgba(232,248,248,0.6); \/\/#e2f2f2;<br \/>\n}<br \/>\n<br \/>\nth[id$='9'] {<br \/>\n    background: rgba(233,249,249,0.6); \/\/#e9f9f9;<br \/>\n}<br \/>\n<br \/>\ntd[id$='0'] {<br \/>\n    background: rgba(240,240,240,0.3); \/\/#f0f0f0;<br \/>\n    text-shadow:-1px 1px 1px #ff2d90;<br \/>\n}<br \/>\n<br \/>\ntd[id$='1'] {<br \/>\n    background: rgba(241,241,241,0.3); \/\/#f1f1f1;<br \/>\n    text-shadow:-1px 1px 1px #ff2d91;<br \/>\n    float: bottom;<br \/>\n}<br \/>\n<br \/>\ntd[id$='2'] {<br \/>\n    background: rgba(242,242,242,0.3); \/\/#f2f2f2;<br \/>\n    text-shadow:-1px 1px 1px #ff2d92;<br \/>\n}<br \/>\n<br \/>\ntd[id$='3'] {<br \/>\n    background: rgba(243,243,243,0.3); \/\/#f3f3f3;<br \/>\n    text-shadow:-1px 1px 1px #ff2d93;<br \/>\n}<br \/>\n<br \/>\ntd[id$='4'] {<br \/>\n    background: rgba(244,244,244,0.3); \/\/#f4f4f4;<br \/>\n    text-shadow:-1px 1px 1px #ff2d94;<br \/>\n}<br \/>\n<br \/>\ntd[id$='5'] {<br \/>\n    background: rgba(245,245,245,0.3); \/\/#f5f5f5;<br \/>\n    text-shadow:-1px 1px 1px #ff2d95;<br \/>\n}<br \/>\n<br \/>\ntd[id$='6'] {<br \/>\n    background: rgba(246,246,246,0.3); \/\/#f6f6f6;<br \/>\n    text-shadow:-1px 1px 1px #ff2d96;<br \/>\n}<br \/>\n<br \/>\ntd[id$='7'] {<br \/>\n    background: rgba(247,247,247,0.3); \/\/#f7f7f7;<br \/>\n    text-shadow:-1px 1px 1px #ff2d97;<br \/>\n}<br \/>\n<br \/>\ntd[id$='8'] {<br \/>\n    background: rgba(248,248,248,0.3); \/\/#f8f8f8;<br \/>\n    text-shadow:-1px 1px 1px #ff2d98;<br \/>\n}<br \/>\n<br \/>\ntd[id$='9'] {<br \/>\n    background: rgba(249,249,249,0.3); \/\/#f9f9f9;<br \/>\n    text-shadow:-1px 1px 1px #ff2d99;<br \/>\n}<br \/>\n<br \/>\ntable tbody tr:first-child {<br \/>\n    background: transparent; \/\/#f6f6e6;<br \/>\n}<br \/>\n&lt;\/style&gt;<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<br \/>\n &#8230; and then &#8230;\n<\/li>\n<li>whenever new cell content happens <i>padding-top<\/i> adding CSS Javascript DOM nuanced display logic via &#8230;<br \/>\n&lt;?php echo &#8221;<br \/>\n<code><br \/>\n   function paddingtopit() {<br \/>\n      var maxtwo=0, thistwo=0;<br \/>\n      var thhs=[], tdhs=[], it=0;<br \/>\n      var thdids=[];<br \/>\n      \/\/trthtd1<br \/>\n      \/\/trtdtd1<br \/>\n      var tds=document.getElementsByTagName('td');<br \/>\n      for (it=0; it&lt;tds.length; it++) {<br \/>\n         if (('' + tds[it].id).indexOf('trtdtd') != -1) {<br \/>\n           if (('' + tds[it].style.paddingTop).replace(\/^null\/g,'').replace(\/^undefined\/g,'').trim() != '') {<br \/>\n             tds[it].style.paddingTop='0px';<br \/>\n           }<br \/>\n         }<br \/>\n      }<br \/>\n      for (it=0; it&lt;tds.length; it++) {<br \/>\n         if (('' + tds[it].id).indexOf('trtdtd') != -1) {<br \/>\n           tdhs.push(eval('' + tds[it].getBoundingClientRect().height));<br \/>\n           thdids.push('' + tds[it].id);<br \/>\n         }<br \/>\n      }<br \/>\n      var ths=document.getElementsByTagName('th');<br \/>\n      for (it=0; it&lt;ths.length; it++) {<br \/>\n         if (('' + ths[it].id).indexOf('trthtd') != -1) {<br \/>\n           thhs.push(eval('' + ths[it].getBoundingClientRect().height));<br \/>\n           thistwo=eval(thhs[it] + tdhs[it]);<br \/>\n           if (thistwo &gt; maxtwo) { maxtwo=thistwo; }<br \/>\n         }<br \/>\n      }<br \/>\n      for (it=0; it&lt;tdhs.length; it++) {<br \/>\n           thistwo=eval(thhs[it] + tdhs[it]);<br \/>\n           if (thistwo &lt; maxtwo) {<br \/>\n              document.getElementById(thdids[it]).style.paddingTop='' + eval(maxtwo - thistwo) + 'px';<br \/>\n           }<br \/>\n      }<br \/>\n   }<br \/>\n<\/code><br \/>\n&#8220;; ?&gt;<br \/>\n &#8230; so that &#8230;\n<\/li>\n<li>cartoons present with &#8220;speech bubble&#8221; wording aligned to the top in our &#8220;cells&#8221; (ie. th contenteditable=true editable wording on top of td horizontal flip (double click) and\/or vertical flop (right click) editable lower part) with those characters aligned to the bottom<\/li>\n<\/ul>\n<p> &#8230; in <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/cowsay.php--GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/cowsay.php--GETME\" rel=\"noopener\">&#8220;third draft&#8221;<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\">Cartoon creation and email sharing capable<\/a> PHP web application you can also <a href='#ifcart'>try below<\/a>.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/python-cowsay-api-cartoon-tutorial\/' rel=\"noopener\">Python Cowsay API Cartoon Tutorial<\/a>.<\/p-->\n<hr>\n<p id='pcapipt'>Previous relevant <a target=\"_blank\" title='Python Cowsay API Primer Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/python-cowsay-api-primer-tutorial\/' rel=\"noopener\">Python Cowsay API Primer Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Python Cowsay API Primer Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/cowsay.gif\" title=\"Python Cowsay API Primer Tutorial\"  style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Python Cowsay API Primer Tutorial<\/p><\/div>\n<p>We discovered an interesting Open Source Python API \/ Command-line tool called <a target=\"_blank\" title='Python cowsay' href='https:\/\/pypi.org\/project\/cowsay\/' rel=\"noopener\"><i>cowsay<\/i><\/a> which we installed up at our AlmaLinux web server via &#8230;<\/p>\n<p><code><br \/>\npip install cowsay<br \/>\n<\/code><\/p>\n<p> &#8230; with an integration purpose in mind, so thanks.  Before many readers&#8217; time indeed, but some may remember those cute banner printouts that told you who owned the next printout on a spooling &#8220;crude graphics&#8221; printout in the late 70&#8217;s &#8230; well <i>cowsay<\/i> encapsulates those heady days (and who can forget punch cards)?!   Before integration, though, we want to test it via a new PHP supervisor on <a target=\"_blank\" title='PHP exec() method information' href='http:\/\/php.net\/manual\/en\/function.exec.php' rel=\"noopener\">exec<\/a> method Linux command line interfacings to <i>cowsay<\/i>.<\/p>\n<p>So we started, with <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/cowsay.php_GETME\" rel=\"noopener\">this &#8220;first draft&#8221;<\/a> getting places and then <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/cowsay.php-GETME\" rel=\"noopener\">this &#8220;second draft&#8221;<\/a> with a <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/cowsay.php-GETME\" rel=\"noopener\">little more sophistication<\/a> to leave the day with <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/cowsay.php\" rel=\"noopener\">this interfacer<\/a> &#8230;<\/p>\n<p><iframe id=ifcart style=\"width:100%;height:800px;\" src=\"\/\/www.rjmprogramming.com.au\/cowsay.php?rand=7656785\"><\/iframe><\/p>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d66808' onclick='var dv=document.getElementById(\"d66808\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/api\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d66808' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d66816' onclick='var dv=document.getElementById(\"d66816\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/cartoon\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d66816' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d66829' onclick='var dv=document.getElementById(\"d66829\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/speech-to-text\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d66829' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d66838' onclick='var dv=document.getElementById(\"d66838\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/imagemagick\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d66838' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d66848' onclick='var dv=document.getElementById(\"d66848\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/video\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d66848' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d66928' onclick='var dv=document.getElementById(\"d66928\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/image\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d66928' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d69063' onclick='var dv=document.getElementById(\"d69063\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/escape\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d69063' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d69092' onclick='var dv=document.getElementById(\"d69092\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/firefox\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d69092' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d69103' onclick='var dv=document.getElementById(\"d69103\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/local-web-server\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d69103' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d69138' onclick='var dv=document.getElementById(\"d69138\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/speech-to-text\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d69138' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d69151' onclick='var dv=document.getElementById(\"d69151\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/genericize\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d69151' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d69158' onclick='var dv=document.getElementById(\"d69158\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/mamp\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d69158' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d69177' onclick='var dv=document.getElementById(\"d69177\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/google-translate\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d69177' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>It&#8217;s fairly obvious that yesterday&#8217;s Text to Speech YouTube SubRip Subtitles Tutorial conditions for Text to Speech functionality are pretty limiting. But regarding Text to Speech we can turn to another free resource out there, and thereby allow for language &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/text-to-speech-youtube-subrip-subtitles-google-translate-tutorial\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,12,14,37],"tags":[69,84,85,88,91,1818,3748,3092,119,1993,3531,174,2571,5226,1824,2503,2509,1604,4033,2442,5229,281,2380,2276,2147,5233,367,380,1929,409,5230,451,452,2537,1839,513,532,2229,557,3961,564,576,587,624,652,2016,673,3038,1807,714,2169,721,739,744,795,5049,1616,5231,845,860,861,1705,876,4937,894,5234,3440,914,932,5113,997,1761,1059,5232,2350,1125,1126,1133,1137,1159,1172,5132,2553,1184,1209,1212,5227,5228,4342,1258,1262,1675,1319,1345,1369,4693,1431,2455,3098,1493,2017,1496],"class_list":["post-69177","post","type-post","status-publish","format-standard","hentry","category-ajax","category-elearning","category-event-driven-programming","category-tutorials","tag-ajax","tag-animation-2","tag-apache","tag-api","tag-apple","tag-artificial-intelligence","tag-audiobook","tag-automate","tag-automation","tag-browse","tag-browsing","tag-button","tag-caption","tag-captioning","tag-character","tag-clone","tag-cloning","tag-collaboration","tag-commentary","tag-contenteditable","tag-create","tag-css","tag-delay","tag-delimitation","tag-delimiter","tag-domparser","tag-dropdown","tag-email","tag-error","tag-external-javascript","tag-faux-pas","tag-font","tag-form","tag-generic","tag-genericization","tag-google","tag-google-translate","tag-hash","tag-hashtag","tag-hashtagging","tag-hierarchy","tag-html","tag-iframe","tag-intranet","tag-javascript","tag-karaoke","tag-keyboard","tag-level","tag-link","tag-local-web-server","tag-location-hash","tag-lyrics","tag-mailto","tag-mamp","tag-mobile","tag-modular","tag-modularization","tag-not","tag-notes","tag-onblur","tag-onclick","tag-onkeydown","tag-opacity","tag-organization","tag-overlay","tag-parsefromstring","tag-peer","tag-peer-to-peer","tag-php","tag-plus","tag-programming","tag-prompt","tag-resize","tag-resizing","tag-say","tag-setinterval","tag-settimeout","tag-share","tag-sharing","tag-sms","tag-song","tag-song-lyrics","tag-speech-to-text","tag-spotify","tag-style","tag-styling","tag-subrip","tag-subrip-subtitle","tag-subtitle","tag-text-to-speech","tag-textarea","tag-textbox","tag-tutorial","tag-url","tag-video","tag-web-speech","tag-wikipedia","tag-wrap","tag-wrapper","tag-youtube","tag-youtube-api","tag-z-index"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/69177"}],"collection":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/comments?post=69177"}],"version-history":[{"count":13,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/69177\/revisions"}],"predecessor-version":[{"id":69205,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/69177\/revisions\/69205"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=69177"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=69177"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=69177"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}