Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

error while not talking #9

Open
MissCoco01 opened this issue Apr 30, 2024 · 2 comments
Open

error while not talking #9

MissCoco01 opened this issue Apr 30, 2024 · 2 comments

Comments

@MissCoco01
Copy link

Hi, I'm encountering an error when I run the code. If I don't start talking immediately after running the code, I get an error. Additionally, when I run the code and begin speaking, if I stay quiet for a short period, I encounter the same error.

RuntimeError: Task <Task pending name='Task-30' coro=<AsyncLiveClient.send() running at C:\Python\Python310\lib\site-packages\deepgram\clients\live\v1\async_client.py:179> cb=[_run_until_complete_cb() at C:\Python\Python310\lib\asyncio\base_events.py:184]> got Future attached to a different loop

is it because of this line 'dg_connection = deepgram.listen.asynclive.v("1")'

any help pls!!!

@fluransco
Copy link

same problem here

@fluransco
Copy link

finally fixed the problem

although, this version of code is not the real time streaming
also does not use async
import os
import subprocess
import time
import aiohttp
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_groq import ChatGroq
import pyaudio
import sounddevice as sd
import numpy as np
import requests
import shutil
from deepgram import (
DeepgramClient,
DeepgramClientOptions,
LiveTranscriptionEvents,
LiveOptions,
Microphone,
SpeakOptions,
)

from LiminaliaBot import deepgramSpeak
import wave

load_dotenv()

class TranscriptCollector:
def init(self):
self.reset()

def reset(self):
    self.transcript_parts = []

def add_part(self, part):
    self.transcript_parts.append(part)

def get_full_transcript(self):
    return ' '.join(self.transcript_parts)

transcript_collector = TranscriptCollector()

def get_transcript():
try:
config = DeepgramClientOptions(options={"keepalive": "true"})
deepgram: DeepgramClient = DeepgramClient("", config)

    dg_connection = deepgram.listen.live.v("1")

    def on_message(self, result, **kwargs):
        sentence = result.channel.alternatives[0].transcript

        if not result.speech_final:
            transcript_collector.add_part(sentence)
        else:
            # This is the final part of the current sentence
            transcript_collector.add_part(sentence)
            full_sentence = transcript_collector.get_full_transcript()
            print(f"speaker: {full_sentence}")

            # Check if the full sentence is empty
            if not full_sentence.strip():
                # Reset the collector for the next sentence
                transcript_collector.reset()
            else:
                process_llm(full_sentence)
                # Reset the collector for the next sentence
                transcript_collector.reset()

    def on_error(self, error, **kwargs):
        print(f"\n\n{error}\n\n")

    dg_connection.on(LiveTranscriptionEvents.Transcript, on_message)
    dg_connection.on(LiveTranscriptionEvents.Error, on_error)

    options: LiveOptions = LiveOptions(
        model="nova-2",
        language="en-US",
        # Apply smart formatting to the output
        smart_format=True,
        # Raw audio format details
        encoding="linear16",
        channels=1,
        sample_rate=16000,
        # Time in milliseconds of silence to wait for before finalizing speech
        endpointing=1200,
    )

    dg_connection.start(options)

    # Open a microphone stream on the selected input device
    microphone = Microphone(dg_connection.send)

    # Start microphone
    microphone.start()
    print("listening...")

    while True:
        if not microphone.is_active():
            print("idle zzZ")
            break
        time.sleep(1)

    # Wait for the microphone to close
    microphone.finish()

    # Indicate that we've finished
    dg_connection.finish()

    print("Finished")

except Exception as e:
    print(f"Could not open socket: {e}")
    return

def deepgramSpeak(text):
SPEAK_OPTIONS = {"text": text}
filename = "output.wav"

try:
    # Create a Deepgram client
    deepgram = DeepgramClient(api_key=os.getenv("DEEPGRAM_API_KEY"))

    # Configure the options
    options = SpeakOptions(
        model="aura-asteria-en",
        encoding="linear16",
        container="wav"
    )

    # Call the save method on the speak property
    response = deepgram.speak.v("1").save(filename, SPEAK_OPTIONS, options)

    # Play the audio using PyAudio
    wf = wave.open(filename, 'rb')
    p = pyaudio.PyAudio()
    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)
    data = wf.readframes(1024)
    while data:
        stream.write(data)
        data = wf.readframes(1024)

    stream.stop_stream()
    stream.close()
    p.terminate()
    wf.close()

    # Delete the WAV file
    os.remove(filename)

except Exception as e:
    print(f"Exception: {e}")

def process_llm(transcript):
chat = ChatGroq(temperature=1, model_name="llama3-8b-8192")
prompt = ChatPromptTemplate.from_messages([("human",
"You are a conversational assistant named Limina. Use short, conversational responses as if you're having a live conversation. Your response should be under 20 words. Do not respond with any code, only conversation {transcript}")])
chain = prompt | chat
result = chain.invoke({"transcript": transcript})
print(result.content)
response = result.content
deepgramSpeak(response)

if name == "main":
get_transcript()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants