J2897 icon

Bitcoin Price TTS

J2897 | PRO | 01/24/24 06:16:25 AM UTC (Edited) | 0 ⭐ | 1153 👁️ | Never ⏰ | []
Python |

4.19 KB

|

None

|

0 👍

/

0 👎

import requests
import pyttsx3
import time
import logging
 
"""
Bitcoin Price TTS
 
This script continuously fetches the current Bitcoin price from the Binance public API and announces it
using text-to-speech with a feminine voice. The RateLimiter class controls the request rate to adhere
to any rate limits imposed by the API.
 
To run this script, be sure to install the required modules:
 
    1. requests: Used for making HTTP requests.
       Install with: pip install requests
 
    2. pyttsx3: Text-to-speech library for Python.
       Install with: pip install pyttsx3
 
Author: J2897 with help from ChatGPT.
"""
 
sleep_time = 30   # Adjust the sleep time as needed
segmented = True  # Only say the price in $10 segments (less specific, but quieter during low volatility).
 
# Set up logging configuration to exclude INFO messages
logging.basicConfig(level=logging.WARNING)
 
class RateLimiter:
    def __init__(self, rate_limit):
        """
        Initializes the RateLimiter with a specified rate limit.
        :param rate_limit: The time interval (in seconds) between consecutive requests.
        """
        self.rate_limit = rate_limit
        self.last_request_time = 0
    def wait(self):
        """
        Enforces rate limiting by pausing the execution if the time since the last request
        is less than the specified rate limit.
        """
        current_time = time.time()
        time_since_last_request = current_time - self.last_request_time
        if time_since_last_request < self.rate_limit:
            time.sleep(self.rate_limit - time_since_last_request)
        self.last_request_time = time.time()
 
def get_bitcoin_price(rate_limiter):
    """
    Fetches the current Bitcoin price from the Binance public API.
    :param rate_limiter: An instance of the RateLimiter class to control the request rate.
    :return: The current Bitcoin price or None if an error occurs.
    """
    symbol = "BTCUSDT"
    binance_api_url = f"https://api.binance.com/api/v3/ticker/price?symbol={symbol}"
    try:
        # Enforce rate limiting
        rate_limiter.wait()
        response = requests.get(binance_api_url)
        response.raise_for_status()  # Raise an HTTPError for bad responses
        data = response.json()
        # Check if the response contains the required data
        if 'symbol' in data and 'price' in data:
            return float(data['price'])
        else:
            logging.ERROR("Unexpected data structure in the Binance ticker response.")
            return None
    except requests.exceptions.RequestException as err:
        logging.ERROR(f"Request failed: {err}")
        return None
 
def speak_price(price, voice_index=0):
    """
    Announces the Bitcoin price using text-to-speech.
    :param price: The Bitcoin price to be announced.
    :param voice_index: Index of the voice (default is 1, often a female voice).
    """
    engine = pyttsx3.init()
    voices = engine.getProperty('voices')
    if 0 <= voice_index < len(voices):
        engine.setProperty('voice', voices[voice_index].id)
    else:
        logging.WARNING("Invalid voice index. Using the default voice.")
    price_str = f"{int(price)}"
    engine.say(price_str)
    engine.runAndWait()
 
def main():
    """
    Main function to continuously fetch and announce the Bitcoin price.
    """
    rate_limiter = RateLimiter(rate_limit=1)  # Set a rate limit of 1 second for Binance
    last_price = get_bitcoin_price(rate_limiter)  # Update last_price for the first iteration
    while True:
        current_price = get_bitcoin_price(rate_limiter)
        if current_price is not None:
            current_price_seg = int(current_price / 10)
            last_price_seg = int(last_price / 10)
            print(f"The current Bitcoin price is ${current_price:.2f}")
            if segmented:
                if current_price_seg != last_price_seg:
                    speak_price(current_price_seg * 10, voice_index=0)
            else:
                speak_price(current_price, voice_index=1)
            last_price = current_price  # Update last_price for the next iteration
        time.sleep(sleep_time)
 
if __name__ == "__main__":
    main()
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎