65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
from openai import OpenAI
|
|
import ffmpeg
|
|
import os
|
|
import discord
|
|
import asyncio
|
|
import textwrap
|
|
import configparser
|
|
from pathlib import Path
|
|
|
|
Path("temp/").mkdir(parents=True, exist_ok=True)
|
|
|
|
config = configparser.ConfigParser()
|
|
config.read('config.ini')
|
|
|
|
openai = OpenAI(api_key=config['DEFAULT']['OpenAIKey']) # initiate with your openai key
|
|
allowed_senders = config['DEFAULT']['AllowedDiscordSenders'].split(',') # list of allowed Discord accounts
|
|
allowed_channel_names = config['DEFAULT']['AllowedDiscordChannels'].split(',') # allowed channel names
|
|
|
|
|
|
class TranscribeClient(discord.Client):
|
|
async def on_ready(self):
|
|
print(f'Logged on as {self.user}!')
|
|
|
|
async def on_message(self, message):
|
|
# check if message should be processed and has attachment
|
|
if str(message.author) in allowed_senders and str(message.channel) in allowed_channel_names:
|
|
if len(message.attachments) < 1:
|
|
return
|
|
|
|
for attachment in message.attachments:
|
|
# has to have audio
|
|
if attachment.content_type.split('/')[0] not in ['audio', 'video']:
|
|
continue
|
|
|
|
await attachment.save('temp/in')
|
|
|
|
# convert to mp3
|
|
input = ffmpeg.input('temp/in')
|
|
out = ffmpeg.output(input, 'temp/out.mp3')
|
|
ffmpeg.run(out, overwrite_output=True)
|
|
audio_file = open("temp/out.mp3", "rb")
|
|
|
|
# transcribe using OAI Whisper
|
|
transcript = openai.audio.transcriptions.create(model="whisper-1", file=audio_file)
|
|
|
|
text = transcript.text
|
|
|
|
# respond with the transcription
|
|
await message.channel.send(f'**{attachment.filename}:**')
|
|
for t in textwrap.wrap(text, 2000):
|
|
await message.channel.send(t)
|
|
return
|
|
|
|
|
|
async def main():
|
|
return
|
|
|
|
|
|
if __name__ == '__main__':
|
|
token = config['DEFAULT']['DiscordToken']
|
|
intents = discord.Intents.default()
|
|
intents.message_content = True
|
|
|
|
client = TranscribeClient(intents=intents)
|
|
client.run(token)
|