JES có hỗ trợ cơ bản cho chỉnh sửa âm thanh, nhưng bạn có thể sử dụng nó để thực hiện một số tác vụ hữu ích.
JES là chương trình cho phép bạn sửa đổi hình ảnh, âm thanh và video theo chương trình. JES có nhiều hàm tích hợp và công cụ sửa lỗi để giúp bạn học ngôn ngữ Jython.
Khi nhập một tệp bằng JES, bạn có thể kiểm tra sóng âm thanh của nó một cách trực quan bằng cách sử dụng một cửa sổ riêng. Bạn cũng có thể thao tác các giá trị biên độ của các sóng âm này tại các điểm cụ thể. Điều này có thể giúp bạn chỉnh sửa tệp âm thanh để đạt được các hiệu ứng khác nhau.
Cách thay đổi âm lượng của clip âm thanh
Khi bạn hiển thị một hình ảnh trong JES, bạn có thể truy cập các pixel riêng lẻ chứa trong đó. Bạn có thể đạt được một số kỹ thuật xử lý hình ảnh nhất định bằng cách chỉnh sửa các giá trị màu đỏ, lục và lam cho mỗi pixel.
Tương tự, một tệp âm thanh chứa nhiều “mẫu” riêng lẻ là những mẩu dữ liệu âm thanh nhỏ. Bạn có thể chỉnh sửa âm thanh đã nhập bằng cách thay đổi giá trị biên độ ở mỗi mẫu.
Mã được sử dụng trong dự án này có sẵn trong repo GitHub này theo giấy phép MIT.
- Mở ứng dụng JES trên máy tính của bạn.
- Tạo một hàm mới có tên là changeVolume(), lấy âm lượng mà bạn muốn thay đổi thành đầu vào:
def changeVolume(vol):
- Bên trong chức năng, mở lời nhắc để yêu cầu người dùng chọn tệp âm thanh hợp lệ. Mặc dù JES không tương thích với các tệp mp3 nhưng bạn vẫn có thể nhập các tệp WAV. Thêm một số xác thực để đảm bảo tệp tương thích:
file = pickAFile()
if file != None and file.endswith(".wav"):
else:
print("Invalid file selected. Please choose a valid WAV file.") - Nếu tệp đã chọn hợp lệ, hãy tạo một đối tượng âm thanh từ tệp đó:
sound = makeSound(file)
- Lặp lại từng mẫu âm thanh:
for i in range(0, getLength(sound)):
- Kiểm tra xem người dùng đã vượt qua chưa hướng lên vào chức năng tăng âm lượng to hơn. Nếu vậy, hãy lấy giá trị mẫu tại chỉ mục đó bằng cách sử dụng hàm getSampleValueAt() tích hợp sẵn. Tăng âm lượng bằng cách nhân đôi biên độ và sử dụng setSampleValueAt() để đặt giá trị mới:
if vol == 'up':
sampleVal = getSampleValueAt(sound, i)
setSampleValueAt(sound, i, sampleVal * 2) - Kiểm tra xem người dùng đã vượt qua chưa xuống vào chức năng để làm cho âm lượng mềm hơn. Nếu vậy, hãy lấy giá trị mẫu tại chỉ mục đó và thay vào đó chia cho 2 để giảm biên độ:
if vol == 'down':
sampleVal = getSampleValueAt(sound, i)
setSampleValueAt(sound, i, sampleVal / 2) - Sử dụng hàm explorer() để mở cửa sổ thám hiểm cho âm thanh:
explore(sound)
- bấm vào Tải chương trình nút, nằm giữa khu vực lập trình và dòng lệnh. Lưu tệp nếu được nhắc:
- Chạy hàm changeVolume() trên dòng lệnh, chuyển “up” làm đối số cho hàm:
changeVolume("up")
- Sử dụng cửa sổ trình khám phá tệp, điều hướng đến tệp âm thanh hợp lệ:
- bấm vào Phát toàn bộ âm thanh nút sử dụng cửa sổ mới:
- Trong dòng lệnh, hãy chạy lại hàm changeVolume() với giá trị “down” làm đối số và chọn một tệp:
changeVolume("down")
- Trong cửa sổ thám hiểm, bạn sẽ thấy sóng âm thanh nhỏ hơn. bấm vào Phát toàn bộ âm thanh nút sử dụng cửa sổ mới:
Cách đảo ngược clip âm thanh
Bạn có thể đảo ngược âm thanh bằng cách tạo một âm thanh trống mới và sao chép từng mẫu của âm thanh gốc sang âm thanh mới theo thứ tự ngược lại.
- Trong một chức năng mới, nhắc người dùng chọn tệp WAV và kiểm tra xem tệp đó có hợp lệ không:
def reverseSound():
file = pickAFile()
if file != None and file.endswith(".wav"):
else:
print("Invalid file selected. Please choose a valid WAV file.") - Tạo một đối tượng âm thanh mới từ tệp đã chọn:
sound = makeSound(file)
- Sử dụng hàm makeEmptySound() tích hợp sẵn để tạo một đối tượng âm thanh trống mới. Điều này sẽ bao gồm cùng một số mẫu như âm thanh gốc. Giá trị biên độ cho mỗi mẫu sẽ là 0:
newReversedSound = makeEmptySound(getLength(sound))
- Lặp lại từng mẫu của đối tượng âm thanh trống mới:
for i in range(0, getLength(newReversedSound)):
- Đối với mỗi mẫu tại điểm đó, hãy lấy mẫu ở đầu đối diện của âm thanh. Ví dụ: nếu độ dài mẫu là 100 và chỉ mục hiện tại là 0, giá trị này sẽ nhận giá trị mẫu ở chỉ mục 99. Tương tự, nếu chỉ mục hiện tại là 3, giá trị này sẽ nhận giá trị mẫu ở chỉ mục 96:
sampleVal = getSampleValueAt(sound, getLength(sound) - 1 - i)
- Sao chép giá trị mẫu từ đầu kia của âm thanh sang chỉ mục hiện tại của âm thanh mới:
setSampleValueAt(newReversedSound, i, sampleVal)
- Khám phá âm thanh đảo ngược mới. Bạn cũng có thể khám phá âm thanh gốc để so sánh:
explore(sound)
explore(newReversedSound) - bấm vào Tải chương trình nút, nằm giữa khu vực lập trình và dòng lệnh. Lưu tệp nếu được nhắc.
- Chạy chức năng bằng dòng lệnh:
reverseSound()
- Xem âm thanh gốc và âm thanh đảo ngược bằng cửa sổ thám hiểm. bấm vào Phát toàn bộ âm thanh nút để nghe sự khác biệt:
Cách nối hai đoạn âm thanh lại với nhau
Để nối hai đoạn âm thanh lại với nhau, bạn có thể yêu cầu người dùng chọn hai tệp WAV riêng biệt. Sao chép từng mẫu của cả hai âm thanh vào đối tượng âm thanh mới.
- Tạo một hàm mới gọi là joinSounds():
def joinSounds():
- Sử dụng hàm pickAFile() để nhắc người dùng chọn tệp đầu tiên. Nếu nó không hợp lệ, in một thông báo lỗi:
file1 = pickAFile()
if file1 == None or not file1.endswith(".wav"):
print("Invalid file selected. Please choose a valid WAV file.") - Sử dụng lại hàm pickAFile() để yêu cầu người dùng cung cấp tệp âm thanh hợp lệ thứ hai:
file2 = pickAFile()
if file2 == None or not file2.endswith(".wav"):
print("Invalid file selected. Please choose a valid WAV file.") - Tạo hai đối tượng âm thanh từ hai tệp âm thanh đã chọn:
sound1 = makeSound(file1)
sound2 = makeSound(file2) - Cộng độ dài của hai âm lại với nhau để tính độ dài của âm mới ghép. Tạo một đối tượng âm thanh trống mới bằng độ dài:
newSoundLength = getLength(sound1) + getLength(sound2)
joinedSound = makeEmptySound(newSoundLength) - Lặp lại từng mẫu của âm thanh đầu tiên. Sao chép giá trị mẫu tại mỗi chỉ mục vào âm thanh mới:
for i in range(0, getLength(sound1)):
sampleVal = getSampleValueAt(sound1, i)
setSampleValueAt(joinedSound, i, sampleVal) - Lặp lại từng mẫu của âm thanh thứ hai. Sao chép giá trị mẫu tại mỗi chỉ số vào âm thanh mới, sau âm thanh đầu tiên:
for i in range(0, getLength(sound2)):
sampleVal = getSampleValueAt(sound2, i)
endOfFirstSound = getLength(sound1) - 1
setSampleValueAt(joinedSound, endOfFirstSound + i, sampleVal) - Khám phá âm thanh bằng hàm explorer():
explore(joinedSound)
- bấm vào Tải chương trình nút, nằm giữa khu vực lập trình và dòng lệnh. Lưu tệp nếu được nhắc.
- Chạy chức năng bằng dòng lệnh:
joinSounds()
- Xem âm thanh đã nối bằng cửa sổ mới và nhấp vào Phát toàn bộ âm thanh nút để nghe âm thanh:
Nhập và chỉnh sửa tệp âm thanh bằng JES
Bây giờ bạn đã hiểu cách nhập tệp âm thanh và chỉnh sửa chúng bằng JES. Có rất nhiều chức năng tích hợp sẵn khác mà JES cung cấp, cho phép bạn thực hiện chỉnh sửa âm thanh nâng cao hơn nữa.
Bạn có thể tìm hiểu thêm về các chức năng khác có sẵn bằng cách sử dụng cửa sổ trợ giúp của JES.