見出し画像

可愛すぎかよ! ハッカーの新しい相棒 コマンドラインからLLMを使えるgptme

こういうのが欲しかったんだよ。マジで。
コマンドラインからLLMを呼び出せるgptmeというツールがアツい

これは、gptmeコマンドを追加するというもの。
環境変数としてOPENAI_API_KEYとかAnthropicのキーとかを設定しておくと勝手にAPIを呼び出してくれる。もちろん、クラウドに送信するとかけしからんという勢にはローカルLLMでも対応できる。

こいつはコマンドライン版ChatGPTのようなものなので、コマンドラインで動くのだが、その真価は例えばパイプで繋いだ時とかに発揮される。

$ du -d 1|gptme "一番容量を食ってるフォル ダは何Gバイト使ってんの?"

Found OpenAI API key, using OpenAI provider
[10:13:32] No model specified, using recommended model for provider: gpt-4o     
           Using logdir /Users/shi3z/Library/Application                        
           Support/gptme/logs/2024-10-05-singing-pink-unicorn                   
           Using workspace at /Users/shi3z                                      
System: 
```stdin                                                                        
11000   ./v1                                                                    
64  ./.config                                                                   
51344   ./Music                                                                 
3031336 ./.cursor                                                               
8   ./insta360                                                                  
30720   ./chromedriver-mac-arm64                                                
28168   ./.docker                                                               
26152   ./nltk_data                                                             
90040   ./xlsからpptx                                                           
298528  ./.haystack-editor                                                      
0   ./.plastic4                                                                 
0   ./.thumbnails                                                               
3291128 ./Creative Cloud Files Personal Account [email protected] 06A2759650641
0   ./aiderdemo                                                                 
8101112 ./ardemo                                                                
757408  ./.local                                                                
23679880    ./projects                                                          
1773446968  ./Pictures                                                          
2020696 ./.bun                                                                  
3646496 ./My project                                                            
73400   ./junk                                                                  
1544    ./.ipython                                                              
228673024   ./Library                                                           
672 ./.matplotlib                                                               
296 ./.sonic-pi                                                                 
2522840 ./My project (1)                                                        
75248   ./.quicklisp                                                            
3096280 ./esp32                                                                 
304336  ./.cargo                                                                
3972960 ./.espressif                                                            
8   ./.cups                                                                     
32  ./.bash_sessions                                                            
48616   ./.wdm                                                                  
0   ./Public                                                                    
3512    ./AI                                                                    
2387104 ./.rustup                                                               
104 ./.ssh                                                                      
2864490672  ./Movies                                                            
4264    ./Applications                                                          
47312   ./.opennsfw2                                                            
9384    ./.degit                                                                
8   ./.ipynb_checkpoints                                                        
8   ./.jupyter                                                                  
8   ./.keras                                                                    
0   ./.aider                                                                    
1088456 ./.npm                                                                  
582072  ./chrome-mac-arm64                                                      
16060168    ./.pyenv                                                            
2082440 ./.vscode                                                               
1528    ./.cursor-tutor                                                         
1230280 ./.insightface                                                          
695352704   ./iCloud Drive(アーカイブ)                                        
0   ./.swiftpm                                                                  
696760  ./data                                                                  
640757360   ./Downloads                                                         
253655720   ./.cache                                                            
8   ./.ndi                                                                      
90107200    ./.ollama                                                           
856 ./.zsh_sessions                                                             
564955584   ./git                                                               
8   ./.conda                                                                    
3488    ./.slime                                                                
24165008    ./miniconda3                                                        
7215461224  .
```
Skipped 1 hidden system messages, show with --show-hidden
--- ^^^ past messages ^^^ ---
User: 一番容量を食ってるフォル ダは何Gバイト使ってんの?
Assistant: 一番容量を食っているフォルダは `Movies` で、容量は 2,864,490,672 バイトです。これをギガバイトに換算すると、約 2,664.5 GB です。                      
User:                                                     

プログラムの改造も簡単に命令できる。リダイレクトを使えばいい。

$ cat recog.py|gptme transcribeの時間を計測して表示しろ

Found OpenAI API key, using OpenAI provider
[10:13:24] No model specified, using recommended model for provider: gpt-4o                    
           Using logdir /Users/shi3z/Library/Application                                       
           Support/gptme/logs/2024-10-05-jumping-sad-robot                                     
           Using workspace at /Users/shi3z/projects/speech                                     
System: 
```stdin                                                                                       
import pyaudio                                                                                 
import numpy as np                                                                             
import mlx_whisper                                                                             
                                                                                               
# 音声キャプチャの設定                                                                         
FORMAT = pyaudio.paInt16                                                                       
CHANNELS = 1                                                                                   
RATE = 16000                                                                                   
CHUNK = 1024*2  # 5秒間の音声をキャプチャ                                                      
                                                                                               
# PyAudioの初期化                                                                              
audio = pyaudio.PyAudio()                                                                      
                                                                                               
# ストリームの開始                                                                             
stream = audio.open(format=FORMAT,                                                             
                    channels=CHANNELS,                                                         
                    rate=RATE,                                                                 
                    input=True,                                                                
                    frames_per_buffer=CHUNK)                                                   
                                                                                               
try:                                                                                           
    buffer=[]                                                                                  
    print("開始")                                                                              
    while True:                                                                                
        # 音声データを取得                                                                     
        try:                                                                                   
            data = stream.read(CHUNK, exception_on_overflow=False)                             
            data = np.frombuffer(data, dtype=np.int16)/32768.0                                 
            buffer.append(data)                                                                
                                                                                               
            if len(buffer)>30:                                                                 
                data = np.array(buffer)                                                        
                # NumPy配列に変換                                                              
                audio_data = data.reshape(data.shape[0]*data.shape[1])                         
                print("認識中")                                                                
                print(audio_data)                                                              
                                                                                               
                # 音声データを転写                                                             
                result = mlx_whisper.transcribe(audio_data,language="ja",                      
                                                path_or_hf_repo="mlx-community/whisper-large-v3
                print(result['text'])                                                          
                buffer=[]                                                                      
                print("音声データ収集中")                                                      
        except Exception as e:                                                                 
            print(e)                                                                           
            pass                                                                               
                                                                                               
                                                                                               
except KeyboardInterrupt:                                                                      
    print("音声認識を終了します。")                                                            
                                                                                               
finally:                                                                                       
    # ストリームの停止と終了                                                                   
    stream.stop_stream()                                                                       
    stream.close()                                                                             
    audio.terminate()
```
Skipped 1 hidden system messages, show with --show-hidden
--- ^^^ past messages ^^^ ---
User: 
transcribeの時間を計測して表示

しろ
Assistant: To measure and display the time taken for the `transcribe` function, we can use the `time` module in Python. We'll record the time just before calling the `transcribe` function and then again immediately after it returns. The difference will give us the duration of the transcription process.

Let's modify the code to include this timing functionality:

```python
import pyaudio
import numpy as np
import mlx_whisper
import time  # Import the time module

# 音声キャプチャの設定
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
CHUNK = 1024*2  # 5秒間の音声をキャプチャ

# PyAudioの初期化
audio = pyaudio.PyAudio()

# ストリームの開始
stream = audio.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)

try:
    buffer=[]
    print("開始")
    while True:
        # 音声データを取得
        try:
            data = stream.read(CHUNK, exception_on_overflow=False)
            data = np.frombuffer(data, dtype=np.int16)/32768.0
            buffer.append(data)

            if len(buffer)>30:
                data = np.array(buffer)
                # NumPy配列に変換
                audio_data = data.reshape(data.shape[0]*data.shape[1])
                print("認識中")
                print(audio_data)

                # Measure the time taken for transcription
                start_time = time.time()  # Start time
                result = mlx_whisper.transcribe(audio_data, language="ja",
                                                path_or_hf_repo="mlx-community/whisper-large-v3-turbo")
                end_time = time.time()  # End time

                # Calculate and print the duration
                duration = end_time - start_time
                print(f"Transcription took {duration:.2f} seconds")

                print(result['text'])
                buffer=[]
                print("音声データ収集中")
        except Exception as e:
            print(e)
            pass

except KeyboardInterrupt:
    print("音声認識を終了します。")

finally:
    # ストリームの停止と終了
    stream.stop_stream()
    stream.close()
    audio.terminate()
```

This code will now print the time taken for each transcription in seconds.  

すると音声認識の時間が表示される。

認識中
[-0.01153564 -0.00827026 -0.00796509 ...  0.00320435  0.01583862
  0.01443481]
こんにちは、お疲れ様です。
Transcription time: 0.44 seconds

さすがM2 Max。音声認識も速い。

gptme、嬉しすぎる。頼りになる相棒。にくいあんちくししょう。
ログインできる全ての環境に入れておきたい。ラズパイでも動くし。そこが凄いよなあ