2016-09-21 3 views
1

jsonの文字列をGoogleの音声APIにポストするとき、FL​​ACのオーディオファイルをbase64にエンコードするのが難しいです。私はいくつかの\ nは、Googleからの返信に気づいたが、base64で十分ではないか、おそらく私は完全にそのような文字列を構築し、それらをjson-yを満たすために十分に把握していない場合は、私はutf-8エンコーディングに傾いていますが、送信される情報をさらに処理するための私の最後の試みは、perlからの他のエラーメッセージの山を私に残しました。どのポインターでも大きな助けになるでしょう! (ポインタが自分でこれを行うことをあきらめ、Googleにサポート料を支払うことであっても)POSTベース64エンコードされたファイルからperlを使用してGoogle音声API

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

私のコードは次のとおりです。ここで

#!/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

GoogleではURLバージョンのBase64が必要ですか? 'encode_base64url'のあなたのバージョンは' MIME :: Base64 :: encode_base64url'と同じように動作せず、 '/ ''、 '' + ''と改行文字を含むGoogleのエコーコードで検証されます。実際、あなたのバージョンは 'encode_base64'と同じ出力を生成します。 URLバージョンでは ''=''も削除する必要があります。 –

答えて

1

を修正スクリプトです。これはかなりの助けになるはずです、私は重複した質問を防ぐためにタイトルと説明を更新するかもしれません!正しい方向に私を指してくれてありがとう、クリストファー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

同じ問題が発生しました。 Googleがデコードできるように、 '+'、 '/'、 '='、 '\ n 'を削除する必要がありますか?私はそれを削除しましたが、私はまだ解読できません。 – hamdanjz4

+0

はい、それは$ doodleのことがやっていることです。それでも問題が発生している場合は、別の問題かもしれません。 –

関連する問題