Pengenalan ucapan dengan alat pembelajaran mesin

Dalam pekerjaan saya, saya dihadapkan pada kebutuhan untuk memeriksa catatan panggilan untuk kepatuhan karyawan dengan skrip percakapan dengan klien. Biasanya seorang karyawan dialokasikan untuk ini, yang menghabiskan banyak waktu mendengarkan rekaman percakapan. Kami menetapkan sendiri tugas untuk mengurangi waktu yang dihabiskan untuk verifikasi menggunakan alat pengenalan ucapan otomatis (ASR). Kami akan melihat lebih dekat salah satu alat ini.





Nvidia NeMo adalah  seperangkat alat pembelajaran mesin untuk membuat dan melatih model yang didukung GPU.





Model di NeMo menggunakan pendekatan modern untuk pengenalan suara - Connectionist Time Classification (CTC).





Sebelum CTC, pendekatan digunakan di mana file audio input dibagi menjadi segmen ucapan terpisah dan token diprediksi darinya. Kemudian token digabungkan, yang berulang diciutkan menjadi satu, dan hasilnya diumpankan ke keluaran model.





Dalam hal ini, akurasi pengenalan berkurang, karena kata dengan huruf berulang tidak dianggap 100% dikenali dengan benar. Misalnya, "coOperation" direduksi menjadi "coOperation".





Dengan CTC - masih memprediksi satu token per segmen waktu ucapan dan juga menggunakan token kosong untuk mencari tahu di mana harus melipat token duplikat. Munculnya token kosong membantu memisahkan duplikat surat yang tidak boleh dilipat.





Untuk tugas saya, saya mengambil salah satu model (Jasper 10 ร— 5) dan melatihnya dari awal. Untuk pelatihan, kumpulan data publik percakapan telepon dipilih, berisi rekaman audio yang dipotong dan transkripsinya.





Untuk melatih model, Anda perlu menyiapkan file manifes yang berisi informasi tentang file audio dan transkripsi file ini. File manifes memiliki formatnya sendiri:





{{"audio_filepath": "path/to/audio.wav", "duration": 3.45, "text": "sometext"}โ€ฆ{"audio_filepath": "path/to/audio.wav", "duration": 3.45, "text": "sometext"}}
      
      



Model hanya menerima file audio dalam format * .wav. Anda perlu mengulang seluruh daftar file audio dan menggunakan utilitas konsol untuk mengodekan ulang file audio dengan resolusi selain yang diperlukan:





def convertToWav(self, ext):
        if not os.path.exists(self.datadir + '/dataset'):
            tar = tarfile.open(self.an4Path);
            tar.extractall(path=self.datadir);
        sphList = glob.glob(self.datadir + '/dataset/**/*' + ext, recursive=True);
        for sph in sphList:
            wav = sph[:-4] + '.wav';
            cmd = ["sox", sph, wav];
            subprocess.run(cmd);
            print('renamed ' + ext + ' to ' + wav);
      
      



, getduration(filename=audiopath) Librosa, :





def buildManifest(self, transcript_path, manifest_path, wav_path):
        with open(transcript_paths, 'r') as fin:
            with open(manifest_path, 'w') as fout:
                for line in fin:
                    transcript = line[: line.find('(')-1].lower();
                    transcript = transcript.replace('<s>', '').replace('</s>', '');
                    transcript = transcript.strip();
                    file_id = line[line.find('(')+1 : -2];
                    audio_path = os.path.join(self.datadir, wav_paths, file_id[file_id.find('-')+1 : file_id.rfind('-')], file_id +'.wav');
                    duration = librosa.core.get_duration(filename=audio_path);
                    metadata = {
                        "audio_filepath": audio_path,
                        "duration": duration,
                        "text": transcript
                    }
                    print(metadata);
                    json.dump(metadata, fout);
                    fout.write('\n');
      
      



, :





config.yaml:
name: &name "Jasper10x5"
model:
  sample_rate: &sample_rate 16000
  labels: &labels [" ", "a", "", "", "", "", "", "", "", "", "", "", "", "",
                   "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "'"]
 preprocessor:
    _target_: nemo.collections.asr.modules.AudioToMelSpectrogramPreprocessor
    normalize: "per_feature"
    sample_rate: *sample_rate
    features: &n_mels 64
    n_fft: 512
    frame_splicing: 1
    dither: 0.00001
    stft_conv: false
      
      



. pytorch_lighting :





import nemo;
class NemoASR:
    def __init__(self, dataDir):
        self.datadir = dataDir;
        self.CONF_PATH = './config.yaml';
        yaml = YAML(typ="safe");
        with open(self.CONF_PATH) as f:
            self.CONFIG = yaml.load(f);

    def train(self, transcriptionPATH, manifestPATH, wavPATH, testTranscriptionPATH, testManifestPATH, testWavPATH):
        print("begin train");
        train_transcripts = self.datadir + transcriptionPATH;
        train_manifest = self.datadir + manifestPATH;
        if not os.path.isfile(train_manifest):
            self.buildManifest(train_transcripts, train_manifest, wavPATH);
        test_transcripts = self.datadir + testTranscriptionPATH;
        test_manifest = self.datadir + testManifestPATH;
        if not os.path.isfile(test_manifest):
            self.buildManifest(test_transcripts, test_manifest, testWavPATH);
        # params from ./config.yaml
        self.CONFIG['model']['train_ds']['manifest_filepath'] = train_manifest;
        self.CONFIG['model']['validation_ds']['manifest_filepath'] = test_manifest;
        trainer = pl.Trainer(max_epochs=500, gpus=1);
        self.model = nemo_asr.models.EncDecCTCModel(cfg=DictConfig(self.CONFIG['model']), trainer=trainer);
        trainer.fit(self.model);
        print("end train");
#-------------------------------------------------------------
nemoASR = NemoASR('.');
if (nemoASR.checkExistsDataSet()):
    print('dataset loaded');
    nemoASR.train('./dataset/etc/train.transcription',  './dataset/train_manifest.json','./dataset/wav/an4_clstk', './dataset/etc/test.transcription', './dataset/test_manifest.json', './dataset/wav/an4test_clstk');
    nemoASR.model.save_to('./model.sbc');
      
      



:





files = ['./an4/wav/an4_clstk/mgah/cen2-mgah-b.wav'];
    for fname, transcription in zip(files, nemoASR.model.transcribe(paths2audio_files=files)):
        print(f"Audio in {fname} was recognized as: {transcription}");
      
      



, .





NeMo   :





  • GPU;





  • , ;





  • .





  , , -.





ASR . .





, (TTS) (speaker recognition).








All Articles