#javascript #node.js #dialogflow-es
#javascript #node.js #dialogflow-es
Вопрос:
Я использую чат-бота DialogFlow для обнаружения текстовых и аудиовходов, текст работает нормально, а аудио — нет, я читаю аудиофайлы, которые я генерирую (.mp3 и .wav), читаю их в nodejs и отправляю, но ответа нет, я получаю пустое намерение, оно даже не зарегистрированов истории DialogFlow, но когда я предоставляю ему образец аудио из DialogFlow, он работает нормально, вот мой код, я следую документации, предоставленной DialogFlow:
const sessionId = uuid.v4();
const sessionClient = new dialogflow.SessionsClient({
projectId,
keyFilename,
});
const readFile = util.promisify(fs.readFile);
const inputAudio = await readFile('myfilepath.mp3');
const sessionPath = sessionClient.projectAgentSessionPath(projectId, sessionId);
const request = {
session: sessionPath,
queryInput: {
audioConfig: {
audioEncoding: 'AUDIO_ENCODING_LINEAR_16',
sampleRateHertz: 16000,
languageCode: 'en-US',
},
},
inputAudio,
};
const [response] = await sessionClient.detectIntent(request);
console.log('Detected intent:');
console.log(response);
const result = response.queryResult;
console.log(` Query: ${result.queryText}`);
console.log(` Response: ${result.fulfillmentText}`);
Ответ всегда
{
responseId: '',
queryResult: {
fulfillmentMessages: [],
outputContexts: [],
queryText: '',
speechRecognitionConfidence: 0,
action: '',
parameters: null,
allRequiredParamsPresent: false,
fulfillmentText: '',
webhookSource: '',
webhookPayload: null,
intent: null,
intentDetectionConfidence: 0,
diagnosticInfo: null,
languageCode: 'en-US',
sentimentAnalysisResult: null
},
webhookStatus: null,
outputAudio: <Buffer >,
outputAudioConfig: null
}
Есть ли конкретный способ создания аудиофайла, которому я должен следовать или что?
Спасибо.
Ответ №1:
Я думаю, что ваша проблема связана с кодировкой и частотой дискретизации ваших аудиофайлов.
Я смог воспроизвести сценарий и получить ваш response
вывод, используя образцы из nodejs-dialogflow, в частности detect.js
, с файлом MP3, в котором выполняется образец, подобный этому:
node detect audio resources/book_a_room.mp3 -r 16000
При просмотре поддерживаемых кодировок в примере выполняется:
node detect audio -help
Мы видим, что доступны следующие опции:
-e, --encoding The encoding of the input audio.
[choices: "AUDIO_ENCODING_LINEAR_16", "AUDIO_ENCODING_FLAC", "AUDIO_ENCODING_MULAW", "AUDIO_ENCODING_AMR",
"AUDIO_ENCODING_AMR_WB", "AUDIO_ENCODING_OGG_OPUS", "AUDIO_ENCODING_SPEEX_WITH_HEADER_BYTE"] [default:
"AUDIO_ENCODING_LINEAR_16"]
Эти параметры также можно увидеть в справочнике API Dialogflow для AudioEncoding
. Отсюда мы можем сделать вывод, что MP3 не является поддерживаемой кодировкой, и именно поэтому вы получаете этот response
вывод.
Также при просмотре ссылки на API Dialogflow вы можете увидеть следующее:
… Обратитесь к документации Cloud Speech API для получения более подробной информации.
Заглянув в эту документацию и перейдя в раздел кодирования, вы можете увидеть, что:
Примечание: Преобразование речи в текст поддерживает WAV-файлы с аудио в кодировке LINEAR16 или MULAW.
Итак, возвращаясь к параметрам кодирования из API Dialogflow, мы видим, что для файлов WAV можно использовать следующие:
- AUDIO_ENCODING_LINEAR_16
- AUDIO_ENCODING_MULAW
Важно отметить, что AUDIO_ENCODING_LINEAR_16
эта опция установлена по умолчанию.
Таким образом, вы можете использовать файлы WAV с 1 каналом с правильной частотой дискретизации в соответствии с той, которая есть в вашем файле WAV (например, 44100), и тогда вы получите желаемый ответ. Например:
node detect audio resources/book_a_room_1ch_16Khz.wav -r 16000
Или
node detect audio resources/book-a-room_1ch_44.1Khz.wav -r 44100
В противном случае вы получите сообщения об ошибках, подобные следующим:
{ Error: 3 INVALID_ARGUMENT: Must use single channel (mono) audio, but WAV header indicates 2 channels.
at Object.callErrorFromStatus ...
И
{ Error: 3 INVALID_ARGUMENT: sample_rate_hertz (16000) in RecognitionConfig must either be omitted or match the value in the WAV header ( 44100).
at Object.callErrorFromStatus ...