Python: Membuat suara bip

98

Saya mencoba untuk membuat program mengeluarkan suara bip. Saya menggunakan mesin jendela. Saya telah melihat http://docs.python.org/library/winsound.html

Tetapi tidak yakin bagaimana saya dapat memprogram ini dengan pemindai kode batang.

Ini kode saya untuk pemindai kode batang serial.

ser = serial.Serial()
ser.baudrate = 9600

#for windows
ser.port = 2 #for COM3

ser.open()
ser.write('hello')
ser.close()

UPDATE: Karena saya mengganggu rekan kerja saya dengan bunyi bip. Bisakah saya mendapatkannya melalui jack audio untuk headphone?

Marc Brigham
sumber
4
Anda ingin pemindai kode batang mengeluarkan suara atau mesin windows yang terhubung juga?
Setheron
mesin jendela. Saya pikir pemindai kode batang akan melakukannya dengan sendirinya
Marc Brigham
10
Re "Perbarui": Ya, ini adalah fakta umum bahwa bunyi bip mengganggu :)
jforberg
2
@CharlieParker karena suara win untuk windows. Cetak "\ a" sebagai gantinya.
noɥʇʎԀʎzɐɹƆ

Jawaban:

149

Di Windows, jika Anda hanya ingin membuat komputer berbunyi bip:

import winsound
frequency = 2500  # Set Frequency To 2500 Hertz
duration = 1000  # Set Duration To 1000 ms == 1 second
winsound.Beep(frequency, duration)

The winsound.Beep()dapat digunakan di mana pun Anda ingin bunyi bip terjadi.

CyanRook
sumber
12
Yang ini rapi:def annoy(): for i in range(1, 10): winsound.Beep(i * 100, 200)
Skurmedel
9
Atau def sos(): for i in range(0, 3): winsound.Beep(2000, 100) for i in range(0, 3): winsound.Beep(2000, 400) for i in range(0, 3): winsound.Beep(2000, 100). Saya mungkin harus kembali bekerja sekarang: D
Skurmedel
1
Pada windows winsound.Beep dilakukan di jendela Sounds.
Jakob Bowyer
Saya menggunakan Mac, tidak dapat menemukan ini di pip repo?
Volatil3
menarik, itu tidak ada di lingkungan anaconda saya ... apakah itu aneh?
Charlie Parker
130

Cara lintas platform untuk melakukannya adalah dengan print('\a'). Ini akan mengirim karakter ASCII Bell ke stdout, dan diharapkan akan menghasilkan bunyi bip (a untuk 'peringatan'). Perhatikan bahwa banyak emulator terminal modern menyediakan opsi untuk mengabaikan karakter bel.

Karena Anda menggunakan Windows, Anda akan senang mendengar bahwa Windows memiliki API Bip sendiri (persiapkan diri Anda) , yang memungkinkan Anda mengirim bip dengan panjang dan nada yang berubah-ubah. Perhatikan bahwa ini adalah solusi khusus Windows, jadi Anda sebaiknya memilih print('\a')kecuali jika Anda benar-benar peduli tentang Hertz dan milidetik.

Beep API diakses melalui modul winsound : http://docs.python.org/library/winsound.html

jforberg.dll
sumber
1
Meskipun dia meminta secara khusus untuk Windows, saya pikir ini adalah solusi yang lebih baik, kecuali jika WinSound API akan kembali ke \ a untuk OS independen. Ada banyak API audio juga
Setheron
2
Terus terang, saya akan menghindari memainkan bip speaker PC sama sekali dalam upaya pemrograman yang serius. Jika dia memang menggunakan Windows, dia mungkin harus mencoba memainkan sinyal "peringatan" default tema sistem sebagai gantinya. Dengan sedikit keberuntungan, sinyal itu dapat diakses melalui paket GUI apa pun yang dia gunakan.
jforberg
1
Jika Anda menggunakan print di aplikasi konsol, pertimbangkan untuk menambahkan end = "" untuk mencegah baris baru setiap kali Anda berbunyi bip.
Tony
2
@jforberg Api untuk itu adalah winsound.MessageBeep yang dapat mengambil MB_ICONASTERISK, MB_ICONEXCLAMATION, MB_ICONHAND, MB_ICONQUESTION, dan MB_OK.
Peter Wood
2
Jika Anda menggunakan Python 3, jangan lupa untuk menggunakan tanda kurung atau Anda akan mendapatkan kesalahan sintaks. Gunakan print ('\ a')
ZorroDeLaArena
28

Linux.

$ apt-get install beep

$ python
>>> os.system("beep -f 555 -l 460")

ATAU

$ beep -f 659 -l 460 -n -f 784 -l 340 -n -f 659 -l 230 -n -f 659 -l 110 -n -f 880 -l 230 -n -f 659 -l 230 -n -f 587 -l 230 -n -f 659 -l 460 -n -f 988 -l 340 -n -f 659 -l 230 -n -f 659 -l 110 -n -f 1047-l 230 -n -f 988 -l 230 -n -f 784 -l 230 -n -f 659 -l 230 -n -f 988 -l 230 -n -f 1318 -l 230 -n -f 659 -l 110 -n -f 587 -l 230 -n -f 587 -l 110 -n -f 494 -l 230 -n -f 740 -l 230 -n -f 659 -l 460

sumber
12
Diturunkan karena dua alasan: pertama, GNU / Linux! = Debian dan apt-get tidak universal; kedua, Anda sebaiknya tidak menggunakan os.system, gunakan modul subprocess sebagai gantinya.
Ben
1
Sebagai pengguna linux yang mencoba untuk mendapatkan bunyi bip yang sederhana dan murah ketika kode yang panjang selesai, sejauh ini ini adalah solusi termudah. Saya sangat menyukai jingle kecil! Perhatikan bahwa Anda mungkin harus memanggil "sudo modprobe pcspkr" dan memasang bip sebelum opsi ini berfungsi, menurut askubuntu.com/questions/19906/beep-in-shell-script-not-working
John Haberstroh
5
os.systembaik-baik saja, terutama dengan nilai hardcode, tidak semua orang membuat webserver.
cz
salah ketik -f 1047-l, seharusnya -f 1047 -l, ruang hilang
bartekbrak
@Ben Pertanyaan lama, tapi selanjutnya tampaknya cukup kasar untuk meremehkan ini. Pertanyaannya terkait dengan area tanpa solusi lintas platform seperti yang saya pahami. Jawaban yang diterima dengan 140 suka adalah khusus Windows. Dan Anda tidak menjelaskan mengapa modul yang sah merupakan praktik yang "buruk".
geotheory
17

Saya sedang mencari yang sama tetapi untuk shell Linux.

Topik itu membawa saya pada sebuah jawaban, -terima kasih-

Mungkin cara yang lebih pythonic:

import os
beep = lambda x: os.system("echo -n '\a';sleep 0.2;" * x)
beep(3)

Catatan:

  • nilai tidur (di sini 0,2), tergantung pada panjang (detik) bunyi bip default Anda
  • Saya memilih untuk menggunakan os.systemdaripada subprocess.Popenuntuk kesederhanaan (bisa jadi buruk)
  • '-n' untuk echotidak memiliki tampilan lagi
  • yang terakhir ';' setelah sleepdiperlukan untuk urutan teks yang dihasilkan (* x)
  • juga diuji melalui ssh pada istilah X.
s4mdf0o1
sumber
3
Python memiliki padanan untuk keduanya echo( print) dan sleep, jadi sebenarnya bukan pythonic untuk melakukan panggilan eksternal, terutama ketika mereka adalah panggilan Unix (non-portabel).
Eric O Lebigot
apa artinya (3)?
bumbumpaw
9

Ada jawaban Windows, dan jawaban Debian, jadi inilah jawaban Mac :

Ini mengasumsikan Anda hanya di sini mencari cara cepat untuk membuat suara peringatan yang dapat disesuaikan, dan bukan secara khusus bip piezeoelektrik yang Anda dapatkan di Windows:

os.system( "say beep" )

Penafian: Anda dapat mengganti os.systemdengan panggilan ke subprocessmodul jika Anda khawatir seseorang meretas kode bip Anda.

Lihat: Cara membuat bunyi bip perangkat keras di Mac OS X 10.6

cz
sumber
6

Cara lintas platform:

import time
import sys
for i in range(1,6):
    sys.stdout.write('\r\a{i}'.format(i=i))
    sys.stdout.flush()
    time.sleep(1)
sys.stdout.write('\n')
FooBar167
sumber
5
Satu-satunya bagian penting dari ini adalahsys.stdout.write('\a')
jstrieb
2
@jstrieb - ini adalah program kecil yang berdiri sendiri. Pentingnya dalam kelengkapan itu sendiri.
FooBar167
Ini tidak berfungsi di notebook jupyter
Yatin
4

Saya telah membuat paket untuk tujuan itu.

Anda bisa menggunakannya seperti ini:

from pybeep.pybeep import PyVibrate, PyBeep
PyVibrate().beep()
PyVibrate().beepn(3)
PyBeep().beep()
PyBeep().beepn(3)

Itu tergantung pada sox dan hanya mendukung python3.

qed
sumber
1
Coba pip3 instal pybeep.
qed
1
Ketahuilah bahwa Anda harus menginstal sox. jalankan: brew install sox
Jam M. Hernandez Q.
3

Menggunakan pygamedi platform apa pun

Keuntungan menggunakan pygameadalah dapat dibuat untuk bekerja pada semua platform OS. Kode contoh di bawah ini adalah untuk GNU / Linux .

Pertama instal pygamemodul python3seperti yang dijelaskan secara detail di sini .

$ sudo pip3 install pygame

The pygamemodul dapat bermain .wavdan .oggfile dari lokasi file. Berikut ini contohnya:

#!/usr/bin/env python3
import pygame
pygame.mixer.init()
sound = pygame.mixer.Sound('/usr/share/sounds/freedesktop/stereo/phone-incoming-call.oga')
sound.play()
Serge Stroobandt
sumber
0

Di linux: print('\007') akan membuat bel sistem berbunyi.

Rodrigo
sumber