|
<?php |
|
// https://piszek.com/2020/05/27/evernote-transcriber/ |
|
|
|
function transcribe_audio_file_in_a_note( $evernoteClient, $note ) { |
|
// This will find the place where file is embedded, so we can display the transcription underneath. |
|
if( preg_match( '#<en-media hash="([a-z0-9]+)"[^>]+>#is', $note->content, $res ) ) { |
|
$id = hex2bin($res[1] ); |
|
$resources = array_filter( $note->resources, function( $resource ) use ( $id ) { |
|
return $resource->data->bodyHash === $id; |
|
} ); |
|
if( $resources ) { |
|
$resource = array_shift( $resources ); |
|
} |
|
} |
|
if ( isset( $resource->mime ) && $resource->mime === 'audio/x-m4a' ) { |
|
// Only audio files |
|
if ( isset( $resource->attributes->applicationData->keysOnly['transcribed'] ) ) { |
|
$this->log( LOG_INFO, 'This resource is already transcribed.' ); |
|
return; |
|
} |
|
// Set for the future |
|
$evernoteClient->client->getNoteStore()->setResourceApplicationDataEntry( $resource->guid, 'transcribed', 'true' ); |
|
// this is your Google Speech API token |
|
$token = "tsrtrastr8astars8tras8t"; |
|
$in = tempnam(sys_get_temp_dir(), 'evernote_transcript') . '.mp4'; |
|
$out = tempnam(sys_get_temp_dir(), 'evernote_transcript') . '.wav'; |
|
$data = $evernoteClient->client->getNoteStore()->getResourceData( $resource->guid ); |
|
file_put_contents( $in, $data ); |
|
// Because Google Speech API is crap and cannot deal with other formats, we have to recode it. |
|
system( "ffmpeg -i $in $out" ); |
|
$data = file_get_contents( $out ); |
|
|
|
$payload = array( |
|
"audio" => array( "content" => base64_encode( $data ) ), |
|
"config" => array( |
|
"languageCode" => "en-US", |
|
"alternativeLanguageCodes" => [ "pl-PL" ], // I only use English or Polish. Your mileage may vary. |
|
"encoding" => "LINEAR16", |
|
"sampleRateHertz" => 44100, |
|
"maxAlternatives" => 1, |
|
"enableAutomaticPunctuation" => true |
|
) |
|
); |
|
$payload = json_encode( $payload ); |
|
$context = stream_context_create( array( |
|
'http' => array( |
|
'ignore_errors' => true, |
|
'header' => "Content-Type: application/json\r\n", |
|
'method' => 'POST', |
|
'content' => $payload |
|
) |
|
) ); |
|
// Wondering about the v1p1beta1 here? You have to use this version to have alternativeLanguageCodes. This of course is not in documentation. |
|
$result = file_get_contents( "https://speech.googleapis.com/v1p1beta1/speech:recognize?fields=results&key=$token", false, $context ); |
|
$result = json_decode( $result, true ); |
|
if ( ! isset ( $result['results'][0]['alternatives'][0]['transcript'] ) ) { |
|
$this->log( LOG_WARNING, 'Empty transcript. ' . print_r( $result, true ) ); |
|
return; |
|
} |
|
$text = $result['results'][0]['alternatives'][0]['transcript']; |
|
$this->log( LOG_INFO, 'Transcript OK: ' . $text ); |
|
|
|
$new_body = str_replace( $res[0], $res[0] . "<div style='font-style: italic'>$text</div>",$note->content ); |
|
$note->content = $new_body; |
|
$evernoteClient->client->getNoteStore()->updateNote( $note ); |
|
} |
|
return $note->content; |
|
} |