Spaces:
Running
Running
import { test, expect, chromium } from "@playwright/test"; | |
import { writeFile } from 'node:fs/promises' | |
import { Readable } from 'node:stream' | |
import {readFileSync} from "fs" | |
test("XXX - test: get a phonetic accuracy evaluation from a recorded audio.", async () => { | |
/** | |
* - DE: | |
* - random choice (random, easy, medium, hard) | |
* - choice from the examples accordion | |
* - record a fake new audio | |
* - upload | |
* - EN: | |
* - random choice (random, easy, medium, hard) | |
*/ | |
// todo: upload del file test_de.wav dalla cartella corrente senza | |
// todo: download del file audio | |
// todo: test online, https://mictests.com/ | |
const urlAudio = "https://huggingface.co/spaces/aletrn/ai-pronunciation-trainer/resolve/main/tests/events/test_de.wav" | |
console.log("import.meta dir", import.meta.dirname, "#"); | |
const dirname = import.meta.dirname; | |
const testAudioEnvPath = `${dirname}/test_de.wav%%noloop` | |
console.log("urlAudio", urlAudio, "#"); | |
console.log("testAudioEnvPath", testAudioEnvPath, "#"); | |
console.log("testAudioEnvPath", testAudioEnvPath, "#"); | |
const response = await fetch(urlAudio) | |
const stream = Readable.fromWeb(response.body) | |
await writeFile(testAudioEnvPath, stream) | |
const string_output = readFileSync(testAudioEnvPath, 'utf8') | |
if (string_output.length > 0) { | |
console.log("testAudioEnvPath", testAudioEnvPath, "#"); | |
console.log("testAudioEnvPath", testAudioEnvPath, "#"); | |
} else { | |
console.log("empty testAudioEnvPath", testAudioEnvPath, "#"); | |
throw new Error("File is empty!"); | |
} | |
// const testAudioEnvPath = `${basedirAudioFiles}/test_de.wav` | |
console.log("start"); | |
console.log("testAudioEnvPath", testAudioEnvPath, "#"); | |
const browser = await chromium.launch({ | |
args: [ | |
"--use-fake-device-for-media-stream", | |
"--use-fake-ui-for-media-stream", | |
`--use-file-for-fake-audio-capture=${testAudioEnvPath}`, | |
], | |
ignoreDefaultArgs: ['--mute-audio'] | |
}) | |
const context = await browser.newContext(); | |
context.grantPermissions(["microphone"]); | |
const page = await browser.newPage({}); | |
await page.goto('http://localhost:7860/'); | |
const radioLanguageSelectedDE = page.getByRole('radio', { name: 'de' }) | |
await radioLanguageSelectedDE.check(); | |
const textboxInput = page.getByLabel('Learner Transcription') | |
await textboxInput.fill('Ich bin Alex, wer bist du?'); | |
const buttonTTS = page.getByRole('button', { name: 'Run TTS' }) | |
await buttonTTS.click(); | |
// todo: improve this hardcoded timeout | |
await page.waitForTimeout(3000); | |
const buttonPlay = page.getByLabel('Play', { exact: true }) | |
await buttonPlay.click(); | |
const waveFormTTS = page.locator('.scroll > .wrapper').first(); | |
await waveFormTTS.waitFor({ state: 'attached' }); | |
await waveFormTTS.waitFor({ state: 'visible' }); | |
await expect(waveFormTTS).toBeVisible(); | |
console.log("waveFormTTS??"); | |
const buttonRecordTTS = page.getByRole('button', { name: 'Record', exact: true }) | |
await buttonRecordTTS.click(); | |
console.log("buttonRecordTTS??"); | |
const buttonStopTTS = page.getByRole('button', { name: 'Stop', exact: true }) | |
await buttonStopTTS.click(); | |
console.log("buttonStopTTS??"); | |
const buttonRecognizeSpeechAccuracy = page.getByRole('button', { name: 'Recognize speech accuracy' }) | |
console.log("buttonRecognizeSpeechAccuracy??"); | |
console.log("buttonRecognizeSpeechAccuracy??"); | |
await buttonRecognizeSpeechAccuracy.click(); | |
console.log("buttonRecognizeSpeechAccuracy=>click!"); | |
console.log("buttonRecognizeSpeechAccuracy=>click!"); | |
await page.waitForTimeout(300); | |
const errorsElements = page.getByText(/Error/); | |
const ErrorText = errorsElements.all() | |
console.log("ErrorText:", (await ErrorText).length, "#"); | |
await expect(errorsElements).toHaveCount(0); | |
console.log("end"); | |
await page.close(); | |
}); | |