2016-09-21 1 views
1

Ich habe Schwierigkeiten beim Verschlüsseln einer FLAC-Audiodatei an base64 beim Veröffentlichen einer JSON-Zeichenfolge in der Google-Sprach-API. Ich bemerkte ein paar \ n's in der Antwort von Google, nicht sicher, ob die Base64 nicht gut genug ist, gehen oder vielleicht ich nicht vollständig begreifen, wie man solche Strings bauen und sie Json-y genug machen, um Google zu befriedigen. Ich bin auf utf-8-Codierung gelehnt, aber mein letzter Versuch, die zu sendende Information weiter zu verarbeiten, hat mich mit Bergen von anderen Fehlermeldungen von Perl zurückgelassen. Irgendwelche Hinweise wären eine große Hilfe! (Auch wenn der Zeiger auf tun dies auf eigene Faust zu verzichten und zahlen die Support-Gebühr zu google)POST base64-codierte Datei zu google rede api mit perl

Error message: 
    { 
     "error": { 
     "code": 400, 
     "message": "Invalid value at 'audio.content' (TYPE_BYTES), Base64 decoding failed for "ZkxhQwAAACIQABAAAAlJABQpAfQA8AABS+DDBqlWu7Ba27gz/koR4+04AwAAJAAAAAAAAAAAAAAA\nAAAAAAAQAAAAAAAAATAAAAAAAAABQ5kQAAQAACggAAAAcmVmZXJlbmNlIGxpYkZMQUMgMS4zLjAg\nMjAxMzA1MjYAAAAAgQA... 

Mein Code ist:

#!/usr/bin/env perl 
# Render speech to text using the google cloud speech engine. 
# 
# Kruft Industries Sept. 2016 
# 
# 
# Intended to replace work by the following(not sure where this is hosted): GNU General Public License Version 2 Copyright (C) 2011 - 2012, Lefteris Zafiris 
# <[email protected]> 
# 
# 
# The script takes as input flac files at 8kHz and returns the following values: status : Return status. 0 means success, non zero values indicating different 
# errors. 
# 
# Outputs a voice transcription that satisfies the input of sendmailmp3 for freepbx authored by the above Zafiris I am by no means an expert with the perl 
# language, Please forgive any blaring ugliness :) 

use utf8; 
use MIME::Base64; 
use strict; 
use warnings; 
use LWP::UserAgent; 

if ([email protected] || $ARGV[0] eq '-h' || $ARGV[0] eq '--help') { 
    print "Speech recognition using google cloud speech api.\n\n"; 
    print "Usage: $0 [FILES]\n\n"; 
    exit; 
} 
my $url = "https://speech.googleapis.com/v1beta1/speech:syncrecognize?key=API KEY HERE"; 

my @file_list = @ARGV; foreach my $file 
(@file_list) { 
    print "Opening $file\n"; 
    open(my $fh, "<", "$file") or die "Cant read file: $!"; 
    my $audio = do { local $/; <$fh> }; 
    close($fh); 

my $flac = encode_base64url($audio); 

my $json = '{"config":{"encoding":"FLAC","sample_rate":8000,"language_code":"en-US"},"audio":{"content":"' . $flac . '"}}'; 

my $req = HTTP::Request->new('POST', $url); 
$req->header('Content-Type' => 'application/json'); 
$req->content($json); 

my $lwp = LWP::UserAgent->new; 
my $response = $lwp->request($req); 

print $response->as_string; #debug output google's reply headers and message 
last if (!$response->is_success); 

print $response->content; #debug output the full transcript 
    my $doodle = $response->content; 
    $doodle =~ s/.*\"transcript\"://g; 
$doodle =~ s/}\],.*//g; 
$doodle =~ s/^{\"result\":\[\]}/{\"result\":/g; 
$doodle =~ s/\R//g; 
$doodle =~ s/\*/_/g; 
    print $doodle; 


} 
     sub encode_base64url{ 
     my($data) = @_; 
     return 0 unless $data; 
     $data = encode_base64($data); 
     $data =~ tr#\-_#+/#; 
     return($data); 
     } 
exit; 
+0

Benötigt Google die URL-Version von Base64? Ihre Version von 'encode_base64url' funktioniert nicht auf die gleiche Weise wie' MIME :: Base64 :: encode_base64url', die im Echo-Code von Google bestätigt wurde, der "/", "+" und Zeilenumbrüche enthält. Tatsächlich erzeugt Ihre Version nur die gleiche Ausgabe wie 'encode_base64'. Die URL-Version sollte auch '' = ''entfernen. –

Antwort

1

Hier ist die korrigierte Skript. Dies sollte einige helfen, ich könnte den Titel und die Beschreibung aktualisieren, um doppelte Fragen zu vermeiden! Danke, dass Sie mich in die richtige Richtung weisen, Christopher Oicles!

#!/usr/bin/env perl 
# Render speech to text using the google cloud speech engine. 
# 
# Kruft Industries Sept. 2016 
# 
# 
# Intended to replace work by the following(not sure where this is hosted): GNU General Public License Version 2 Copyright (C) 2011 - 2012, Lefteris Zafiris 
# <[email protected]> 
# 
# 
# The script takes as input flac files at 8kHz and returns the following values: status : Return status. 0 means success, non zero values indicating different 
# errors. 
# 
# Outputs a voice transcription that satisfies the input of sendmailmp3 for freepbx authored by the above Zafiris I am by no means an expert with the perl 
# language, Please forgive any blaring ugliness :) 

use utf8; 
use MIME::Base64; 
use strict; 
use warnings; 
use LWP::UserAgent; 

if ([email protected] || $ARGV[0] eq '-h' || $ARGV[0] eq '--help') { 
print "Speech recognition using google cloud speech api.\n\n"; 
print "Usage: $0 [FILES]\n\n"; 
exit; 
} 
my $url = "https://speech.googleapis.com/v1beta1/speech:syncrecognize?key=API KEY GOES HERE"; 

my @file_list = @ARGV; foreach my $file 
(@file_list) { 
print "Opening $file\n"; 
open(my $fh, "<", "$file") or die "Cant read file: $!"; 
my $audio = do { local $/; <$fh> }; 
close($fh); 

my $flac = encode_base64url($audio); 

my $json = '{"config":{"encoding":"FLAC","sample_rate":8000,"language_code":"en-US"},"audio":{"content":"' . $flac . '"}}'; 

my $req = HTTP::Request->new('POST', $url); 
$req->header('Content-Type' => 'application/json'); 
$req->content($json); 

my $lwp = LWP::UserAgent->new; 
my $response = $lwp->request($req); 

#print $response->as_string; #debug output google's reply headers and message 
last if (!$response->is_success); 

#print $response->content; #debug output the full transcript 
    my $doodle = $response->content; 
    $doodle =~ s/.*\"transcript\"://g; 
$doodle =~ s/}\],.*//g; 
$doodle =~ s/^{\"result\":\[\]}/{\"result\":/g; 
$doodle =~ s/\R//g; 
$doodle =~ s/\*/_/g; 
    print $doodle; 


} 
     sub encode_base64url{ 
     my($data) = @_; 
     return 0 unless $data; 
     $data = encode_base64($data); 
     $data =~ s/\+/-/g; 
     $data =~ s/\//_/g; 
     $data =~ s/\=//g; 
     $data =~ s/\n//g; 
     return($data); 
     } 
exit; 
+0

Ich habe das gleiche Problem erlebt. Sollten wir die '+', '/', '=', und '\ n' entfernen, um von Google entschlüsselt werden zu können? Ich habe es entfernt, aber ich kann immer noch nicht entschlüsselt werden. – hamdanjz4

+0

Ja, das macht das $ doodle-Zeug. Wenn Sie immer noch Probleme haben, könnte es etwas anderes sein. –