Automating yesterdayโs Audio and Video Creator via Media Browsing Tutorial โnot user apparentโ Audio/Video PHP web application processing functionality, whereby we used a URL like โฆ
https://www.rjmprogramming.com.au/PHP/animegif/tutorial_to_animated_gif.php?allowaudio=y&allowvideo=y
โฆ to allow this additional functionality in an โinternal use onlyโ type of approach. Turning this into a user controlling initial approach, among a phalanx of different approaches we might show, we are going to show a very traditional idea, using multiple HTML method=GET form elements, the 3 used in an HTML table corresponding to the three combinations of possibilities with the GET arguments above. This new HTML looks like โฆ
<table style="display:inline-block;">
<tbody>
<tr>
<td>
<form method="GET" action="./tutorial_to_animated_gif.php" style="display:inline-block;">
<input name="allowaudio" value="y" type="hidden">
<input type="submit" style="border:1px solid yellow;" value="Audio">
</form>
</td>
<td>
<form method="GET" action="./tutorial_to_animated_gif.php" style="display:inline-block;">
<input name="allowaudio" value="y" type="hidden">
<input name="allowvideo" value="y" type="hidden">
<input title="Both, in addition to Images, always" type="submit" value="/">
</form>
</td>
<td>
<form method="GET" action="./tutorial_to_animated_gif.php" style="display:inline-block;">
<input name="allowvideo" value="y" type="hidden">
<input type="submit" style="border:1px solid yellow;" value="Video">
</form>
</td>
</tr>
</tbody>
</table>
We use the โtableโ to keep the forms inline.
We use the โform method=GET action=./tutorial_to_animated_gif.phpโ to navigate back to simulate the possibilities behind that first URL way above.
Pretty fundamental, boring, but effective, HTML navigational functionality that adds user control into the picture.
Feel free to (re-)try thechanged tutorial_to_animated_gifphp animated
GIF creator web application.
Previous relevant Audio and Video Creator via Media Browsing Tutorial is shown below.
A couple of days ago with TextArea to Speech via macOS iTunes Tutorial we surmised โฆ
We can feel some PHP โaudio functionalityโ ideas coming on โฆ perhaps we need to take a Bex and have a lie down.
โฆ and so today we take the first steps in our โidea setโ.
Our last mention of our Animated GIF creator PHP web application was with Animated Gif Creator Variable Slide Delays Tutorial and, today, we expand its capabilities, at this stage hidden to the user, of being able to accept โฆ
- (its usual) image media (that creates Animated GIF images) โฆ but, also, new as of today โฆ
- audio media browsed for file(s)
- video media browsed for file(s)
โฆ the latter two, if the whole is the some of the parts, being able to be sequenced if the user chooses to play the first audio/video media file first. Another โsynchronizationโ effort to add to our list!
Thechanged tutorial_to_animated_gifphp animated
GIF creator web application can also be a audio/video
creator web application which calls on achanged client_browsing
htm HTML/Javascript media browsing helper.
Feel free to (re-)try thechanged tutorial_to_animated_gifphp animated
GIF creator web application.
Previous relevant Animated Gif Creator Variable Slide Delays Tutorial is shown below.
When thinking about the animated GIFs produced by the PHP (writes PHP) web application of the recent Animated Gif Creator Image Filters Tutorial compared to videos โฆ well, we canโt help you with the soundtrack, but how about that way a video can transfix us with a โlingering viewโ (notice how we donโt use the word โslideโ)? But what if we could have a mechanism by which an animated GIF presentation could have its version of a โlingering viewโ โฆ
an increased delay applied after the slide (for lingering) being currently displayed in the animated GIF
โฆ being so catchy, huh?!
We actually readied some parts of the PHP code for this when we interfaced the Inhouse Animated GIF Creatorโs involvement with our Haiku web application of Haiku Multimedia via Media Record Genericization Tutorial, but must have forgotten to follow through on the idea for non-Haiku scenarios (those rare occasions in life?!).
The recent Animated Gif Creator Image Filters Tutorial did us a huge favour here โPHP code organization wiseโ when we introduced that โfunction ingif($php_content_of_php)โ last gasp way of making amendments to that second phase PHP which goes on to create the animated GIF for you (that is, if you donโt ask too much of it resource wise).
So now, where the first phase asks for a delay value, via a textbox, that textboxโs advice now goes along the lines of โฆ
Comma separated list noticed, with first value being default for undefined ones. Plus and minus values do delays relative to previous delay.
โฆ to work with the new PHP code within thechanged tutorial_to_animated_gifphp animated
GIF creator web application, as per โฆ
<?php
function ingif($gp) {
global $foundtitle, $wtsuffix, $atext, $filteretc, $enumber, $ow, $oh, $owend, $ohend, $diffow, $diffoh, $delay, $vdy;
$indelay=$delay;
if (isset($_GET['delay'])) { $indelay=str_replace(" ","+",urldecode($_GET['delay'])); }
if (isset($_POST['delay'])) { $indelay=str_replace(" ","+",urldecode($_POST['delay'])); }
if (strpos($indelay, ",") !== false) {
if (strpos($gp, ("framed" . "[" . "]=" . $vdy . ";")) !== false) {
$gpf=explode("framed" . "[" . "]=" . $vdy . ";", $gp)[0];
$gp=str_replace($gpf . "framed" . "[" . "]=" . $vdy . ";", $gpf . "framed" . "[" . "] = " . $vdy . ";", $gp); //, 1);
$delaysare=explode(",", $indelay);
for ($iuy=1; $iuy<sizeof($delaysare); $iuy++) {
if (strpos($gp, ("framed" . "[" . "]=" . $vdy . ";")) !== false) {
$gpf=explode("framed" . "[" . "]=" . $vdy . ";", $gp)[0];
if (trim($delaysare[$iuy]) == '') {
$gp=str_replace($gpf . "framed" . "[" . "]=" . $vdy . ";", $gpf . "framed" . "[" . "] = " . $vdy . ";", $gp); //, 1);
} else if (strpos($delaysare[$iuy], "+") !== false) {
$delaysare[$iuy]='' . ($delaysare[-1 + $iuy] + substr($delaysare[$iuy],1));
$gp=str_replace($gpf . "framed" . "[" . "]=" . $vdy . ";", $gpf . "framed" . "[" . "] = " . $delaysare[$iuy] . ";", $gp); //, 1);
} else if (strpos($delaysare[$iuy], "-") !== false) {
$delaysare[$iuy]='' . ($delaysare[-1 + $iuy] - substr($delaysare[$iuy],1));
$gp=str_replace($gpf . "framed" . "[" . "]=" . $vdy . ";", $gpf . "framed" . "[" . "] = " . $delaysare[$iuy] . ";", $gp); //, 1);
} else {
$gp=str_replace($gpf . "framed" . "[" . "]=" . $vdy . ";", $gpf . "framed" . "[" . "] = " . $delaysare[$iuy] . ";", $gp); //, 1);
}
}
}
}
}
$enbit="";
$outgp=$gp;
//
// Rest of last gasp changes (of recent times) follows ...
//
}
?>
โฆ enabling you to refine your animated GIF aesthetics, we personally being of the belief that an animated GIF loses a lot of nuance if its delays between slides are all the same. It can feel quite robotic at times.
Previous relevant Animated Gif Creator Image Filters Tutorial is shown below.
On top of the functionality of yesterdayโs Animated Gif Creator Image Dimensions Tutorial we want to offer โฆ
PHP GD library imagefilter functionality
Hereโs our table of context for thechanged tutorial_to_animated_gifphp animated
GIF creator web application โฆ
Comes into play as a recall PHP execution receives HTML form data |
---|
<?php
?> |
Again as PHP writes out the PHP to create the animated GIF, an example โฆ |
<?php echo โ
โ; ?> |
Used as PHP writes PHP in this way โฆ |
<?php
โ; ?> |
And in order to correctly set the value of that new span element (ready to host a dropdown (select) element for image filtering that replaces a hardcoded โImageโ word with Image Filtering dropdown options presented for user interaction) in a recall scenario, in this PHP writes Javascript code snippet change |
<?php echo โ
โ; ?> |
And the PHP writes HTML new HTML form type=hidden fields that navigate up to the recalled PHP as well as the iframe element that will help gather animated GIF image slide dimensions |
<?php echo โ
โ; ?> |
Used by that select onchange logicโs PHP writing Javascript called (and other) functions |
<?php echo โ
โ; ?> |
Did you know?
As progress, also, weโve added to the second presentation part of your created animated GIF the โclickโ ability to download the animated GIF to your local device or computer. Here on this MacBook Pro (using macOS Mojave), to further open that downloaded animated GIF did something very interesting. Even though the downloaded file was downloaded into the Downloads folder as โmy_rjm_gif.gifโ as a default application to use with a โclickโ on it (ie. its โassociationโ application) we were surprised it opened in Preview (usually the preserve of all things PDF) and displayed like a PDF with all the images making up its โslidesโ showing as โslidesโ in Preview. Cute, huh?!
Previous relevant Animated Gif Creator Image Dimensions Tutorial is shown below.
You canโt really claim to have a fully tailorable image creation process if you canโt allow the user to have some control over the final โฆ
width x height
โฆ image dimensions. As you develop webpages you will find requirements to fit images into set spaces, and that is all okay if the images suit those dimensions exactly, or proportionally. And that is where the PHP GD library imagescale function can come in handy.
So, on our quest to improve on the Animated GIF Creator web application of yesterdayโs Animated Gif Creator Watermark Display Mode Tutorial there is a one PHP codeline of difference to make this animated GIF dimensions be user controllable โฆ
<?php echo โ
$eachone=" if (\$randomizematch == '' || \$randomizematch == \"\$randomizeloopcnt\") {
\$text='';
// Open the first source image and add the text.
\$image = imagecreatefromjpeg('source01.jpg');
" . $setwh . "
\$text_color = imagecolorallocate(\$image, " . $r200 . ", " . $g200 . ", " . $b200 . ");
imagestring(\$image, 5, 5, 5, \$text, \$text_color);
// Generate GIF from the $image
// We want to put the binary GIF data into an array to be used later,
// so we use the output buffer.
ob_start();
imagegif(\$image);
\$frames[]=ob_get_contents();
\$framed[]=40; // Delay in the animation.
ob_end_clean();
// And again..
}
";
โ; >
โฆ but am guessing youโd want some context around that, wouldnโt you, for thechanged tutorial_to_animated_gifphp animated
GIF creator web application?!
Comes into play as a recall PHP execution receives HTML form data |
---|
<?php
?> |
Again as PHP writes out the PHP to create the animated GIF |
<?php echo โ
โ; ?> |
And in order to correctly set the value of that new dropdown (select) element in a recall scenario, in this PHP writes Javascript code snippet change |
<?php echo โ
โ; ?> |
And the PHP writes HTML new HTML form type=hidden fields that navigate up to the recalled PHP as well as the iframe element that will help gather animated GIF image slide dimensions |
<?php echo โ
โ; ?> |
And example of changed PHP writes HTML image slide textboxes whereby a new global data attribute called โdata-whโ helps out the user with their newly presented โimage dimensions choiceโ dropdown |
<?php echo โ
โ; ?> |
Used by that iframe onload logicโs PHP writing Javascript called (and other) functions |
<?php echo โ
โ; ?> |
Previous relevant Animated Gif Creator Watermark Display Mode Tutorial is shown below.
Itโs not just โฆ
- the watermark colour of yesterdayโs Animated Gif Creator Watermark Colour Tutorial that can help with an animated GIF being more self explanatory (in a display sense) โฆ it is todayโs new โฆ
- watermark display mode out of โฆ
- Title Just on First
- Title on First and Count on Others
- Title With a Count on All
- No Watermark
โฆ that can help us know where we are up to, given the use of the middle options above, again, doing a little to โbridgeโ the gap between a video presentation and an animated GIF one we can create with thechanged tutorial_to_animated_gifphp animated
GIF creator web application.
This new functionality interfaces to the online user via a new dropdown (select) element replacement for the hardcoded โTitleโ word of one of the headers. More and more, we start to see the benefits of involving โoptionโ subelements with that โselectโ hosting one being given IDs as you can surmise from the initial HTML (via PHP) โฆ
<?php echo โ
Tutorial Slideshow <select style='display:inline-block;width:80px;' onchange='watermarkchange(this);' id='watermarkmode' name='watermarkmode'><option id=watermarkoption value=''>Title</option><option value=''>Title Just on First</option><option value=' '>Title on First and Count on Others</option><option value=' '>Title With a Count on All</option><option id=optnow value=\"\\n\">No Watermark</option></select>
โ; ?>
โฆ referencing user interface โonchangeโ Javascript logic โฆ
<?php echo โ
function watermarkchange(oselwater) {
var ovalis=oselwater.value
if (ovalis == ' ') {
document.getElementById('watermarkoption').innerHTML='Title on First and Count on Others';
document.getElementById('watermarkoption').value=ovalis;
} else if (ovalis == ' ') {
document.getElementById('watermarkoption').innerHTML='Title With a Count on All';
document.getElementById('watermarkoption').value=ovalis;
} else if (ovalis.length == 0) {
document.getElementById('watermarkoption').innerHTML='Title Just on First';
document.getElementById('watermarkoption').value=ovalis;
} else {
document.getElementById('watermarkoption').innerHTML='No Watermark';
document.getElementById('watermarkoption').value=ovalis;
}
}
โ; ?>
โฆ and because this new dropdown (select) element is within an HTML form and contributes to messaging sent to recalls of the PHP, all the following PHP and Javascript snippets are interesting too โฆ
Comes into play as a recall PHP execution receives HTML form data |
---|
<?php
?> |
Again as PHP writes out the PHP to create the animated GIF |
<?php echo โ
โ; ?> <?php
?> |
And in order to correctly set the value of that new dropdown (select) element in a recall scenario, in this PHP writes Javascript code snippet change |
<?php echo โ
โ; ?> |
Previous relevant Animated Gif Creator Watermark Colour Tutorial is shown below.
Weโre revisiting the Animated Gif Creator web application last looked at with the recent Haiku Multimedia via Media Record Genericization Tutorial on a quest to โbridgeโ the gap between โฆ
- video โฆ and โฆ.
- animated GIF
โฆ as presentation tools, that โbridgeโ being the operative word, as animated GIFs cannot match video even respecting the audio capabilities of videos, but there are things we can think of with our web application to improve it. And todayโs start of this quest is to allow for user defined watermark (ie. text) colour on that first slide.
This control may mean that the first slide stands out enough to distinguish it enough from others to tell the user, especially on a rerun of the animated GIF presentation, that the user is at the start of the presentation. Of course, with the video HTML element, this โwe are at the start of the presentationโ is pretty obvious by the look of the controls.
Thechanged tutorial_to_animated_gifphp animated
GIF creator uses and incorporates a new input type=color colour picker.
Previous relevant Haiku Multimedia via Media Record Genericization Tutorial is shown below.
Coming at yesterdayโs Haiku Multimedia via Media Record Background Tutorial โฆ
- we start to allow a comma separated list of user entered image URLs into the Background URL textbox as a possibility โฆ
- along the way getting into some โData-URI http error 414โ problems we needed โconsole.logโ to help us out debugging โฆ hence todayโs tutorial picture โฆ and โฆ
- a new genericization strategy โฆ
โฆ with a familiar idea, for us, that being โฆ
change a hardcoding into a dynamic HTML concept
โฆ that dynamic HTML concept being the most โhands onโ genericization tool we could think of as far as โuser controlโ goes. The hardcoding is pretty obvious for this current โHaiku Creationโ web application, that being โฆ
(the noun) "Haiku"
โฆ and the most โhands onโ genericization tool we could think of being a favourite of ours โฆ
<h1><div onblur=titlefix(); style="display:inline-block;border:2px solid transparent;" id=subjectword contenteditable=true title='Can change this'>Haiku</div> Animated GIF Creator</h1>
โฆ the HTML div element attribute contenteditable=true โฆ teamed up with the Javascript โฆ
function titlefix() {
var dgebiswih=document.getElementById('subjectword').innerHTML;
var dgebiswihtwo=dgebiswih;
if (dgebiswihtwo == "") { dgebiswihtwo="-"; }
document.title=document.title.replace(lastword, dgebiswihtwo);
document.getElementById('bag').value=document.getElementById('bag').value.replace(lastword, dgebiswihtwo);
document.getElementById('bemail').value=document.getElementById('bemail').value.replace(lastword, dgebiswihtwo);
document.getElementById('bsms').value=document.getElementById('bsms').value.replace(lastword, dgebiswihtwo);
document.getElementById('aemail').href=document.getElementById('aemail').href.replace(encodeURIComponent(lastword), encodeURIComponent(dgebiswihtwo));
prefix=prefix.replace('stitle=' + encodeURIComponent('My ' + lastword), 'stitle=' + encodeURIComponent(('My ' + dgebiswih + '`').replace('My `','').replace('`','')));
lastword=dgebiswihtwo;
}
But why the border:2px solid transparent; CSS styling? Well, that โHaikuโ hardcoding replacement could be โnothingโ (ie. a blank string, effectively like an implied English โaโ article to reach a web application title of โAnimated GIF Creatorโ, and here we leave off any topic line annotations, if that swings the bargain for you). But how to change from โnothingโ back to โsomethingโ? That 2px transparent border gives you a way to find your elusive โฆ
<h1><div onblur=titlefix(); style="display:inline-block;border:2px solid transparent;" id=subjectword contenteditable=true title='Can change this'></div> Animated GIF Creator</h1>
โฆ again.
So, on top of yesterdayโs Haiku Multimedia via Media Record Share Tutorial we changed โฆ
- todayโschanged haiku_animated_gif
htmlโs Haiku
creation and sharing web application live run link (we hope you try for yourself) โฆ
- calls thechanged macos_say_record
php โฆ which also โฆ
- calls the HTML/Javascript thechanged client_browsing
htm child web application to handle this HTML input capture usage
- calling thechanged tutorial_to_animated_gif
php animated GIF creator
Previous relevant Haiku Multimedia via Media Record Background Tutorial is shown below.
Yesterdayโs Haiku Multimedia via Media Record Share Tutorial helped with the โHaiku feelโ to our Haiku Creation web application. The thing is, though, as we found with the video and YouTube API interfacing talents of our (ostenbibly) Karaoke web application, there is good reason to envisage this Haiku Creation web application fitting the bill for other possibilities. With that in mind, we decided to โฆ
- fix the positioning of the animated GIF in the lower art of the webpage โฆ and โฆ
- allow the Choose File(s) local browsing functionality โฆ
- browse for a single image file that could be the background image behind every (could be Haiku) animated GIF โslideโ โฆ or โฆ
- browse for multiple image files that could be sequenced background images behind corresponding (could be Haiku) animated GIF โslideโ with its (could be Haiku based) textarea derived corresponding record line overlayed annotation for that โslideโ โฆ a pretty apt use for multiple property โฆ
<input type=file accept="image/*,video/*,audio/*" capture multiple></input>
โฆ still supporting yesterdayโs progress supporting audio and/or video foreground data and email sharing
As you might surmise from this, we are opening the โHaiku feelโ up to lots more data than represented by a Haiku (5, 7, 5) syllable of text data arrangement. Weโll see if the โgenericization driveโ continues?!
On top of yesterdayโs Haiku Multimedia via Media Record Share Tutorial we changed โฆ
- todayโschanged haiku_animated_gif
htmlโs Haiku
creation and sharing web application live run link (we hope you try for yourself) โฆ
- calls thechanged macos_say_record
php โฆ which also โฆ
- calls the HTML/Javascript thechanged client_browsing
htm child web application to handle this HTML input capture usage
Previous relevant Haiku Multimedia via Media Record Share Tutorial is shown below.
Everybody is somebodyโs child. And often, in a modular I.T. woooooorrrrlllld a piece of code can be anotherโs child, even though they have an identity as a parent in their own right. It was the latter role we said goodbye to (developing further, right now) with yesterdayโs Media Mix Play Audio Video Mix Concatention Tutorial but we found, returning to our recent Haiku web application, this โVoiceover Ideasโ middle child in its โฆ
- iframe โchildโ window (especially where all participants reside on the RJM Programming domain) โฆ
- popup โchildโ window (especially where participants reside on a local web server)
โฆ and other โchildlikeโ Ajax/FormData or โnavigation to via HTML formโ guises may still need development to satisfy integration requirements (of the Haiku web application, in all its guises).
So working on top of where we left off Haiku work with the recent Haiku Multimedia via Media Record Capture Tutorial we implemented โฆ
- todayโschanged haiku_animated_gif
htmlโs Haiku
creation and sharing web application live run link โฆ
- calls thechanged macos_say_record
php โฆ which also โฆ
- and uses thechanged emailhtml
php PHP Inline HTML Email helper
Previous relevant Haiku Multimedia via Media Record Capture Tutorial is shown below.
Letโs semi-drop the โmacOSโ on our โmedia captureโ functionality weโre developing currently, because over the last two days it has jumped out of this restrictive thought pattern, either through the โvoiceoverโ idea of โฆ
- non-mobile Adobe Flash Player plugin audio recording (Speech to Audio) โฆ as well as โฆ
- input type=file capture mobile browsing and/or creating (iOS video) and non-mobile browsing of media with an audio (Speech to Audio) capability โฆ on top of that original โฆ
- macOS or Mac OS X โsayโ command line command Text to Audio original โvoiceoverโ idea
โฆ onto yesterdayโs MacOS and Other Mobile Media Record Tutorial you can join the story with, below.
And way back at Mac OS X Text to English Speech Primer Tutorial we can revisit the โsynchronicity of mediaโ ideas we are so keen about. Our conduit idea to get us there has been a revisit of the Haiku creation work of Haiku Animated Gif Creator Tutorial where we allow either a โฆ
- audio data-URI โฆ or โฆ
- video data-URI
โฆ form the โforegroundโ for an animated GIF (Haiku wording) โbackgroundโ easy to show the user creating it, and shareable via an email HTML attachment approach, on some email clients (eg. Gmail webmail).
Along the way we repurposed the โdishevelmentโ of yesterday into more programmatically restrictive web application functionality to come up with โฆ
- todayโschanged haiku_animated_gif
htmlโs Haiku
creation and sharing web application live run linkโs Ajax/FormData email sending โฆ
function waitforalatr() { // features Ajax/FormData techniques to send email via inhouse PHP email helper
if (document.getElementById('iurl').value == '') {
setTimeout(waitforalatr, 2000);
} else {
alatr();
altsubject='My Haiku ...';
var tois=prompt('Who do you want to email to? Optionally hashtag (#) separate your own personal subject line to the email (eg. theemail@theemailplace.com#Hello there, it is moi.)', '');
if (tois == null) { tois=''; }
if (tois.indexOf('@') != -1) {
var alts=tois.split('#');
if (alts.length > 1) { altsubject=alts[1]; tois=alts[0]; }
//var text=document.getElementById('result').innerHTML;
//document.getElementById('ifem').innerHTML="<iframe onload=checkz(this); src='//www.rjmprogramming.com.au/HTMLCSS/emailhtml.php?to=" + encodeURIComponent(tois) + '&subj=' + thisencodeURIComponent(altsubject) + ' ... ') + '&sliceminusten=' + encodeURIComponent(text.slice(-10)) + "' style=width:500px;height:600px;></iframe>";
var zhr = new XMLHttpRequest();
var zform=new FormData();
//zform.append('inline', '');
zform.append('to', tois);
zform.append('subj', altsubject + ' ... ');
zform.append('tdhuhta', '<html><body>' + document.getElementById('bpalette').innerHTML.replace('<audio ','<audio loop ').replace('<video ','<video loop ').replace('position:absolute;','').replace('left:','margin-left:0.').replace('top:','margin-top:0.') + '</body></html>');
zhr.open('post', '//www.rjmprogramming.com.au/HTMLCSS/emailhtml.php', true);
zhr.send(zform);
document.getElementById('iurl').value='';
alert('Email sent with downloadable HTML attachment.');
}
}
}
โฆ workings โฆ - calls on achanged macos_say_record
php live
run link โฆ and also โฆ
- calls the HTML/Javascript thechanged client_browsing
htm child web application to handle this HTML input capture usage and interfacing to (now various) parent.window scenarios โฆ along the way also involving โฆ
- recentlychanged tutorial_to_animated_gif
php animated GIF creator โฆ and โฆ
- Inhouse HTML Email helper/creatorโs key interfacing code now goes โฆ
<?php
$smt="";
if (isset($_GET['sliceminusten'])) { $smt=' (' . str_replace(" ","+",urldecode($_GET['sliceminusten'])) . ')'; }
$honesmt="Paste to lightgreen here (already copied from lightgreen there (but recopy and repaste yourself if last characters" . $smt . " do not match) and click yellow button to Email off this Audio player ...";
if (strlen($smt) == 13 && strpos(str_replace("+"," ",('' . urldecode($_GET['to']))),"@") !== false && str_replace("+"," ",('' . urldecode($_GET['subj']))) != '') {
echo "<html><head><script type='text/javascript'>
var smt=('" . $smt . "').substring(2).substring(0,10), smts='';
function onsm() {
var wpr=null;
var wp=window.parent;
if (wp) { wpr=parent.document.getElementById('result'); }
if ((window.opener && window.opener !== window) || (wp && wpr)) {
if (5 == 5) { // window.opener.document.getElementById('result')) {
document.getElementById('divplace').innerHTML='Email sent' + smts + '.';
//alert(window.opener.document.getElementById('result').slice(-10) + ' vs ' + smt);
return true;
} else {
document.getElementById('divplace').innerHTML='Other green textbox not detected.';
return false;
}
} else {
document.getElementById('divplace').innerHTML='Not a popup window.';
return false;
}
}
function fixta() {
if (document.getElementById('taready').value.indexOf('#') == -1 && ((document.getElementById('taready').value.indexOf('data:audio/') == 0 || document.getElementById('taready').value.indexOf('data:video/') == 0) || document.getElementById('taready').value == '')) {
if (document.getElementById('taready').value == '' || (' ' + document.getElementById('taready').value).slice(-10) == smt) {
if (document.getElementById('taready').value != '') {
var midbit=document.getElementById('taready').value.split('data:')[1].split(';')[0] + ' src=' + \"'\";
document.getElementById('taready').value='<body><' + midbit.substring(0,5) + ' id=thisaudio controls><source type=' + midbit + document.getElementById('taready').value.replace(/\ /g,'+') + \"'\" + '></source></' + midbit.substring(0,5) + '></body>';
} else {
document.getElementById('taready').value='<body><p></p></body>';
smts=' with the subject only';
}
return true;
} else {
//document.getElementById('divplace').innerHTML='Copy failed because ' + (' ' + document.getElementById('taready').value).slice(-10) + ' paste does not match ' + smt + ' copy.';
document.getElementById('divplace').innerHTML='Copy failed because paste does not match copy.';
return false;
}
} else {
document.getElementById('divplace').innerHTML='Incorrect data';
return false;
}
}
</script></head><body onload=\"document.getElementById('taready').focus(); if (wpr) { document.getElementById('status').innerHTML='Copy and Paste Done Below ...'; } \"><h1 id=status>" . $honesmt . "</h1>
<form target=ifplace onsubmit=\"if (fixta()) { return onsm(); } else { return false; }\" action=./emailhtml.php method=POST>
<input type=hidden name=inline value=''></input>
To: <input style=width:80%; type=text name=to value='" . str_replace("+"," ",urldecode($_GET['to'])) . "'></input><br>
Subject: <input style=width:80%; type=text name=subj value='" . str_replace("+"," ",urldecode($_GET['subj'])) . "'></input><br>
<textarea style=width:100%;background-color:lightgreen; cols=80 rows=10 name=tdhuhta id=taready></textarea><br><br>
<input id=sub type=submit style=background-color:yellow; value='Email'></input></form><br>
<iframe style=display:none; name=ifplace id=ifplace src=./emailhtml.php></iframe>
<div id=divplace></div>
</body></html>";
} else {
echo "<html><body><p>Incorrect usage.</p></body></html>";
}
exit;
?>
โฆ to pull all this together in that tighter way (so long Colombo) for you to try yourself.
Previous relevant MacOS and Other Mobile Media Record Tutorial is shown below.
Weโre letting a little โdishevelmentโ continue with todayโs work on top of yesterdayโs MacOS Speech to Flash Player Audio Record Tutorial.
The reason (to our mind) is that involving mobile functionality into a media web applicationโs sphere of influence is a big step with more than the usual time needed for testing โฆ well, thatโs my excuse, anyway. The major reason for this is that the โฆ
<input type=file accept="video/*,audio/*" capture></input>
โฆ is an incredible recent development (allowing dynamic media creation, with โretakeโ possibilities, all because of that one โcaptureโ property above) separating the mobile (smart device) platforms from the previous laptop media capture capabilities, and at least doubles the amount of unit testing needed to prove the code workings.
And so, for a little while, some users will be annoyed that they see web application functionality not meant for their platform characteristics.
Sometimes โdishevelmentโ can work, too, or โstewing for a dayโ, because it turns out a piece of functionality you thought to be impossible with a particular platform amazingly becomes possible the next day?! Hence the adage โฆ โmulling is amazingโ!
Code wise โฆ
- calls (just like Animated GIF Audio or Video Foreground Tutorial did) the HTML/Javascript thechanged client_browsing
htm child web application to handle this HTML input capture usage and interfacing to (now various) parent.window scenarios โฆ
- called by achanged macos_say_record
php live
run link โฆ that relies on our โฆ
- Inhouse HTML Email helper/creatorโs key interfacing code now goes โฆ
<?php
$smt="";
if (isset($_GET['sliceminusten'])) { $smt=' (' . str_replace(" ","+",urldecode($_GET['sliceminusten'])) . ')'; }
if (strlen($smt) == 13 && strpos(str_replace("+"," ",('' . urldecode($_GET['to']))),"@") !== false && str_replace("+"," ",('' . urldecode($_GET['subj']))) != '') {
echo "<html><head><script type='text/javascript'>
var smt=('" . $smt . "').substring(2).substring(0,10), smts='';
function onsm() {
var wpr=null;
var wp=window.parent;
if (wp) { wpr=parent.document.getElementById('result'); }
if ((window.opener && window.opener !== window) || (wp && wpr)) {
if (5 == 5) { // window.opener.document.getElementById('result')) {
document.getElementById('divplace').innerHTML='Email sent' + smts + '.';
//alert(window.opener.document.getElementById('result').slice(-10) + ' vs ' + smt);
return true;
} else {
document.getElementById('divplace').innerHTML='Other green textbox not detected.';
return false;
}
} else {
document.getElementById('divplace').innerHTML='Not a popup window.';
return false;
}
}
function fixta() {
if (document.getElementById('taready').value.indexOf('#') == -1 && ((document.getElementById('taready').value.indexOf('data:audio/') == 0 || document.getElementById('taready').value.indexOf('data:video/') == 0) || document.getElementById('taready').value == '')) {
if (document.getElementById('taready').value == '' || (' ' + document.getElementById('taready').value).slice(-10) == smt) {
if (document.getElementById('taready').value != '') {
var midbit=document.getElementById('taready').value.split('data:')[1].split(';')[0] + ' src=' + \"'\";
document.getElementById('taready').value='<body><' + midbit.substring(0,5) + ' id=thisaudio controls loop><source type=' + midbit + document.getElementById('taready').value.replace(/\ /g,'+') + \"'\" + '></source></' + midbit.substring(0,5) + '></body>';
} else {
document.getElementById('taready').value='<body><p></p></body>';
smts=' with the subject only';
}
return true;
} else {
//document.getElementById('divplace').innerHTML='Copy failed because ' + (' ' + document.getElementById('taready').value).slice(-10) + ' paste does not match ' + smt + ' copy.';
document.getElementById('divplace').innerHTML='Copy failed because paste does not match copy.';
return false;
}
} else {
document.getElementById('divplace').innerHTML='Incorrect data';
return false;
}
}
</script></head><body onload=\"document.getElementById('taready').focus();\"><h1 id=status>Paste to lightgreen here (already copied from lightgreen there (but recopy and repaste yourself if last characters" . $smt . " do not match) and click yellow button to Email off this Audio player ...</h1>
<form target=ifplace onsubmit=\"if (fixta()) { return onsm(); } else { return false; }\" action=./emailhtml.php method=POST>
<input type=hidden name=inline value=''></input>
To: <input style=width:80%; type=text name=to value='" . str_replace("+"," ",urldecode($_GET['to'])) . "'></input><br>
Subject: <input style=width:80%; type=text name=subj value='" . str_replace("+"," ",urldecode($_GET['subj'])) . "'></input><br>
<textarea style=width:100%;background-color:lightgreen; cols=80 rows=10 name=tdhuhta id=taready></textarea><br><br>
<input id=sub type=submit style=background-color:yellow; value='Email'></input></form><br>
<iframe style=display:none; name=ifplace id=ifplace src=./emailhtml.php></iframe>
<div id=divplace></div>
</body></html>";
} else {
echo "<html><body><p>Incorrect usage.</p></body></html>";
}
exit;
?>
Please feel free to try it out yourself, email sharing as you go.
Previous relevant MacOS Speech to Flash Player Audio Record Tutorial is shown below.
Yesterdayโs MacOS Text to Audio Share Tutorial involved โฆ
- local web server (over macOS) text to audio (via macOS say) programmatical input source for โvoiceoverโ aims โฆ and today, still on โฆ
- local web server (over macOS) (user) we have speech to audio (via Adobe Flash Player plugin) input source for โvoiceoverโ or โdictationโ or โvoice memo feelingโ aims
โฆ all shareable via email. So these are two non-mobile โvoiceoverโ ideas, and we will present a mobile idea into the future, and thereby open a public domain worthy side to the functionality, then. Rereading here, it just tweaked with us that we can offer this โpublic domainโ aspect even today with achanged macos_say_recordphp live
run link here, and your Flash Player methodology could work as long as you realize it will be later we hide the inapplicable macOS โsayโ logics for โpublic domainโ usage.
Youโll see in these changes more interplay among โฆ
- popup window child windows โฆ and
- iframe child windows that listen out for the (next) Flash Player *.wav file creation event via a recursive โฆ HTML โฆ
<?php
<iframe onload=checkff(this); name=checkflash id=checkflash style=display:none; src='./macos_say_record.php?audiosize=y'></iframe>
?>
โฆ
<?php
if (isset($_GET['audiosize'])) {
// if (file_exists('HTTP://www.rjmprogramming.com.au/MarkItUp/html/audio/audio.wav')) {
if (isset($_GET['getmecontent'])) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'HTTP://www.rjmprogramming.com.au/MarkItUp/html/audio/audio.wav');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
echo "<html><body onload=\" parent.document.getElementById('audioname').value='audiocapture.wav'; parent.document.getElementById('daudiolater').innerHTML='<audio id=thataudio controls autoplay loop><source type=audio/x-wav src=" . "data:audio/x-wav;base64," . base64_encode($output) . "></source></audio> <a style=display:inline-block;text-decoration:none;cursor:pointer; onclick=emailit(); title=Email></a>';\"><p>" . strlen($output) . "</p><div>data:audio/x-wav;base64," . base64_encode($output) . "</div></body></html>";
} else {
//$context = stream_context_create(array('http' => array('header'=>'Connection: close\r\n')));
//$ct=file_get_contents('HTTP://www.rjmprogramming.com.au/MarkItUp/html/audio/audio.wav',false,$context);
//file_put_contents("x.x",strlen($ct));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'HTTP://www.rjmprogramming.com.au/MarkItUp/html/audio/audio.wav');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
echo "<html><body><p>" . strlen($output) . "</p><div></div></body></html>";
}
// } else {
// echo "<html><body><p>-1</p><div></div></body></html>";
// }
exit;
}
?>
โฆ file_get_contents turning out to be so much slower than curl
Without resorting to any passwords we tighten up the interface to the PHP email helper code at the PHP email helper code end by insisting the email only be sent if the user entry into the interim textarea โฆ
- contains no โ#โ characters
- starts with โฆ data:audio/
- ends with the same 10 characters passed over to the PHP email helper code
โฆ as per โฆ
<?php
$smt="";
if (isset($_GET['sliceminusten'])) { $smt=' (' . str_replace(" ","+",urldecode($_GET['sliceminusten'])) . ')'; }
if (strlen($smt) == 13 && strpos(str_replace("+"," ",('' . urldecode($_GET['to']))),"@") !== false && str_replace("+"," ",('' . urldecode($_GET['subj']))) != '') {
echo "<html><head><script type='text/javascript'>
var smt=('" . $smt . "').substring(2).substring(0,10), smts='';
function onsm() {
if (window.opener && window.opener !== window) {
if (5 == 5) { // window.opener.document.getElementById('result')) {
document.getElementById('divplace').innerHTML='Email sent' + smts + '.';
//alert(window.opener.document.getElementById('result').slice(-10) + ' vs ' + smt);
return true;
} else {
document.getElementById('divplace').innerHTML='Other green textbox not detected.';
return false;
}
} else {
document.getElementById('divplace').innerHTML='Not a popup window.';
return false;
}
}
function fixta() {
if (document.getElementById('taready').value.indexOf('#') == -1 && (document.getElementById('taready').value.indexOf('data:audio/') == 0 || document.getElementById('taready').value == '')) {
if (document.getElementById('taready').value == '' || (' ' + document.getElementById('taready').value).slice(-10) == smt) {
if (document.getElementById('taready').value != '') {
var midbit=document.getElementById('taready').value.split('data:')[1].split(';')[0] + ' src=' + \"'\";
document.getElementById('taready').value='<body><audio id=thisaudio controls loop><source type=' + midbit + document.getElementById('taready').value.replace(/\ /g,'+') + \"'\" + '></source></audio></body>';
} else {
document.getElementById('taready').value='<body><p></p></body>';
smts=' with the subject only';
}
return true;
} else {
//document.getElementById('divplace').innerHTML='Copy failed because ' + (' ' + document.getElementById('taready').value).slice(-10) + ' paste does not match ' + smt + ' copy.';
document.getElementById('divplace').innerHTML='Copy failed because paste does not match copy.';
return false;
}
} else {
document.getElementById('divplace').innerHTML='Incorrect data';
return false;
}
}
</script></head><body onload=\"document.getElementById('taready').focus();\"><h1 id=status>Paste to lightgreen here (already copied from lightgreen there (but recopy and repaste yourself if last characters" . $smt . " do not match) and click yellow button to Email off this Audio player ...</h1>
<form target=ifplace onsubmit=\"if (fixta()) { return onsm(); } else { return false; }\" action=./emailhtml.php method=POST>
<input type=hidden name=inline value=''></input>
To: <input style=width:80%; type=text name=to value='" . str_replace("+"," ",urldecode($_GET['to'])) . "'></input><br>
Subject: <input style=width:80%; type=text name=subj value='" . str_replace("+"," ",urldecode($_GET['subj'])) . "'></input><br>
<textarea style=width:100%;background-color:lightgreen; cols=80 rows=10 name=tdhuhta id=taready></textarea><br><br>
<input id=sub type=submit style=background-color:yellow; value='Email'></input></form><br>
<iframe style=display:none; name=ifplace id=ifplace src=./emailhtml.php></iframe>
<div id=divplace></div>
</body></html>";
} else {
echo "<html><body><p>Incorrect usage.</p></body></html>";
}
exit;
?>
Previous relevant MacOS Text to Audio Share Tutorial is shown below.
In order to share the audio file of yesterdayโs MacOS Text to Audio Internationalization Tutorial we cannot use โฆ
- client based โaโ โmailto:โ link approaches because โฆ
- the size of data is too large
- we need to be able to use HTML within Inline HTML Email if we are not happy leaving around RJM Programming web server audio files (which we are not)
โฆ and so we need to call on โฆ
- server (public, not local) based code (ie. PHP, for us) that can email Inline HTML Email
โฆ and calling on that server (public, not local) based code you can choose to โฆ
- involve CORS in an Ajax FormData call or an HTML Form method=POST โฆ or โฆ
- involve window.PostMessage approach (perhaps involving web server audio files that are temporary) โฆ or, as we decided upon โฆ
- involve popup web server โinhouseโ PHP Inline HTML Email creator helper โฆ that โฆ
- codes allowances for the caller situation (that situation having ensured a data-URI โcopyโ of the audio content in in the web browser buffer ahead of the popup window appearing, all instigated via a new
email emoji button (📧)) โฆ
- sets up the PHP code โฆ
<?php
echo "<html><head><script type='text/javascript'> function fixta() { if (document.getElementById('taready').value.indexOf('data:') == 0) { var midbit=document.getElementById('taready').value.split('data:')[1].split(';')[0] + ' src=' + \"'\"; document.getElementById('taready').value='<body><audio id=thisaudio controls loop><source type=' + midbit + document.getElementById('taready').value.replace(/\ /g,'+') + \"'\" + '></source></audio></body>'; } } </script></head><body onload=\"document.getElementById('taready').focus();\"><h1 id=status>Paste to lightgreen here (already copied from lightgreen there) and click yellow button to Email off ...</h1>
<form onsubmit='fixta(); return true;' action=./emailhtml.php method=POST>
<input type=hidden name=inline value=''></input>
<input type=hidden name=to value='" . str_replace("+"," ",urldecode($_GET['to'])) . "'></input>
<input type=hidden name=subj value='" . str_replace("+"," ",urldecode($_GET['subj'])) . "'></input>
<textarea style=width:100%;background-color:lightgreen; cols=80 rows=10 name=tdhuhta id=taready></textarea><br>
<input id=sub type=submit style=background-color:yellow; value='Email to " . str_replace("+"," ",urldecode($_GET['to'])) . " ... " . str_replace("+"," ",urldecode($_GET['subj'])) . "'></input></form>
</body></html>";
exit;
?> - awaits the user clicking an interim HTML form submit button โฆ that โฆ
- recalls itself and really sends the Inline HTML Email containing HTML that includes an audio tag with data-URI content
โฆ this whole scenario only acceptable in its entirety by iOS Mail apps (but not Gmail Webmail nor macOS Mail (at least with our testing)).
Again, given the same local web server provisions as outlined on the day before yesterday, feel free to try out achanged macos_say_record
php macOS โsayโ PHP helper with better email sharing functionality.
Previous relevant MacOS Text to Audio Internationalization Tutorial is shown below.
Yesterdayโs MacOS Text to Audio Primer Tutorial was very โEnglishโ, at least hereabouts. We think it would be good to Internationalize the โsayโ integration with โ-vโ voices in other languages to choose from.
That โInternationalizationโ we have Apple to thank for, because โsayโ documents โฆ
$ say -v โ?โ
Alex en_US # Most people recognize me by my voice.
Alice it_IT # Salve, mi chiamo Alice e sono una voce italiana.
Alva sv_SE # Hej, jag heter Alva. Jag รคr en svensk rรถst.
Amelie fr_CA # Bonjour, je mโappelle Amelie. Je suis une voix canadienne.
Anna de_DE # Hallo, ich heiรe Anna und ich bin eine deutsche Stimme.
Carmit he_IL # ืฉืืื. ืงืืจืืื ืื ืืจืืืช, ืืื ื ืงืื ืืฉืคื ืืขืืจืืช.
Claire nl_NL # Hallo, mijn naam is Claire. Ik ben een Nederlandse stem.
Damayanti id_ID # Halo, nama saya Damayanti. Saya berbahasa Indonesia.
Daniel en_GB # Hello, my name is Daniel. I am a British-English voice.
Diego es_AR # Hola, me llamo Diego y soy una voz espaรฑola.
Ellen nl_BE # Hallo, mijn naam is Ellen. Ik ben een Belgische stem.
Fiona en-scotland # Hello, my name is Fiona. I am a Scottish-English voice.
Fred en_US # I sure like being inside this fancy computer
Ioana ro_RO # Bunฤ, mฤ cheamฤ Ioana . Sunt o voce romรขneascฤ.
Joana pt_PT # Olรก, chamo-me Joana e dou voz ao portuguรชs falado em Portugal.
Jorge es_ES # Hola, me llamo Jorge y soy una voz espaรฑola.
Juan es_MX # Hola, me llamo Juan y soy una voz mexicana.
Kanya th_TH # เธชเธงเธฑเธชเธเธตเธเนเธฐ เธเธดเธเธฑเธเธเธทเนเธญKanya
Karen en_AU # Hello, my name is Karen. I am an Australian-English voice.
Kate en_GB # Hello, my name is Kate. I am a British-English voice.
Kyoko ja_JP # ใใใซใกใฏใ็งใฎๅๅใฏKyokoใงใใๆฅๆฌ่ชใฎ้ณๅฃฐใใๅฑใใใพใใ
Laura sk_SK # Ahoj. Volรกm sa Laura . Som hlas v slovenskom jazyku.
Lekha hi_IN # เคจเคฎเคธเฅเคเคพเคฐ, เคฎเฅเคฐเคพ เคจเคพเคฎ เคฒเฅเคเคพ เคนเฅ. เคฎเฅเค เคนเคฟเคจเฅเคฆเฅ เคฎเฅเค เคฌเฅเคฒเคจเฅ เคตเคพเคฒเฅ เคเคตเคพเคเคผ เคนเฅเค.
Luca it_IT # Salve, mi chiamo Luca e sono una voce italiana.
Luciana pt_BR # Olรก, o meu nome รฉ Luciana e a minha voz corresponde ao portuguรชs que รฉ falado no Brasil
Maged ar_SA # ู ุฑุญุจูุง ุงุณู ู Maged. ุฃูุง ุนุฑุจู ู ู ุงูุณุนูุฏูุฉ.
Mariska hu_HU # รdvรถzlรถm! Mariska vagyok. รn vagyok a magyar hang.
Mei-Jia zh_TW # ๆจๅฅฝ๏ผๆๅซ็พไฝณใๆ่ชชๅ่ชใ
Melina el_GR # ฮฮตฮนฮฑ ฯฮฑฯ, ฮฟฮฝฮฟฮผฮฌฮถฮฟฮผฮฑฮน Melina. ฮฮฏฮผฮฑฮน ฮผฮนฮฑ ฮตฮปฮปฮทฮฝฮนฮบฮฎ ฯฯฮฝฮฎ.
Milena ru_RU # ะะดัะฐะฒััะฒัะนัะต, ะผะตะฝั ะทะพะฒัั Milena. ะฏ โ ััััะบะธะน ะณะพะปะพั ัะธััะตะผั.
Moira en_IE # Hello, my name is Moira. I am an Irish-English voice.
Monica es_ES # Hola, me llamo Monica y soy una voz espaรฑola.
Nora nb_NO # Hei, jeg heter Nora. Jeg er en norsk stemme.
Oliver en_GB # Hello, my name is Oliver. I am a British-English voice.
Paulina es_MX # Hola, me llamo Paulina y soy una voz mexicana.
Samantha en_US # Hello, my name is Samantha. I am an American-English voice.
Sara da_DK # Hej, jeg hedder Sara. Jeg er en dansk stemme.
Satu fi_FI # Hei, minun nimeni on Satu. Olen suomalainen รครคni.
Serena en_GB # Hello, my name is Serena. I am a British-English voice.
Sin-ji zh_HK # ๆจๅฅฝ๏ผๆๅซ Sin-jiใๆ่ฌๅปฃๆฑ่ฉฑใ
Tessa en_ZA # Hello, my name is Tessa. I am a South African-English voice.
Thomas fr_FR # Bonjour, je mโappelle Thomas. Je suis une voix franรงaise.
Ting-Ting zh_CN # ๆจๅฅฝ๏ผๆๅซTing-Tingใๆ่ฎฒไธญๆๆฎ้่ฏใ
Tom en_US # Hello, my name is Tom. I am an American-English voice.
Veena en_IN # Hello, my name is Veena. I am an Indian-English voice.
Victoria en_US # Isnโt it nice to have a computer that will talk to you?
Xander nl_NL # Hallo, mijn naam is Xander. Ik ben een Nederlandse stem.
Yelda tr_TR # Merhaba, benim adฤฑm Yelda. Ben Tรผrkรงe bir sesim.
Yuna ko_KR # ์๋ ํ์ธ์. ์ ์ด๋ฆ์ Yuna์ ๋๋ค. ์ ๋ ํ๊ตญ์ด ์์ฑ์ ๋๋ค.
Yuri ru_RU # ะะดัะฐะฒััะฒัะนัะต, ะผะตะฝั ะทะพะฒัั Yuri. ะฏ โ ััััะบะธะน ะณะพะปะพั ัะธััะตะผั.
Zosia pl_PL # Witaj. Mam na imiฤ Zosia, jestem gลosem kobiecym dla jฤzyka polskiego.
Zuzana cs_CZ # Dobrรฝ den, jmenuji se Zuzana. Jsem ฤeskรฝ hlas.โฆ to go on here, as a help for this level of โInternationalizationโ. Another โlevelโ again would be to translate the webpage and menu wording, but weโve decided against that here today.
So we add a language dropdown and a voice dropdown to help the user explore this Text to Audio functionality accessing a macOS or Mac OS X operating system.
Also, today, weโve introduced โ.m4aโ (audio/mp4) as the default audio file extension to use with the file created via โsayโ โ-oโ switch for all but Safari, as this works better for โall but Safariโ (absolutely).
Given the same local web server provisions as outlined yesterday feel free to try out achanged macos_say_record
php macOS โsayโ PHP helper with better Internationalization functionality, thanks in large part to the great ideas from this useful link.
Previous relevant MacOS Text to Audio Primer Tutorial is shown below.
The previous Mac OS X Text to English Speech Primer Tutorial โฆ
- lauded the โฆ
Text to English Speech via Mac OS Xโs command line say command
- and today we write some PHP (with its very useful exec conduit to โsayโ) to make use of the same (macOS) โsayโ and its Text to Audio talents (via its โ-oโ switch usage)
โฆ and itโs at times like this we wish that the RJM Programming domainโs web server had a macOS operating system. Alas, โsayโ is a macOS and Mac OS X application, but not a Linux one.
None the less, we integrated โฆ
- todayโschanged haiku_animated_gif
htmlโs Haiku
creation and sharing web application live run linkโs workings (last talked about at Haiku Animated Gif Creator Tutorial) with โฆ
- macos_say_record
php macOS โsayโ PHP helper
โฆ so that if you had a MAMP local Apache/PHP/MySql web server going, and you โฆ
- downloaded tutorial_to_animated_gif
php to same MAMP subdirectory as โฆ
- downloaded haiku_animated_gif
html to same MAMP place (which can be the same MAMP document root place as talked about below, in which case HTTP://localhost:8888/haiku_animated_gif.html is what youโd type into the web browser address bar to try this for yourself on a macOS or Mac OS X system) โฆ and โฆ
- downloaded macos_say_record
php to MAMP document root (for us, equating to URL HTTP://localhost:8888/macos_say_record.php)
โฆ then you would be in the position to see a Haiku creation scenario (where we used the Safari web browser) like with todayโs tutorial picture, interesting, in our view, regarding the integration โtacticsโ โฆ
- parent Haiku window opens โฆ
- child (popup) PHP โsayโ helper web application โฆ which โฆ
- passes back to parent โฆ
window.opener.document.getElementById('aurl').value=document.getElementById('result').value;
window.opener.atab(window.opener.document.getElementById('aurl'));
โฆ achieving functionality we often ask HTML iframe elements achieve for our code. HTML iframe does have a role today, though. It uses a favoured โclient pre-emptive iframeโ approach to determine whether we even try to open that popup window above via โฆ
- HTML โฆ
<div id=dif></div> - Javascript โฆ
var mampok=false, mampprefix='';
if (document.URL.indexOf('/localhost') != -1) {
mampprefix="//localhost" + document.URL.split('/localhost')[1].split('/')[0] + "/";
document.getElementById('dif').innerHTML="<iframe onload='oicheck(this);' style='display:none;' src='//localhost" + document.URL.split('/localhost')[1].split('/')[0] + "/'></iframe>";
}
function oicheck(iois) {
mampok=false;
if (iois != null) {
var aconto = (iois.contentWindow || iois.contentDocument);
if (aconto != null) {
if (aconto.document) { aconto = aconto.document; }
if (aconto.body != null) {
if (aconto.body.innerHTML.toLowerCase().indexOf('>not found<') == -1 && aconto.body.innerHTML.toLowerCase().indexOf("our home page for your perusal") == -1) { mampok=true; }
}
}
}
}
// and then later when the textarea has text and its onblur event is triggered ...
if (mampok) {
if (wois) { wois.close(); wois=null; }
wois=window.open(mampprefix + "macos_say_record.php?saythis=" + encodeURIComponent(document.getElementById('myta').value),"_blank","top=460,left=400,width=700,height=400");
} - Text to English Speech via Mac OS Xโs command line say command used by PHP via exec to make say
php (which is useful as a download to a Mac OS X laptop using MAMP) which, today, does not have a live run because the web server of domain rjmprogramming.com.au is a CentOS Linux server โฆ Linux equivalent of Mac OS Xโs say? โฆ read here
- Trying to present this brought up the usual movie production problem with iMovie overlaying the audio on top of the video (though you may want to try, and you could start reading with this link) versus QuickTime Player talent to catch both audio and video tracks (and that we ended up using), but not of the โscreen goings onโ, alas versus MPlayer OSX Extended which can play separately but not two tracks on top and doesnโt do any reconstituting โฆ so โฆ
- Improved on our inhouse Video/Audio synchronizing efforts by allowing audio_video
html supervisor (changed in thisway) be able to be called to press one of its preconceived synchronization buttons onload which we do with (the newly added) Macbeth Act 1 Scene 1 โฆ in a small celebration of the Bard โฆ who, am thinking (in that Falstaff way), would have got a huge chuckle out of โanonymousโ instead of โanonโ during the Three Witches scene โฆ we had to do something to say Happy Birthday
Previous relevant Mac OS X Text to English Speech Primer Tutorial is shown below.
Weโve got a few new ideas today โฆ
Along the way we tried filming the MacBook Pro with the iPad to a YouTube โฆ
โฆ but werenโt happy with the audio quality, alas (too/two).
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
- codes allowances for the caller situation (that situation having ensured a data-URI โcopyโ of the audio content in in the web browser buffer ahead of the popup window appearing, all instigated via a new