2

Audacity を使用してオーディオ ファイルから無音部分を削除しようとしています。Trim Silenceと呼ばれる Nyquist プラグインがあり、ファイルの最初と最後から無音部分を削除しますが、途中は削除しません。これを反転させて、最初と最後以外の無音部分を削除したいと思います。

以下の関数がプラグインの関連部分だと思います。truncate-internal-silences 関数を取得するには、どのように変更すればよいですか? (私は Nyquist も Lisp も知りません。そのため、変更どころか、現在の機能を理解するのに苦労しています。)

まったく異なるアプローチも歓迎します。これは、多くのオーディオ ファイルを編集する方法について、現時点での最良の推測にすぎません。

(defun trim-silence ()
  ;; Nyquist plug-ins cannot return 'no audio', so trap as error.
  (if (< (get '*selection* 'peak-level) threshold)
      (throw 'error (format nil "Error.~%All selected audio in the ~a selected track~%~
                                is below the silence threshold.~%~%~
                                Try setting the threshold to a~%~
                                lower (more negative) dB level."
                                (add-num-suffix (get '*track* 'index)))))
  (if (> len (* limit *sound-srate*)) ;max length in samples
      (throw 'error (format nil "Error.\nMax RAM usage by Trim Silence is set to ~a GB.~%This allows a maximum duration ~
                                for a ~a~%track at ~a Hz of ~a.~%Selected track is ~a.~%"
                                RAM-limit
                                (if (arrayp *track*) "stereo" "mono")
                                (round *sound-srate*)
                                (to-hhmmss limit)
                                (to-hhmmss (get-duration 1)))))
  (let* (;; ratio provides tighter trimming for short selections
         ;; while maintaining reasonable speed for long selections
         (ratio (max 10 (min 200 (round (/ len 100000.0)))))
         (my-srate (/ *sound-srate* ratio))
         (mysound (convert *track* ratio))
         (limits (get-clip-limits))   ; (list start, end) times of audio clips
         (clip-start (if (first limits)
                         (abs-to-relative-time (nth 0 limits))))  ; nil id invalid
         (clip-end (if (second limits)
                       (abs-to-relative-time (nth 1 limits)))))  ; nil if invalid 
    ;loop through samples and mark start and end
    (setf result (find-sil mysound clip-start clip-end))
    (let ((start (if clip-start
                     (max clip-start
                          (- (/ (first result) my-srate) min-start-silence))
                      0))
          (end (if clip-end
                   (min (+ (- (get-duration 1) (/ (second result) my-srate))
                           min-end-silence)
                        clip-end)
                   (get '*selection* 'end))))
      ;; ensure at least 1 sample remains
      ;; This should never happen.
      (if (>= start end)
        (setq start (- end (/ *sound-srate*))))
      ; trim
      (multichan-expand #'extract-abs start end (cue *track*)))))
4

0 に答える 0