在将json字符串发布到google speech api时,我很难将FLAC音频文件编码为base64。我在谷歌的回复中注意到了一些问题,不确定base64是否不够好,或者我不完全掌握如何构建这样的字符串并使它们足以满足谷歌的json-y。我倾向于使用utf-8编码,但我最后一次尝试进一步处理要发送的信息,这给我留下了来自perl的大量其他错误消息。任何指针都将是一个很大的帮助! (即使指针是我自己放弃这样做并支付谷歌的支持费用)
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
# <zaf.000@gmail.com>
#
#
# 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 (!@ARGV || $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 :(得分:1)
以下是更正后的脚本。这应该有很多帮助,我可能会更新标题和说明,以防止重复的问题!谢谢你指点我正确的方向,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
# <zaf.000@gmail.com>
#
#
# 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 (!@ARGV || $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;